Arn*_*rne 5 c++ exception clang clang-static-analyzer
我使用 clang 分析器检查 C++ 代码是否有 bug 和错误。我有以下构造:
#include <cstdlib>
#include <iostream>
double
somethingThatMayThrow() throw (std::exception)
{
if( rand() % 2 ) {
throw std::exception();
}
return 5.0;
}
int
main()
{
double value = 2.0;
try {
value = somethingThatMayThrow();
} catch( const std::exception& ) {
std::cout << "oops" << std::endl;
}
double someOtherValue = value + 1.0;
std::cout << someOtherValue << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
分析器现在抱怨变量的初始值value
从未被读取。但是,很明显,当且仅当 try 块中出现异常时,才会在最后一行使用该值。这种理解是否正确,我是否在分析器中发现了错误?或者我在这里遗漏了什么?
标准如何定义这种行为?如果右侧抛出异常,左侧的赋值会发生什么情况?
下面的屏幕截图显示了分析器抱怨的实际代码,其结构与上面的示例相同:
分析仪是错误的。你是对的。
std::exception
如果 try 块内的代码永远不能抛出s 或从它派生的类型的对象(例如noexcept
,或仅抛出其他类型的对象),则分析器可能是正确的。
无论哪种方式,您的解释都是正确的:如果对待值的评估抛出,则赋值永远不会发生。因此,原始值将保持不变。