为什么gcc不对代码中的未定义行为给出警告
Why does gcc not give a warning at undefined behaviour in code inside?
我刚刚读了这篇关于未定义行为和序列点的c++常见问题解答,并做了一些实验。在下面的代码中,gcc-4.5.2
只在代码注释中提到的行中给我一个警告,虽然之前的一行也显示未定义的行为,不是吗?您不能说哪个加法操作数首先执行(因为+
不是序列点)。为什么gcc没有在这一行也给我一个警告?
int i=0;
int j=0;
int foo(void) {
i=1;
return i;
}
int main(void) {
i = i + foo();
j = j + (j=1); //Here is a rightly warning
return 0;
}
谢谢你的帮助
i = i + foo()的行为;未指定但并非未定义。未定义意味着允许任何可能的行为,甚至中止程序。未指定意味着首先计算i或foo()。是的,foo写入相同的i,但由于它发生在单独的语句中,因此在该存储之前和之后都有一个序列点。
程序中的i = i + foo();
行未指定,但不是未定义。
编译器试图发出没有误报的警告(每次编译器发出警告,都有一个程序员应该修复的缺陷),或者至少具有非常低的误报率。这意味着,作为交换,他们有相当多的假阴性。按照同样的原则,编译器通常不会对未指定的行为发出警告。
要获得有关程序的警告,您应该查看静态分析程序,静态分析程序对警告更积极,但代价是出现更多的误报。静态分析器可以很好地决定对未指定的行为发出警告。他们中的一些甚至对定义的行为发出警告,尽管这些行为已经定义,但表明程序员可能感到困惑。
对于人类来说调用foo()会改变它是可见的,但是对于计算机程序来说很难看到。它的设计不是为了看到这个。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- G++ 编译器未为未定义的方法生成错误/警告
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 链接时突然收到maxrregcount警告和未定义的引用错误
- 关于静态模板化 constexpr 的 Clang 警告(未定义内联函数)
- C 17 GCC编译器为什么会发出有关未定义的警告
- 如果可能存在未定义行为,为什么编译器不警告您?
- 警告:#Warning qopenglfunctions.h与GLEW不兼容,GLEW定义将未定义[-Wcpp]
- GCC警告已声明但未定义的变量
- 可以在编译时警告未定义的行为
- 关于未定义操作的编译器警告
- NVCC/CUDA 3.1 - ghtr-default.h 泛洪"declared static"但未定义的警告
- 如果局部堆栈变量是未定义的行为,为什么编译器会发出有关返回对局部堆栈变量的引用的警告
- 在 H 文件中声明的 C++ 静态数组给出警告"已定义但未使用"
- C++未定义的引用...还有警告:已弃用从字符串常量到 'char*' 的转换