当前位置: 首页 > 知识库问答 >
问题:

为什么GCC包含一个“空”异或

李开宇
2023-03-14
typedef struct {
        int x;
        int y;
        int z;
        int w;
} s32x4;

s32x4
f() {
        s32x4 v;
        v.x = 0

        return v;
}
f:
        xor     eax, eax
        xor     edx, edx          ; this line is questionable
        ret
f:                                      # @f
        xor     eax, eax
        ret
  • 为什么gcc在那里插入异或
  • 如果没有一个好的理由:我能用什么方法摆脱它吗?
  • 如果您想使用以下示例:https://godbolt.org/z/74ycy63se

共有1个答案

贺波
2023-03-14

您读取一个部分未初始化的struct对象来返回它,即使调用方没有使用返回值,这也是(有争议的)未定义的行为。

在x86-64 System V ABI中,16字节的结构以rdx:rax返回(任何更大的结构,都可以通过调用方传递一个指向返回值对象的指针来返回)。GCC将未初始化的部分清零,clang将所有垃圾留在那里。

GCC喜欢在任何可能存在将虚假依赖项耦合到某项中的风险时打破依赖项。(例如,在使用设计错误的CVTSI2SD xmm0,EAX之前,使用PXOR xmm0,xmm0)。Clang更“激进”地将其排除在外,有时甚至在这样做只会带来很小的代码大小好处时也是如此,例如,使用mov al,1而不是mov eax,1,或者使用mov al,[rdi]而不是movzx eax,byte ptr[rdi])

您所看到的最简单的形式是返回未初始化的纯int
GCC和clang code-gen之间有相同的区别:

int foo(){
    int x;
    return x;
}

(天啊)

# clang 11.0.1 -O2
foo:
        # leaving EAX unwritten
        ret


# GCC 10.2 -O2
foo:
        xor     eax, eax        # return 0
        ret

这里clang“gets to”省略了整个指令。当然,这是未定义的行为(读取未初始化的对象),因此标准允许任何东西,包括ud2(保证会引发非法指令异常),或者在假设该代码路径不可达的情况下省略ret(即永远不会调用该函数)。或者返回0xdeadbeef,或者调用任何其他函数。

 类似资料:
  • 问题内容: 在过去的几周里,我一直在使用AngularJS,而真正困扰我的一件事是,即使尝试了所有置换或http://docs.angularjs.org/api/ng规范中定义的配置,.directive:select,我仍然得到一个空选项作为select元素的第一个子元素。 这是玉: 这里的控制器: 最后,这是生成的HTML: 我需要怎么做才能摆脱它? PS:事情也不需要这样做,但是如果您使用

  • 问题内容: 我正在尝试以编程方式找到Linux上的路径,据我所知,实际上这意味着找到GCC认为的路径。(这是真的吗?Clang是如何做到的?) 根据http://gcc.gnu.org/onlinedocs/cpp/Search- Path.html的 介绍,某些组件涉及CPU架构和GCC版本;后者尤其棘手;我想可以通过运行和解析输出(或)获得它,但这似乎充其量是不佳的,最坏的是它是脆弱的。假设某

  • 问题内容: 当我使用gcc编译非常简单的源文件时,不必指定标准包含文件(例如stdio或stdlib)的路径。 GCC如何知道如何找到这些文件? 它内部是否具有硬连线的路径,还是会从其他OS组件获取路径? 问题答案: 为了弄清楚/ 所使用的默认路径及其优先级,您需要检查以下命令的输出: 对于 C : 对于 C ++ : 这归功于 Qt Creator团队 。

  • 问题内容: 在这里,您可以下载 一个acroform字段的pdf,其大小恰好是427Kb 如果我删除此唯一字段,则文件仅为3Kb,请为什么会发生这种情况?我尝试使用PDF Debugger进行分析,但似乎没有任何异常。 问题答案: 在acroform默认资源中有一个嵌入的“ Arial”字体,请参见Root/AcroForm/DR/Font/Arial/FontDescriptor/FontFil

  • 在这里你可以下载一个acroform字段的pdf,他的大小正好是427KB 如果我删除这个唯一的字段,文件只有3KB,为什么会发生这种情况?我试着用PDF调试器分析,对我来说没有什么奇怪的。

  • 在过去的几周里,我一直在与AngularJS合作,有一件事确实让我感到困扰,那就是即使在尝试了所有的排列或规范中定义的配置之后http://docs.angularjs.org/api/ng.directive:select,我仍然得到一个空选项作为select元素的第一个子元素。 这是翡翠: 这里的控制器: 最后,这里是生成的HTML: 我需要怎么做才能摆脱它? 注意:没有这个东西也可以工作,但