3

我正在构建一个相当复杂的应用程序,它构建时没有任何错误/警告-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 行没有问题,应该也被标记了!

任何帮助表示赞赏!

4

2 回答 2

8

Wrt 警告和优化级别,在 GCC 中,在优化传递期间分析代码时会生成一些警告,因此当这些传递未启用时,也不会发出这些警告。这是一个长期存在的问题,但到目前为止,它还没有在任何人的 TODO 列表上传播得足够高。

于 2013-04-30T20:15:57.197 回答
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);

...

然后它会观察到生成的索引超出范围并警告您。

于 2013-04-30T20:34:24.227 回答