我正在构建一个相当复杂的应用程序,该应用程序在-O0
没有任何错误/警告的情况下构建。然而,当我尝试-O3
时,我得到了一些令人费解的问题。例如:
1: static pinfo_t* pinfo[2] = { &gv1, &gv2 }; // GLOBAL
2:
3: int i;
4: int x = sizeof(pinfo);
5:
6: for (i = 0; i < x; i ++)
7: if (pinfo[i]->id == NO_ID)
8: printf("%s\n", pinfo[i]->name);
注意编译器(gcc v4.3.2)使用-O0
成功构建了这个(还有O1和O2)。但是使用-O3
,编译器正确地将第7行精确定位为导致错误行的潜在问题:
error: array subscript is above array bounds
足够公平,但是当我在第7行发表评论时,第8行也没有问题,第8行也应该被标记!
感谢任何帮助!
答案 0 :(得分:8)
警告和优化级别,在GCC中,在优化过程中分析代码时会生成一些警告,因此当这些传递未启用时,也不会发出这些警告。这是一个长期存在的问题,但到目前为止它还没有在任何人的TODO列表中传播得足够高。
答案 1 :(得分:2)
美元到甜甜圈,编译器完全展开 -O3 的循环,如:
...
if (pinfo[0]->id == NO_ID)
printf("%s\n", pinfo[0]->name);
if (pinfo[1]->id == NO_ID)
printf("%s\n", pinfo[1]->name);
if (pinfo[2]->id == NO_ID)
printf("%s\n", pinfo[2]->name);
...
然后观察到生成的索引超出界限并警告你。