Я отлаживаю очень сложную функцию 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.
Пожалуйста помоги. Благодарю.
Ключевыми словами, которые вы ищете, является «покрытие кода» или «анализ покрытия» или «анализ покрытия кода».
Какой инструмент вы используете, будет, естественно, зависеть от остальной части вашей среды.
Инструмент, который вы хотите 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( ...
РЕДАКТИРОВАТЬ
Кстати: «инструмент, который сравнивает пути выполнения, показал бы достаточно информации […]», НО в том смысле, в каком вы ожидаете, такой инструмент покажет СЛИШКОМ МНОГО информации, с которой нужно справиться. Лучшее, что вы можете сделать, это отладить и проверить, что ваш код делает то, что вы ожидаете. Инструмент «покрытия кода», вероятно, будет слишком большим для вашего случая (а также такие инструменты не дешевы).