поиск ошибок в данном коде c - PullRequest
0 голосов
/ 12 августа 2010

Мне интересно узнать, на каких вещах мне нужно сосредоточиться на отладке кода c без отладчика.Что нужно искать?

Обычно я ищу следующее:

  1. Проверьте, передается ли правильное значение и тип функции.
  2. Посмотритедля нераспределенных и неинициализированных переменных
  3. Проверка синтаксиса функции и функция используется правильно.
  4. Проверка возвращаемых значений
  5. Проверка блокировки используется правильно.
  6. Проверка завершения строки
  7. Возвращение переменной в стеке из функции
  8. Отключение по одной ошибке
  9. Нормальные синтаксические ошибки
  10. Функцияошибки объявления

Любой структурированный подход очень ценится.

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

Большинство из этих ошибок будут обнаружены путем передачи соответствующих предупреждающих флагов компилятору.

Однако из исходного списка пункты 1, 5, 6, 7, 8 очень стоит проверить как человек, однако некоторые комбинации компилятор / флаг, однако, обнаружат необработанные значения, указатели на автоматическую память и отключены. ошибки в индексации массива и т. д.

Возможно, вы захотите взглянуть на такие вещи, как mudflap , valgrind , efence и другие, чтобы отследить случаи выполнения, о которых вы не знаете. Вы также можете попробовать splint , чтобы расширить свой статический анализ.

Что касается неавтоматизированной стороны, попробуйте статически следить за ходом вашей программы для конкретных случаев, особенно для угловых случаев, и убедитесь, что она поступает правильно. Попробуйте написать модульные тесты / тестовые сценарии. Обязательно используйте автоматическую проверку, как описано выше.

Если вы делаете упор на тестирование без выполнения теста, splint вполне может быть лучшим местом для начала. Техника, которую вы хотите исследовать, называется статический анализ кода .

1 голос
/ 12 августа 2010

Большое значение, которое вы пропустили, является целочисленным переполнением. Это включает в себя как неопределенное поведение из-за переполнения выражений со знаком, так и четко определенное, но, возможно, опасное поведение переполнения без знака. Mod TYPE_MAX+1. В частности, такие вещи, как foo=malloc(count*sizeof *foo);, могут быть очень опасными, если count поступил из потенциально ненадежного источника (например, файла данных), особенно если sizeof *foo велико.

Некоторые другие:

  • смешивание значений со знаком и без знака в сравнениях.
  • использование функций со специфическим для локали поведением (например, радикальный символ, отображение регистра и т. Д.), Когда необходимо четко определенное унифицированное поведение.
  • использование char при выполнении чего-либо большего, чем копирование значений или сравнение на равенство (в противном случае вы, вероятно, захотите unsigned char или, возможно, в редких случаях, signed char).
  • использование выражений со знаком с /POWER_OF_2 и %POWER_OF_2 (подсказка: (-3)%8==-3, но (-3)&7==5).
  • использование деления со знаком / по модулю в целом с отрицательными числами, поскольку его версия С не согласуется с обычным алгебраическим определением, когда отрицательное число делится на положительное, и редко дает желаемый результат.
1 голос
/ 12 августа 2010

Я рекомендую попробовать один из многих статических анализаторов кода.Те, которые я использовал лично и могу порекомендовать:

  • cppcheck - бесплатно и с открытым исходным кодом, имеет программу cmd-line и windows gui
  • ClangStatic Analyzer - бесплатный и открытый исходный код Apple, наилучшим образом поддерживаемый на Mac, также встроенный в последние версии XCode
  • Статическая проверка Visual Studio, доступная только в Premium и Ultimate (то есть дорогих) версиях
  • Coverity - дорого

Если вам нужны подробности, вы можете прочитать статью, которую я написал на эту тему.

...