Ответ 1
Да, PC-Lint, вероятно, лучший инструмент.
У меня была неприятная опечатка, которая растратила мое время и время моего коллеги, это было примерно так:
for (i = 0; i < blah; i++); // <- I had a semi-colon here, that the bug!
{
// Some awesome logic here
}
Прежде всего, это очень неловко, во-вторых, я никогда не должен повторять этого. Я относительно не знаком с C. В Java, я думаю, я могу использовать FindBugs, чтобы поймать такие ошибки, какой инструмент я должен использовать для C код? Lint?
Да, PC-Lint, вероятно, лучший инструмент.
В дополнение к предложению Lykathea PC-Lint вы также можете улучшить (или, по крайней мере, более) диагностику, если вы поднимите уровень предупреждения компилятора. Что-то вроде /W4
или -Wall
Хотя я не уверен, что ваша конкретная проблема была бы поймана с этим (MS VC, похоже, не указывает его даже при всех предупреждениях). Я думаю, что, поскольку это не необычная идиома для циклов for
, должна быть пустой, когда работа выполняется как побочные эффекты выражений управления контуром.
Несколько вещей, которые спасли меня в прошлом, от верхушки головы:
Используйте, если (3 == bla), а не (bla == 3), потому что если вы ошибаетесь и набираете (3 = bla), компилятор будет жаловаться.
Используйте переключатель all-warnings. Ваш компилятор должен предупредить вас о таких пустых операциях.
Используйте утверждения, когда можете и запрограммируйте защиту. Положите хорошее усилие на то, чтобы ваша программа не срабатывала рано, вы увидите такие недостатки.
Не пытайтесь обойти любые меры предосторожности, которые установил компилятор или ОС. Они также доступны для вашего удобства программирования.
Также посмотрите статический анализ clang
Я бы начал с изучения splint и gdb. Если вам нужно более продвинутое, используйте эти два инструмента. Но это хорошее начало.
GCC имеет большинство функций, которые Lint встроил с помощью предупреждающих флагов.
Любая хорошая среда программирования GUI ( "IDE" - интегрированная среда разработки), например Eclipse, генерирует предупреждение в таком случае.
Хороший синтаксический маркер сделает некоторые случаи такими более заметными.
Я бы предположил, что если у вас есть возможность применять стандарты MISRA. Они были написаны с большой мыслью и многими правилами, которые просто для компилятора проверить. Например, правило, которое я использую, требует, чтобы все команды NOP имели свою собственную строку. Это означает, что когда вы помещаете a; в конце цикла оператор будет через ошибку, говоря, что она не на собственной строке.
QA · C по программированию Исследование - еще один хороший инструмент статического анализа для C.
В этой (старой) версии Как снимать себя в ногу, а также во многих других версиях по всему миру, C всегда язык, который позволяет простейшую процедуру. При программировании на C вы должны помнить об этом и быть осторожным. Если вы хотите защитить, выберите другой язык.
Это высказывание приписывается самому Bjarne Stroustrup (С++). К (неправильной) цитате:
"C позволяет легко стрелять себе в ногу"