当前位置: 首页 > 知识库问答 >
问题:

使用volatile限定符抑制编译器警告

谭思博
2023-03-14
iteration 2 invokes undefined behavior [-Waggressive-loop-optimizations]
int a[4]={1,2,3,4};
int i;   //when declared volatile int i, doesn't produce warning
i=0;
while(i<5) {
    printf("%d\t", a[i]);    //a[4] will invoke undefined behavior
    i+=2;   
}
  1. 我应该启用哪些确切的gcc标志来获得此警告?
  2. 为什么将i声明为volatile会抑制该警告?

共有1个答案

百里星纬
2023-03-14

当侵略性循环优化看到以下代码时...

int i;
i=0;
while(i<5) {
    printf("%d\t", a[i]);
    i+=2;   
}

...它要用一种叫做“循环展开”的技术来重写成这样...

printf("%d\t", a[0]);
printf("%d\t", a[2]);
printf("%d\t", a[4]);

问题!迭代0和1很好,但迭代2将执行越界数组访问,调用未定义的行为。所以你才得到警告。

 类似资料:
  • 问题内容: 我们总是被教导要确保在switch语句中使用 break 来避免掉线。 Java编译器会针对这些情况发出警告,以帮助我们避免犯小错误(而是严重错误)。 但是,我将案例检查作为功能使用(我们不必在这里进行介绍,但是它提供了一种非常优雅的解决方案)。 但是,编译器会吐出大量警告,这些警告可能会掩盖我需要了解的警告。我知道如何更改编译器以忽略所有掉线警告,但是我想在逐个方法的基础上实施此操作

  • 在我的应用程序中,我有一个由第三方开发的库,不幸的是,它包含相当多的lint和javac警告。我想忽略这两种类型的警告,因为它们无法由我们的团队修复,并且它们会污染我们的构建日志。我尝试将以下内容添加到库build.gradle文件中: 在Android块中 我还在build.gradle文件末尾添加了以下内容: 不幸的是,每当“:compileDebugJavaWithJavac”运行时,它仍然

  • 6. volatile限定符 现在探讨一下编译器优化会对生成的指令产生什么影响,在此基础上介绍C语言的volatile限定符。看下面的例子。 例 19.7. volatile限定符 /* artificial device registers */ unsigned char recv; unsigned char send; /* memory buffer */ unsigned char

  • 我们的开源应用程序以Java 6平台为目标,因此我们使用-source 1.6和-target 1.6选项进行编译,但当使用JDK 7时,我们会收到以下警告消息,例如:。 例如:$javac-source 1.6-target 1.6-test。JAVA 警告:[选项]引导类路径未与-source 1.6一起设置 我们可以通过为我们的机器使用-bootclasspath来解决这个问题,但是我们将我

  • 如果关闭了编译器优化(gcc-o0...),那么说'volatile'关键字没有区别是可以的吗? 我制作了一些示例“C”程序,并且仅当打开编译器优化时,才在生成的汇编代码中看到易失性和非易失性之间的区别,即((gcc-o1....)。

  • 我正在开发一个使用OpenCV和加速的C项目。不幸的是,在编译时,我的编译器从这些库的包含文件中给了我数百个警告。即使有一个空的主函数,没有其他代码,我仍然从包含语句中得到这些警告。我听说这是Qt等其他第三方库的问题。所有伟大的图书馆。如何抑制 MSVC 中的所有第三方警告。 我知道这些解决方案: 在GCC中:#pragma GCC system_header#include“real_3rd_p