我们使用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;
? 最佳答案
因此该工具是错误的(我之前已经说过),并且我认为您不希望听到该警告。
我同意@Pascal的评论,即为了避开某些工具的局限性而重写代码有些危险。您可以做的就是仅对当前存在此问题的文件禁用此警告。
然后,您可以从无警告的构建开始,而无需任何工具告诉您重写现有的有效代码。
对于新代码,您将必须采用该工具可以理解的某种样式。这不是问题,因为这将是您当前正在处理的代码,因此,如果您需要稍微重写一下以消除警告,则问题就更少了。
尽管是正确的,但现有样式仍远非理想。
我建议在auto_ptr中存储类似x
的指针。如果auto_ptr的内容超出范围,它将自动删除该内容-除非您明确将其从auto_ptr中取出。这在外观上要容易得多,并且很好地证明了此函数具有指针的所有权。
void foo(auto_ptr<int> x)
{
bar();
*x;
}
我希望ParaSoft对此代码不会有任何问题。