2009-02-13 3 views
7

В настоящее время я изучаю C++, и потому, что я все еще учился, я продолжаю делать ошибки.
С таким разрешительным языком, как C++, часто требуется много времени, чтобы выяснить, что именно не так - потому что компилятор позволяет мне уйти с большим успехом. Я понимаю, что эта гибкость является одной из основных сильных сторон C++, но это затрудняет изучение базового языка.
Есть ли какой-нибудь инструмент, который я могу использовать для анализа моего кода и внесения предложений на основе лучших практик или просто разумного кодирования? Предпочтительно, как плагин Eclipse или приложение linux.Инструменты анализа кода C++

ответ

17

Включите максимальные предупреждения компилятора (это опция -Wall, если вы используете компилятор Gnu).

«Линт» - это архетипический инструмент статического анализа.

valgrind - хороший анализатор времени работы.

+2

+1 для valgrind. Он находит много новичков, таких как отключение. – ypnos

+0

+1 для lint, такой замечательный инструмент – JaredPar

+1

Опасайтесь, что большинство версий lint написаны для C и для C++ довольно бесполезны. Gimple PC-Lint является исключением. –

2

lint - есть много версий, но если вы google для lint, вы должны найти тот, который работает. Другое дело - включить предупреждения о компиляторе - если вы используете gcc/g ++, опция -Wall.

Возможно, вы найдете CppChecker как плагин для Eclipse, который поддерживает gcc/PC lint.

3

Поддержка инструмента для C++ довольно плохая по сравнению с Java, C# и т. Д., Потому что у него нет контекстной грамматики. Фактически, есть части грамматики C++, которые неразрешимы. В основном, это означает, что понимание кода на C++ на синтаксическом уровне требует реализации в значительной степени интерфейса компилятора с семантическим анализом. C++ не может анализироваться в AST независимо от семантического анализа, а большинство инструментов анализа кода в IDE и т. Д. Работают на уровне AST. Это часть компромисса, который вы делаете в обмен на гибкость и обратную совместимость C++.

+0

И именно поэтому я хотел кричать, когда увидел, какие новые «функции» комитета по стандартам собираются добавить в C++ 0x! –

+0

C++ имеет просто тонкую контекстно-свободную грамматику и может анализироваться без семантического анализа, если все, что вам нужно, это дерево синтаксиса (и некоторые неоднозначности). Вы должны прекратить использовать слабую синтаксическую технологию, такую ​​как LALR (например, YACC). См. Парсеры GLR и особенно см. Elsa www.eecs.berkeley.edu/~smcpeak/elkhound/sources/elsa/ и Инструментарий для реинжиниринга программного обеспечения DMS www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html Оба эти инструменты также обеспечивают полный «семантический анализ» в смысле определения значения символов и устранения двусмысленностей из дерева разбора, если его спросят. –

+0

Да, но часть некоторых двусмысленностей была той точкой, которую я пытался сделать. – dsimcha

5

Для g ++, а также включите -Wall, включите -pedantic и подготовьтесь к удивлению по количеству обнаруженных проблем!

2

Я думаю, что действительно то, что вам нужно узнать здесь, - это отладка вне среды IDE. На мой взгляд, это ценный навык, поскольку вам больше не понадобится такой тяжелый инструментарий для разработки программного обеспечения, и он будет применяться к подавляющему большинству языков, которые вы уже знаете и когда-либо узнаете.

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

Загрузите и попробуйте некоторые из бесплатных инструментов отладки, например GDB, они могут помочь вам исследовать память и т. Д., Не создавая собственный код.

6

Думаю, вам лучше читать лекции о хороших практиках и почему они хороши. Это должно помочь вам больше, чем инструмент анализа кода (по крайней мере, в начале).

Я предлагаю вам прочитать серию Effective C++ и ** Effective STL книг, по крайней мере.См. Alsot The Definitive C++ Book Guide and List

+0

Я второй комментарий, прочитав эти книги (+1). –

+1

+1 для Эффективных книг на C++ для Мейера. –

3

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

Если вам нужно что-то более тяжелое, вы можете попробовать PC-Lint, если вы на Windows, который по-прежнему является одним из лучших инструментов для линтов для C++. Просто имейте в виду, что вам нужно будет сконфигурировать эти инструменты, чтобы отразить ваш стиль кодирования, иначе вы получите болото с предупреждениями и не сможете увидеть дерево для деревьев. Да, это стоит денег, и это, вероятно, немного переборщило, если вы не делаете C++ на уровне «получать за это», но я считаю его неоценимым.

3

Существует список инструментов для анализа статического кода на этапе wikipedia.

Но предупреждения, как правило, хорошие, но одна проблема с включением всех предупреждений с помощью педантичного и Wall - это количество предупреждений, которые вы можете получить, включая заголовки, которые вы не контролируете, это может создать много шума. Я предпочитаю скомпилировать свое собственное программное обеспечение с включенными предупреждениями. Как я программирую в Linux я обычно делаю так:

Поместите внешние заголовки мне нужно включить в отдельный файл, а в начале этого файла перед включает в себя поставил:

#pragma GCC system_header 

А затем включить этот файл из вашего кода. Это позволяет вам видеть все предупреждения из вашего собственного кода без утопления в предупреждениях из внешнего кода. Недостатком является то, что это конкретное решение gcc, я не знаю о каком-либо независимом от платформы решении.

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