【问题标题】:STL iterator - why is the code analysis tool complaining?STL 迭代器 - 为什么代码分析工具会抱怨?
【发布时间】:2009-12-09 11:53:26
【问题描述】:

我正在检查静态代码分析工具Klocwork的结果。

它抱怨以下代码:

293 for( my_vector_typedef::iterator it( start_pos ); it != end_pos ; ++it ){
294   delete *it;
295 }

带有以下信息:

对象“it._M_current”在被释放后使用。对象 'it._M_current' 在第 294 行通过将参数 1 传递给函数 'delete' 释放后在第 293 行使用

我知道 STL 中的事物(尤其是迭代器)有时并不像它们看起来那样,所以我想了解发生了什么。故意提出愚蠢的问题 - '删除'是针对'it'指向的东西执行的,而不是'it'本身,那么为什么它会抱怨它与'++it'一起使用呢?不是被删了吗?

【问题讨论】:

  • 静态分析并不完美。它可以错误地标记代码行为正确的程序中的错误。由于某些代码检查需要比其他代码更高的分析精度,因此不同检查之间误报的频率可能会有很大差异。

标签: c++ templates stl iterator


【解决方案1】:

在我看来,由于您试图删除迭代器引用的对象,该工具有点困惑。 ++it 应该简单地重新加载 _M_current 及其新值,但这似乎使工具感到困惑。

对我来说这看起来并不特别危险,所以我很想看看你是否可以禁用此警告。通常使用静态分析工具,您必须稍微调整它们以匹配您的编码风格。

【讨论】:

    【解决方案2】:

    在我看来,代码分析工具不能很好地理解取消引用。我从未见过完美的代码分析工具。大多数都有某种错误。如果代码在你检查、双重检查和三重检查后看起来很好,那可能是代码分析工具有问题。

    【讨论】:

      【解决方案3】:

      您可以重写循环以在 delete 之前增加 it

      my_vector_typedef::iterator it( start_pos );
      while(it != end_pos)
      {
          type_used_in_my_vector* x = *it++;
          delete x;
      }
      

      【讨论】:

      • 嗯,该工具认为它并不完美。我不得不想知道迭代器的operator++ 需要it._M_current 做什么。它归结为:1)找到一种方法告诉工具“错误”是可以的,或者 2)重写代码来做同样的事情,但要多一行,或者 3)放弃工具。抱歉,我在这里没有看到更好的答案。
      猜你喜欢
      • 2021-02-25
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多