我们使用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对此代码不会有任何问题。

07-24 13:26