Разбор кода Objective-C для статического анализа - PullRequest
19 голосов
/ 22 июля 2011

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

Но поиск в Интернете предполагает, что людям трудно собрать вместеполная грамматика Objective-C. Один сайт в основном рекомендует отказаться.

Я нашел грамматику на веб-сайте ANTLR , но когда я запустил ее, я не смог ее разобратьвообще ничего.Например, он ответил на строку:

void x();

с src/main/resources/somecode.m line 1:0 no viable alternative at input 'void'

: (

Я более внимательно взглянул на грамматику и обнаружил следующий обескураживающий отказ от ответственности:

it's a work in progress, most of the .h file can be parsed

Но мне нужно что-то, что может анализировать как интерфейс, так и реализацию.

Есть ли где-нибудь полная грамматика Objective-C 2.0? Я бы предпочел что-то, что может работать сScala (поэтому все, что совместимо с Java, например, ANTLR, было бы идеально), но на этом этапе я бы хотел адаптировать что-то, предназначенное для другого инструментария синтаксического анализатора.

Ответы [ 4 ]

16 голосов
/ 25 июля 2011

Как уже упоминалось, Clang будет правильным решением. Вы можете предоставить своих собственных потребителей AST, то есть классов, которые будут вызываться при переходе через AST, и вам не нужно будет беспокоиться о разборе или обработке грамматики.

Clang полностью поддерживает Objective-C, и в статическом анализаторе уже есть много классов, после которых вы можете смоделировать свои собственные проверки. (в clang/lib/StaticAnalyzer/Checkers).

В этом каталоге много статических анализаторов, но вы также можете просто создать обычного потребителя AST. Для получения дополнительной информации см. http://code.google.com/p/chromium/wiki/WritingClangPlugins.

6 голосов
/ 22 июля 2011

Clang - это инструмент статического анализа, поддерживающий Objective-C. Я нашел это очень полезным в прошлом.

http://clang -analyzer.llvm.org /

4 голосов
/ 23 июля 2011

лязг является расширяемым;Вы можете расширить свой существующий статический анализ или создать свой собственный.llvm / clang спроектирован как серия библиотек, на которые вы можете ссылаться (динамически или статически).Хорошей отправной точкой является переносчик ARC (автоматический подсчет ссылок) library , который отвечает за статический анализ и переписывание кода target-c.

arcmt-test - это небольшой пример программы, которая использует библиотеку переноса ARC.

1 голос
/ 15 марта 2013

Вы можете использовать OCDepend , это инструмент статического анализа, основанный на Clang, который упрощает управление качеством кода Objective-C и обеспечивает очень гибкую структуру запросов кода.

...