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 兼容。如果这样的工具还保留变量的值会更好。

PS 调试是我最不想做的事情,因为我正在使用的代码库比简单的 payTax 示例要大得多且复杂得多。

请帮忙。谢谢。

4

2 回答 2

3

您要查找的关键字是“代码覆盖率”或“覆盖率分析”或“代码覆盖率分析”。

您使用哪种工具自然取决于您的其他环境。

于 2012-12-09T19:45:41.637 回答
-1

你想要的工具是printfor 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 回答