如果您想要检查生成的装配方法,请按照以下步骤操作。
我假设你的两个功能被放入两个文件,a.c
和b.c
:
$ gcc -O0 -S a.c
$ gcc -O0 -S b.c
$ diff a.s b.s
1c1
< .file "a.c"
---
> .file "b.c"
13,14c13,14
< leaq -4(%rbp), %rsi
< leaq -8(%rbp), %rdi
---
> leaq -8(%rbp), %rsi
> leaq -4(%rbp), %rdi
17,18c17,18
< movl -8(%rbp), %edx
< movl -4(%rbp), %eax
---
> movl -4(%rbp), %edx
> movl -8(%rbp), %eax
$
我们把任何优化(-O0),以防止任何优化文物。
所以有点令人惊讶的gcc(4.1.2)的输出是略有不同的这两个功能。但仔细看看这一点,我们可以看到为什么 - 在第一个函数中,b
的声明在a
之前,因此b
在堆栈上的a
以上,但在第二个函数中,它是相反的。
所以,如果我换a
和b
我现在看到生成的组件实际上是相同的:
$ gcc -O0 -S b1.c
$ diff a.s b1.s
1c1
< .file "a.c"
---
> .file "b1.c"
$
另外,如果你只关心生成的程序集是否是不同的,而不是什么生成的程序集实际上是,那么你就可以做到这一切在一个花式schmancy bash命令:
$ diff --brief <(cat a.c | gcc -O0 -S -xc - -o-) <(cat b.c | gcc -O0 -S -xc - -o-)
Files /dev/fd/63 and /dev/fd/62 differ
$ echo $?
1
$ diff --brief <(cat a.c | gcc -O0 -S -xc - -o-) <(cat b1.c | gcc -O0 -S -xc - -o-)
$ echo $?
0
$
检查它是否符合相同的asm? – user2802841
@ user2802841这确实是一个选项。我们必须牢记,它很容易产生假阴性。 – Angew
为了真正证明这些变体是功能上相同的(即做同样的事情),使用回归测试。 –