【发布时间】:2013-04-30 20:02:05
【问题描述】:
我正在构建一个相当复杂的应用程序,它使用-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行没有问题,应该也被标记了!
感谢任何帮助!
【问题讨论】:
-
过度匿名。如果我假设 while = for,我会看到不应引发错误的代码。
-
您的 while 循环不正确。了解正在发生的事情的一个好方法是查看为您的 while 循环生成的程序集。
-
@Joshua 我看到一个循环访问
pinfo的2 * sizeof(pinfo_t *)元素。sizeof(pinfo_t *)在所有主要(和许多次要)平台上都大于 1,因此它会超出范围。 -
正如所写,您的问题有很多问题。主题说
-O2,但在正文中你说-O0。然后你问关于注释掉第 6 行的问题。你遇到的真实情况是什么,你想知道什么? -
@Étienne: 是的,它似乎也是假代码......
标签: c optimization gcc compiler-optimization