6

非常に複雑な C++ 関数をデバッグしていて、一部の入力で予期しない結果が得られます。さまざまな入力でのコード実行を比較して、どの部分がバグの原因であるかを突き止めたいと考えています。コードの実行パスを比較できるツールを探しています。そのようなツールがあれば教えてください。または、同じことを行うために使用できるテクニックがあれば?

私の問題を具体的に説明するために、ここでは不自然な例を使用しています。

これが疑似コードの関数であるとします。

double payTax(double income)
{
   if (income < 10000)
      return noTax();
   else if ( 10000 < income < 30000)
      return levelOneTax();
   else if (30000 < income < 48000)
      return levelTwoTax();
   else  
      return levelThreeAboveTax();
}

入力 15000 を指定すると、関数は正しい税額を計算しますが、入力 16000 では誤った税額が返されます。おそらく、入力 15000 と 16000 により、関数はまったく同じ実行パスを通過します。一方、それらが異なるパスをたどる場合は、関数内で何か問題が発生したに違いありません。したがって、実行パスを比較するツールは、バグを迅速に特定するのに役立つ十分な情報を明らかにします。そんなツールを探しています。できれば Visual Studio 2010 と互換性があります。そのようなツールで変数の値も保持できるとよいでしょう。

私が取り組んでいるコード ベースは、単純な payTax の例よりもはるかに大きく複雑であるため、PS のデバッグは私がやりたい最後のことです。

助けてください。ありがとう。

4

2 に答える 2

3

あなたが探しているキーワードは、「コードカバレッジ」または「カバレッジ分析」または「コードカバレッジ分析」です。

どのツールを使用するかは、当然、環境の残りの部分によって異なります。

于 2012-12-09T19:45:41.637 に答える
-1

必要なツールはprintfまたはstd::cerr

また、コードに重大なエラーがあります。のようなステートメントif ( 10000 < income < 30000)は期待どおりに機能しません。あなたはそれをのように書きたいですif( 10000 < income && income < 30000 )

また、テストを簡単にするために、次のように中括弧を使用してください。

if( 10000 < income && income < 30000 ) {
    return levelOneTax();
} else if( ...

その場合、次のように、デバッグ出力を追加する方がはるかに簡単になります。

if( 10000 < income && income < 30000 ) {
    std::cerr << "using levelOneTax for income=" << income << std::endl;
    return levelOneTax();
} else if( ...

編集

ところで:「実行パスを比較するツールは十分な情報を明らかにします[...]」、しかしあなたが期待している意味では、そのようなツールは処理するにはあまりにも多くの情報を明らかにします。実行できる最善のことは、コードが期待どおりに動作していることをデバッグおよび検証することです。「コードカバレッジ」ツールはおそらくあなたのケースには大きすぎるでしょう(そしてそのようなツールも安くはありません)。

于 2012-12-09T19:53:48.407 に答える