我使用clang分析器检查我的C ++代码是否存在错误和错误。我有以下结构:
#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;
}
分析器现在抱怨从未读取变量value
的初始值。但是,很明显,当且仅当try块中存在异常时,该值才会在最后一行中使用。这种理解是否正确,我是否正在查看分析仪中的错误?或者我在这里遗漏了什么?
标准如何定义此行为?如果右侧投掷,分配的左侧会发生什么?
下面的屏幕截图显示了分析器抱怨的实际代码,其结构与上面的例子相同:
答案 0 :(得分:4)
分析仪错误。你是对的。
如果try块中的代码永远不会抛出std::exception
或从它派生的类型的对象(例如,使用noexcept
,或仅抛出其他类型的对象,则分析器可能是正确的)。
无论哪种方式,您的解释都是正确的:如果要评估要抛出的值,则永远不会发生任务。因此,原始值将保持不变。
答案 1 :(得分:0)
编译器发现您在someValue
的初始化中分配了value
,但是在try
块内,您正在重新分配它。
分析器在没有抛出异常的情况下是正确的,但在相反的情况下,value
仍然与原始someValue
相同。