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

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

标准如何定义这种行为?如果右侧抛出异常,左侧的赋值会发生什么情况?

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

clang 分析器检测到 try catch 块中的死存储

Lig*_*ica 5

分析仪是错误的。你是对的。

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

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