取消引用nullptr时,编译器不会发出警告

时间:2011-05-06 10:12:13

标签: c++ null compiler-warnings dereference

这:

int* p = nullptr;
auto tmp = *p;  

不会导致gcc 4.6和VS2010 sp1至少发出警告。在这些编译器中是否有任何选项可以让它们在这种情况下发出警告?我使用/ w4在VS中进行了测试编译。

7 个答案:

答案 0 :(得分:8)

这不违法,只是未定义的行为。

打开警告可能会导致错误的安全感,因为通常直到运行时才会知道某些指针指向nullptr或其他指针。 Valgrind可以检查这些错误(还有更多)。

更不用说它会大大增加编译时间。

答案 1 :(得分:5)

在Visual Studio 2010 SP1中(不知道您需要哪个版本),运行代码分析。我刚试过你的确切代码,它显示警告6011:

warning C6011: NULL-Zeiger "p" wird dereferenziert.: Lines: 138, 139

答案 2 :(得分:4)

“像这样的情况”非常模糊,它需要编译器从每个去引用中回溯,看看它是否可以证明它知道指针有一个常量,并且无效,价值。

考虑到程序的其他部分可以被赋予指针指针(别名)并在不同的代码路径中覆盖它,或者(更糟糕的)在不同的线程上。

检测起来并不容易,而且我认为实际程序的编译时间成本会使它变得不值得,如果它甚至可以通过合理的努力来实现。

答案 3 :(得分:2)

valgrind可以指出这一点。我用它来检查这种模糊的情况,以及无效的读/写。

答案 4 :(得分:1)

这是运行时错误,而不是编译时错误。编译器只能在非常有限的情况下捕获这样的解引用,它可以完全确定指针值。没有必要增加复杂性。

答案 5 :(得分:1)

这是一种未定义的行为。这意味着编译器不需要发出警告或错误。

答案 6 :(得分:0)

取消引用空指针是未定义的行为。允许编译器诊断此类情况但不是必需的。