我正在构建一个相当复杂的应用程序,使用-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行也应该被标记出来!
非常感谢您的帮助!
2 * sizeof(pinfo_t *)
个pinfo
元素的代码。在所有主要(和许多次要)平台上,sizeof(pinfo_t *)
都大于1,因此它会越界。 - user395760