Разбор кода Objective-C для статического анализа

Я люблю статический анализ и проверки во время компиляции, почти до отказа, но большая часть моей повседневной работы связана с 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, было бы идеально), но на данный момент я был бы готов адаптировать что-то, разработанное для другого инструментария парсера.


person Bill    schedule 22.07.2011    source источник
comment
gcc может компилировать программы на Objective-C (при условии, что вы не используете Apple API), поэтому где-то в исходниках gcc должна быть грамматика, не так ли? -- О, я вижу, ваша первая ссылка говорит об этом.   -  person JAB    schedule 22.07.2011


Ответы (4)


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

Clang полностью поддерживает Objective-C, и в статическом анализаторе уже есть множество классов, по которым вы можете моделировать свои собственные проверки. (в 1_).

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

person yan    schedule 25.07.2011

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

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

person Matthieu Cormier    schedule 22.07.2011
comment
Да, я знаю о лязге. Но мне нужно что-то легко расширяемое, что позволит мне писать собственные программы для анализа AST. - person Bill; 22.07.2011
comment
@Bill: Это должно быть иронично? Одним из основных преимуществ clang является его архитектура на основе библиотек и простота расширения. - person Sedate Alien; 25.07.2011
comment
@Sedate: Нет, конечно нет. Я думал, что clang должен быть проще для разработчиков компиляторов — я не знал, что вы можете написать простые программы-драйверы для обхода AST. - person Bill; 25.07.2011
comment
@Билл: Мои извинения! Это действительно легко для пользователей AST, см., например, этот (несколько устаревший) руководство. - person Sedate Alien; 26.07.2011

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

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

person Stuart Carnie    schedule 22.07.2011

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

person Dane    schedule 15.03.2013