Любые инструменты, чтобы поймать глупые ошибки в коде C? - PullRequest
11 голосов
/ 15 октября 2008

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

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

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

Ответы [ 11 ]

15 голосов
/ 15 октября 2008

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

7 голосов
/ 15 октября 2008

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

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

4 голосов
/ 22 октября 2010

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

4 голосов
/ 15 октября 2008

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

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

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

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

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

3 голосов
/ 15 октября 2008

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

2 голосов
/ 16 октября 2008

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

0 голосов
/ 30 июля 2011

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

0 голосов
/ 19 июля 2010

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

0 голосов
/ 15 октября 2008

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

0 голосов
/ 15 октября 2008

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

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

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

...