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

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

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 5

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

Это высказывание приписывается самому Bjarne Stroustrup (С++). К (неправильной) цитате:

"C позволяет легко стрелять себе в ногу"