避免不良代码,但要清楚它
int badfunc(int *a, int *b)
{
return (*a)+++++(*b);
}
这个代码在GCC中是不能编译通过的,断句之后是这样:(*a)++ + ++(*b),如果a、b不同的话,很好判断,相当于 a + (b+1),如果a、和b引用的是同一个数呢?
可以通过gcc -S选项来查看,主要代码如下:
代码
movl 8(%ebp), %eax
movl (%eax), %eax
movl 12(%ebp), %edx
movl (%edx), %edx
leal 1(%edx), %ecx
movl 12(%ebp), %edx
movl %ecx, (%edx)
movl 12(%ebp), %edx
movl (%edx), %edx
leal (%eax,%edx), %ecx
leal 1(%eax), %edx
movl 8(%ebp), %eax
movl %edx, (%eax)
movl %ecx, %eax
根据C函数调用的机制,b会先进栈,然后是a,首先将a移动到eax寄存器,然后将a指向的整数值移动到eax寄存器,然后用同样的方法将b指向的整数值移动到edx寄存器,然后将b指向的值加1,移动到ecx,将b加载到edx寄存器,然后将ecx中的数据移动到b指向的内存位置(++(*b)),然后再费劲的将b指向的整数值加载到edx,计算调整后的值,并移动到ecx寄存器,然后将a的值加1,并写入原来的位置,然后将ecx寄存器的值放入eax,等待调用函数读取。
由此可以看到,首先会讲a载入寄存器,然后b+1也在寄存器中了,最后结果是:a的值 + (b的值 + 1)。
好吧,其实并不难~~


浙公网安备 33010602011771号