Skip to content

Запуск OCLint и конфигурация

Kirill Gorsky edited this page May 21, 2024 · 3 revisions

Запуск

С помощью compile_commands.json

oclint [options] <source0> [... <sourceN>]

При таком запуске OCLint ищет compile_commands.json, после чего проверяет переданные ему файлы на ошибки.

compile_commands.json содержит флаги сборки и прочую информацию для каждого из файлов <source0> …​ <sourceN>. Это дает OCLint`у дополнительный контекст. В теории, наши критерии отлично работают и без всего этого контекста, но лишним не будет. Пример создания compile_commands находится в test-makefile.sh

Без compile_commands.json

oclint [options] <source0> [... <sourceN>] -- [flags]

[flags] - флаги, с которыми компилируются файлы <source0> …​ <sourceN>. Можно не указывать. Тогда получится:

oclint [options] <source> [... <sourceN>] --

Пример в test-gcc.sh

Конфигурация

Официальная документация по конфигурации OCLint находится здесь.

Настраивать поведение OCLint можно двумя способами: файлы конфигурации и флаги.

Файлы конфигурации

  1. Системная конфигурация — файл /etc/oclint. Имеет наименьший приоритет.

  2. Пользовательская конфигурация — файл ~/.oclint. Имеет больший приоритет.

  3. Конфигурация внутри проекта — файл .oclint в текущей директории. Имеет наибольший приоритет.

Файлы конфигурации содержат в себе YAML. Например:

rules:
  - TooLongIfSequence
rulePaths:
  - /etc/rules
rule-configurations:
  - key: MAX_IF_SEQUENCE_LEN
    value: 7
output: oclint.xml
report-type: xml
Опции:
  • rules — список выбранных критериев.

  • disable-rules — список исключенных критериев.

  • rulePaths — список директорий с критериями (директорий, в которых OCLint ищет .so файлы критериев).

  • rule-configurations — список пар ключ/значение. Настройка констант.

  • output — имя файла, в который перенаправляется вывод.

  • report-type — формат вывода. OCLint поддерживает json, xml, text, html, pmd, xcode.

Остальные опции в рамках oclint_extensions неинтересны, но ознакомиться с ними можно здесь

Флаги

Того же самого можно добиться флагами:

  • --rule=RuleName — выбрать правило.

  • --disable-rule=RuleName — исключить правило.

  • -R=some/directory/ — добавить директорию с критериями.

  • --rc=KEY=VALUE — настройка констант.

  • -o=output_file — перенаправить вывод в файл.

  • --report-type=type — изменить формат вывода.

Список критериев

  • GlobalVariable (отлавливает глобальные переменные)

  • MallocSizeof (отлавливает отсутствие sizeof внутри malloc/realloc. возможно, проверку стоит ослабить)

  • OnlyMainFunction (отлавливает код, содержащий только функцию main. не факт, что работает корректно, скорее всего полностью бесполезна, если использовать критерий LongMethod)

  • StringCompare (отлавливает сравнение строк с помощью ==, !=)

  • TooLongIfSequence (отлавливает слишком длинные условия в if) Опции:

    • MAX_IF_SEQUENCE_LEN (по умолчанию равен 5) — максимальная разрешенная длина последовательности if-ов с похожими условиями.

    • CHECK_BINARY_OPERATOR (по умолчанию равен 1) — если равен единице, тогда критерий будет смотреть на знаки в условиях if-ов. Например, x < 5 и x > 5 для него будут разными условиями. Чтобы выключить такое поведение, надо присвоить этому параметру значение 0.

    • CHECK_FUNCTION_CALL (по умолчанию равен 1) - если равен единице, тогда критерий будет смотреть на то, какие функции вызываются внутри условий if-ов. Например, gcd(x, y) и lcm(x, y) для него будут разными выражениями и условия, их содержащие, будут считаться непохожими. Чтобы выключить такое поведение, надо присвоить этому параметру значение 0.

  • BloatedArray (отлавливает слишком многомерные массивы)

    • MAX_DIMENSIONS (по умолчанию равен 2) — максимальная разрешенная размерность массива. При значении по умолчанию int arr[][] будет разрешен, а int arr[][][] будет запрещен.

  • LambdaFunction (отлавливает лямбда-функции)

  • LongMethod (встроен в oclint, отлавливает длинные методы)

    • LONG_METHOD (по умолчанию равен 50) — максимальная разрешенная длина метода (в строках)

  • GotoStatment (встроен в oclint, отлавливает goto)