我们使用Parasoft C++test来静态分析我们的代码。它在处理以下代码时出现了问题:
void foo(int* x) {
try {
bar();
} catch(...) {
delete x;
throw;
}
*x;
}
它在*x;
行发出警告:
任何情况下都不应访问已释放的内存
一些方法得出结论,控制流可以进入catch(...)
块,删除x
,绕过throw;
,并到达*x;
。我尝试了throw std::exception("");
和其他几个方法,结果都是一样的。Parasoft肯定知道异常并将其纳入其控制流中,因为有许多其他测试涉及异常检查。它只是在这种情况下感到困惑,还是实际上有一种方式可以使该程序的执行同时触发delete x;
和*x;
?
throw
之后添加一个abort()
。但谁知道,也许会被诊断为死代码... - Peter G.bar()
实际上是空的,删除调用不会改变分析结果(我只包含它是为了尝试避免它检测到catch
永远不会发生,但我猜它不检查) - Michael Mrozek