繁体   English   中英

gcc -O3标志会导致-O2不会发出警告

[英]gcc -O3 flag causes warnings that -O2 doesn't

我正在构建一个相当复杂的应用程序,它使用-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行也没有问题,这也应该被标记!

任何帮助表示赞赏!

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

美元到甜甜圈,编译器完全展开-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);

...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM