2

以下のコードに対して、Coverity 静的チェッカー ツールの警告が表示されます。

   double value = 0;
   std::string origValue("0.50");
   value = 0.10 * boost::lexical_cast<double>(origValue);

警告は「戻り値のオーバーフロー(INTEGER_OVERFLOW)」です。上記のコードの何が問題なのか理解できません。double を使用している場合、どのように整数オーバーフローが発生するのでしょうか? ありがとう。

4

1 に答える 1

6

この特定の Coverity 静的解析チェッカーは、特定の値でオーバーフローする可能性のある操作 (説明で例を示します) と、潜在的に切り捨てられた値の安全でない使用の 2 つを探します。

UI には、フラグが立てられた理由を説明する「イベント」が表示されます。マニュアルには、各イベントの意味が説明されています。あなたのケースで探している 2 つのイベントは、最初のイベントの「切り捨て」または「オーバーフロー」と、2 番目のイベントの「オーバーフロー シンク」です。

コード スニペットは、double に変換された文字列が定数で乗算され、別の double に割り当てられることを示しています。そこに問題はないかもしれませんが、「オーバーフローした戻り値」という欠陥のタイトルは、この関数からこの値を返す 2 番目のイベントがあることを示しています。この関数から「値」を返し、戻り値の型が double でない場合 (32 ビット型である可能性があります)、コードに潜在的なバグがあります (明らかに、表示している特定の値ではありませんが、文字列ができる場合はるかに大きな値になります)。関数が double を返す場合、それは分析での誤検出であり、UI でそのようにマークして、欠陥が再び表示されないようにすることができます。

コードを詳しく見ないと、実際に問題があるかどうかを判断するのは困難ですが、静的分析ではランタイム値が何であるかを判断できないことを覚えておいてください (文字列は本当に定数なのか、それとも動的に読み込まれるのか?)。 1 行の要約だけでなく、詳細なイベントが表示される理由 - このコードで実際の問題が発生する可能性を評価できます。

とはいえ、チェッカーはフロートを追跡することは想定されていないため、Coverity には間違いなくバグがあります。私はたまたま彼らのために働いていたので、これを問題として提出しましたが、Coverity サポートにも気軽に報告してください。

于 2012-03-25T23:46:36.163 に答える