最近,我将我的项目从gcc 4.3升级到gcc 5.5.之后,我看到后增量运算符中的行为更改导致了我的项目中的问题.我使用全局变量作为控制变量.例如,请考虑以下示例程序:
int i = 0;
int main()
{
int x[10];
x[i++] = 5; ===> culprit
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,值i应该仅在5分配之后递增x[0],以保证x[0]在i递增之前分配有适当的有效值.
现在问题出现了,我看到在移动到gcc 5.5之后,汇编指令已经改变,并且即使在赋值发生之前,i的值也会增加.以上片段的汇编说明:
Dump of assembler code for function main():
6 {
0x0000000000400636 <+0>: push %rbp
0x0000000000400637 <+1>: mov %rsp,%rbp
7 int x[10];
8
9 x[i++] = 1;
0x000000000040063a <+4>: mov 0x200a00(%rip),%eax # 0x601040 <i>
0x0000000000400640 <+10>: lea 0x1(%rax),%edx
0x0000000000400643 <+13>: mov %edx,0x2009f7(%rip) # 0x601040 <i> ====> i gets incremented …Run Code Online (Sandbox Code Playgroud)