gpt4 book ai didi

c++ - 来自 Parasoft C++test 的混淆控制流分析

转载 作者:可可西里 更新时间:2023-11-01 17:58:58 27 4
gpt4 key购买 nike

我们使用 Parasoft C++test静态分析我们的代码。它在使用如下代码时遇到问题:

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

*x;
}

它在 *x; 行警告:

Freed memory shouldn't be subsequently accessed under any circumstances

不知何故得出结论,控制流可以传递到 catch(...) block ,删除 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 不会对这段代码产生任何问题。

关于c++ - 来自 Parasoft C++test 的混淆控制流分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5796122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com