Какие-нибудь инструменты для обнаружения глупых ошибок в коде C?

StackOverflow https://stackoverflow.com/questions/205911

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня была неприятная опечатка, которая потратила впустую мое время и время моего коллеги, это было примерно так:

for (i = 0; i < blah; i++); // <- I had a semi-colon here, that's the bug!
{
  // Some awesome logic here
}

Во-первых, это очень неловко, во-вторых, мне никогда не следует этого повторять.Я относительно новичок в C.В Java, я думаю, я могу использовать Найти ошибки чтобы обнаружить подобные ошибки, какой инструмент мне следует использовать для кода C?Линт?

Это было полезно?

Решение

Да, ПК-Линт вероятно, лучший доступный инструмент.

Другие советы

В дополнение к Предложение Ликатеи по PC-Lint, вы также можете получить лучшую (или, по крайней мере, большую) диагностику, если повысите уровень предупреждений компилятора.Что-то вроде /W4 или -Wall

Хотя я не уверен, что ваша конкретная проблема была бы обнаружена с помощью этого (MS VC, похоже, не помечает ее даже при включенных всех предупреждениях).Я думаю, это потому, что это не редкая идиома для for циклы должны быть пустыми, когда работа завершена, как побочный эффект выражений управления циклом.

Несколько вещей, которые спасли меня в прошлом, из головы:

  • Используйте, если (3 == бла), а не (бла == 3), потому что если вы ошибетесь и наберете (3 = bla), компилятор пожалуется.

  • Использовать все предупреждения выключатель.Ваш компилятор должен предупреждать вас о подобных пустых утверждениях.

  • Использовать утверждения когда вы можете, и программируйте оборонительно.Приложите все усилия, чтобы ваша программа потерпела неудачу как можно раньше, и тогда вы увидите слабые места.

  • Не пытайтесь обойти какие-либо меры безопасности, установленные компилятором или операционной системой.Они также созданы для облегчения программирования.

Также посмотрите статический анализ clang

Я бы начал с изучения шина и БДБ.Если вам нужно что-то более продвинутое, используйте эти два инструмента.Но они являются хорошим началом.

GCC имеет большую часть функций, встроенных в Lint через предупреждающие флажки.

Любая хорошая среда программирования с графическим пользовательским интерфейсом («IDE» - интегрированная среда разработки), такая как Eclipse, в таком случае выдаст предупреждение.

Хорошая подсветка синтаксиса сделает некоторые подобные случаи более заметными.

Я бы посоветовал посмотреть, есть ли у вас возможность обеспечивать соблюдение стандартов MISRA.Они были написаны с большой мыслью и множеством правил, которые легко проверить компилятору.Например, правило, которое я использую, требует, чтобы все команды NOP имели собственную строку.Это означает, что когда вы помещаете ;в конце оператора цикла выдается ошибка, говорящая, что он не находится на отдельной строке.

ОК·К от Programming Research — еще один хороший инструмент статического анализа C.

В этой (старой) версии Как выстрелить себе в ногу, и во многих других версиях в Интернете, С всегда является языком, допускающим простейшую процедуру.При программировании в С, вы должны помнить об этом и быть осторожными.Если вам нужна защита, выберите другой язык.

Это высказывание приписываемый самому Бьёрну Страуструпу (C++).(неправильно) процитирую:

«С позволяет легко выстрелить себе в ногу»

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top