比较不同输入下相同代码的执行路径

时间:2012-12-09 19:33:24

标签: c++ execution

我正在调试一个非常复杂的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兼容。如果这样的工具还保留变量值,那就更好了。

P.S。调试是我想要做的最后一件事,因为我正在使用的代码库比简单的payTax示例要大得多,复杂得多。

请帮忙。感谢。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:-1)

您想要的工具是printfstd::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( ...

修改

BTW:“一个比较执行路径的工具会显示足够的信息[...]”,但就你所期望的那样,这样的工具会显示太多要处理的信息。您可以做的最好的事情是调试并验证您的代码是否按预期执行。 “代码覆盖率”工具可能对您的情况来说太大了(而且这些工具也不便宜)。