2008-10-15 2 views
11

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

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?

+3

Мы имели большой успех с помощью бейсбольной биты здесь. После того, как мы поймаем первую глупую ошибку, они, как правило, не делают другого! – Danimal 2008-10-15 18:46:00

+0

Ах, проблема с точкой с запятой является повторяющейся проблемой. Дополнительный, отсутствующий; это не имеет значения. Все они ведут к такому же поиску боли, что и навсегда, и приводит к «Doh!». и головной пощечину. Я все еще это время от времени. – 2008-10-15 20:00:03

+0

Возможно, вы захотите указать платформу. Не все инструменты будут работать без изменений на всех платформах. – 2010-07-19 15:40:19

ответ

15

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

+1

Но будьте готовы к * большому количеству предупреждений, если кодовая база имеет какой-либо размер и уже не была начищена. – 2008-10-15 18:47:33

+1

Правда о многих предупреждениях - но все они настраиваются индивидуально. Поэтому вы можете отключить все, что вам нужно. – 2008-10-16 12:08:38

+0

Я нахожу предупреждения PC-lint в критических и неясных в лучшем случае. – 2009-01-06 22:13:32

3

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

7

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

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

0

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

4

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

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

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

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

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

-1

В этой (старой) версии How to Shoot Yourself In the Foot, и во многих других версиях вокруг сети, C всегда язык, который позволяет для простейшей процедуры. При программировании в C, вы должны помнить об этом и быть осторожным. Если вы хотите защитить, выберите другой язык.

Это поговорка attributed самому Bjarne Stroustrup (C++). Для того, чтобы (MIS) Цитата:

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

0

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

2

GCC имеет большую функциональность, которую Линт построил через warning flags.

0

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

0

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

Смежные вопросы