2016-07-29 4 views
1

Я пишу простой редактор C. Я должен проверить код, чтобы выделить любые ошибки, отсутствующие точки с запятой, использование несуществующих функций/переменных/методов, настройки в состоянии if и т. Д. И т. Д.Проверка кода C с использованием классов CDT

Анализ и проверка C - очень сложная проблема, поэтому я решил использовать CDT. Однако я понятия не имею, как это сделать. Я только нашел информацию о методе org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage.getASTTranslationUnit(...), но это не очень помогает, поскольку позволяет находить только основные синтаксические ошибки. (Я прав?)

Мне нужна функция, которая получает код С или объект класса IASTTranslationUnit. Он должен вернуть список всех проблем (ошибок и предупреждений). Как я могу это сделать, используя API CDT?

+0

Я не думаю, что вы получите AST в случае ошибки синтаксического анализа, поэтому этот подход не будет работать. – qrdl

+0

подтвердите код C: 1) запустите компилятор с включенными предупреждениями, а когда все предупреждения зафиксированы, запустите инструмент, такой как valgrind над исходным кодом. – user3629249

+0

@ user3629249 Я рассмотрю это как последнее средство. Тем не менее, я ищу портативное решение. Возможно, что код будет запущен на сервере на другой странной машине. И даже если это не так, я бы не хотел, чтобы каждый пользователь устанавливал и настраивал компилятор. –

ответ

1

Многие категории ошибок можно проверить, разрешив имена, найденные в AST (вызывая IASTName.resolveBinding()), и выясните, является ли результирующее связывание IProblemBinding.

Посмотрите, как CDT ProblemBindingChecker делает это, чтобы показать много ошибок в редакторе.

Обратите внимание, что это не приведет к ошибкам; вы можете посмотреть на CD other checkers за идеями о том, как поймать другие категории ошибок (некоторые из шашек также вызывают предупреждения).

Тем не менее, даже все проверочные CDT, собранные вместе, не будут диагностировать все ошибки и предупреждения, которые будет использоваться компилятором. Если это требование, я бы предложил использовать внутренние компоненты компилятора, такие как libclang.