这:
int* p = nullptr;
auto tmp = *p;
不会导致gcc 4.6和VS2010 sp1至少发出警告。在这些编译器中是否有任何选项可以让它们在这种情况下发出警告?我使用/ w4在VS中进行了测试编译。
答案 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)
答案 4 :(得分:1)
这是运行时错误,而不是编译时错误。编译器只能在非常有限的情况下捕获这样的解引用,它可以完全确定指针值。没有必要增加复杂性。
答案 5 :(得分:1)
这是一种未定义的行为。这意味着编译器不需要发出警告或错误。
答案 6 :(得分:0)
取消引用空指针是未定义的行为。允许编译器诊断此类情况但不是必需的。