从Parasoft C++测试中混淆控制流分析

Mic*_*zek 8 c++ static-analysis exception parasoft control-flow

我们使用Parasoft C++测试来静态分析我们的代码.它有以下代码的问题:

void foo(int* x) {
    try {
        bar();
    } catch(...) {
        delete x;
        throw;
    }

    *x;
}
Run Code Online (Sandbox Code Playgroud)

它警告*x;线:

在任何情况下都不应随后访问释放的内存

不知何故,它得出的结论是,控制流可以传递到catch(...)块中,删除x,经过throw;,并使其成为*x;.我试过throw std::exception("");和其他几个人一样,得到了同样的东西.Parasoft当然知道异常并将它们合并到其控制流中,因为还有许多其他测试涉及异常检查.难道仅仅是混淆在这种情况下,还是有一些实际的方式对这一计划击中双方的执行delete x;*x;

Jor*_*ans 0

也许这是一个愚蠢的建议,但如果你把问题留到最后,Parasoft 会说什么?IE

void foo(int* x) 
  {
  try 
    {
    bar();
    *x;
    } 
  catch(...) 
    {
    delete x;
    throw;
    }      
  }
Run Code Online (Sandbox Code Playgroud)

我意识到这可能不适用于语句和异常的所有组合,例如,如果您有多个异常类型要在 foo 的不同阶段使用不同的处理来捕获,但如果您真的想要,它至少可以为您提供解决方法的开始摆脱警告。