Сравните пути выполнения одного и того же кода под разными входами

Я отлаживаю очень сложную функцию 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.

Пожалуйста помоги. Благодарю.

6

Решение

Ключевыми словами, которые вы ищете, является «покрытие кода» или «анализ покрытия» или «анализ покрытия кода».

Какой инструмент вы используете, будет, естественно, зависеть от остальной части вашей среды.

3

Другие решения

Инструмент, который вы хотите 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( ...

РЕДАКТИРОВАТЬ

Кстати: «инструмент, который сравнивает пути выполнения, показал бы достаточно информации […]», НО в том смысле, в каком вы ожидаете, такой инструмент покажет СЛИШКОМ МНОГО информации, с которой нужно справиться. Лучшее, что вы можете сделать, это отладить и проверить, что ваш код делает то, что вы ожидаете. Инструмент «покрытия кода», вероятно, будет слишком большим для вашего случая (а также такие инструменты не дешевы).

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector