解引用nullptr时编译器不发出警告
Compiler does not warn when dereferencing nullptr
This:
int* p = nullptr;
auto tmp = *p;
不会导致gcc 4.6和VS2010 sp1发出至少一个警告。在这些编译器中是否有任何选项使它们在这种情况下发出警告?我在VS中使用/w4进行测试编译。
这并不违法,这只是未定义的行为。
对此打开警告可能会导致错误的安全感,因为通常直到运行时才知道某个指针是否指向nullptr
或其他东西。Valgrind可以检查这些错误(以及更多)。
在Visual Studio 2010 SP1(不知道需要哪个版本)中运行代码分析。我刚刚尝试了你的确切代码,它显示警告6011:
warning C6011: NULL-Zeiger "p" wird dereferenziert.: Lines: 138, 139
"像这样的情况"是相当模糊的,它需要编译器从每一个反引用中回溯,看看它是否能证明它知道指针有一个常量,无效的值。
考虑程序的其他部分可能被赋予指向该指针的指针(别名),并在不同的代码路径中覆盖它,或者(更糟)在不同的线程中覆盖它。
它不容易检测,而且我认为在实际程序的编译时间方面的成本会使它不值得,即使它可以通过合理的工作量来实现。
valgrind可以指出这一点。我用它来检查这种模糊的情况,以及无效的读/写。
这是运行时错误,而不是编译时错误。编译器只能在非常有限的情况下捕捉到这样的解引用,在这种情况下,它可以完全确定指针的值。没有必要增加复杂性。
这是一个未定义的行为。这意味着编译器不需要发出警告或错误。
解除空指针的引用是未定义的行为。编译器可以诊断这种情况,但不是必须的。
相关文章:
- 如何修复编译器警告 C6386 和 C6385?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 为什么布尔开关语句有编译器警告?
- 奇怪的缩小转换在 g++ 编译器中加倍到浮点警告
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 使用 reverse_iterator 而不是const_reverse_iterator并获得讨厌的编译器警告和错误
- 添加 c++11 编译器后打开 devc++ 时显示的警告
- 来自 std::chrono 的编译器警告,但未被使用
- 警告级别为 3 的 int 的 std::vector push_back 处的编译器警告
- G++ 编译器未为未定义的方法生成错误/警告
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 有没有办法在从临时返回按值string_view时获得编译器警告?
- 常量更改而不const_cast<> 为什么没有编译器警告/错误?
- 为什么编译器不在同一翻译单元中警告 ODR 违规
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 是否可以将移动的变量标记为不再可用,并在使用它时收到编译器警告?
- 为什么我应该始终启用编译器警告
- 使用Boost :: black在boost :: variant中使用时,请警告编译器