我们使用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;
and *x;
?