C ++如何处理try catch块中的赋值?

时间:2015-08-21 12:48:10

标签: c++ exception clang clang-static-analyzer

我使用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块中存在异常时,该值才会在最后一行中使用。这种理解是否正确,我是否正在查看分析仪中的错误?或者我在这里遗漏了什么?

标准如何定义此行为?如果右侧投掷,分配的左侧会发生什么?

下面的屏幕截图显示了分析器抱怨的实际代码,其结构与上面的例子相同:

clang analyzer detects a dead store in a try catch block

2 个答案:

答案 0 :(得分:4)

分析仪错误。你是对的。

如果try块中的代码永远不会抛出std::exception或从它派生的类型的对象(例如,使用noexcept,或仅抛出其他类型的对象,则分析器可能是正确的)。

无论哪种方式,您的解释都是正确的:如果要评估要抛出的值,则永远不会发生任务。因此,原始值将保持不变。

答案 1 :(得分:0)

编译器发现您在someValue的初始化中分配了value,但是在try块内,您正在重新分配它。

分析器在没有抛出异常的情况下是正确的,但在相反的情况下,value仍然与原始someValue相同。