moevm / oclint_extensions

2 stars 1 forks source link

New #9

Closed jcdkiki closed 4 months ago

jcdkiki commented 11 months ago

build-oclint.sh клонирует репозиторий oclint, сбрасывает его до версии 22.02 (последняя версия на данный момент) и запускает скрипт сборки oclint`а. Это нужно, чтобы собрать нужные файлы для последующей сборки СВОИХ кастомных правил.

CMakeLists.txt -- франкенштейн из файлов CMakeLists.txt oclint`а. Некоторые части были немного переписаны под нужды проекта, некоторые были слепо скопированы. Работает => не трогаю.

tester.py принимает на вход путь до папки с исходным кодом лабораторной/курсовой работы студента (Ivanov_Ivan_cw/src). Сначала скрипт определяет способ сборки. Доступны способы из блока проверки курсовой на e.moevm:

Далее в папке с исходным кодом работы скрипт создает папку для временных файлов. С этого момента скрипт работает только в ней (для чего это нужно, напишу в самом конце (!!!)). Все файлы копируются во временную папку, после чего в ней запускается bear -- утилита для генерации compile_commands.json. Без этого JSON файла oclint будет проверять все файлы по-отдельности без какого-либо контекста, это нам не нужно.

Также правило TooManyConsecutiveIfStatements было мной переименовано в TooLongIfSequence, потому что так банально короче. Теперь можно изменить MAX_IF_SEQUENCE_LEN (по умолчанию равно 5). Подробнее про конфигурацию oclint`а здесь

(!!!) Утилита bear полноценно СОБИРАЕТ проект со всеми вытекающими: объектные файлы, исполняемый файл, потраченное ВРЕМЯ. Если я правильно понял, изменить это никак нельзя. Если это критично, возможно стоит отказаться от bear и воспользоваться этим: https://stackoverflow.com/questions/21134120/how-to-turn-makefile-into-json-compilation-database

make --always-make --dry-run \
 | grep -wE 'gcc|g\+\+' \
 | grep -w '\-c' \
 | jq -nR '[inputs|{directory:".", command:., file: match(" [^ ]+$").string[1:]}]' \
 > compile_commands.json

Этот код, похоже, не будет ничего собирать, однако доверия он не вызывает.

Хотелось бы услышать комментарии и критику, в частности критику tester.py. По ощущениям сделал грязь.

jcdkiki commented 11 months ago

Хотелось бы еще поинтересоваться насчет Вашей терминологии: какая мотивация использовать слово "критерий"? В документации oclint`а используется термин "rule", прямой перевод -- "правило", никак не "критерий"

zmm commented 11 months ago

Против слова "правило" ничего не имею, использовал "критерий" просто потому, что не сильно заглядывал в код.

jcdkiki commented 9 months ago

Чуть позже постараюсь прокомментировать и дополнить.

jcdkiki commented 9 months ago

Что сделано:

При пересборке почему-то не подтянулись уже собранные объектники_

При пересборке чего именно? Если при пересборке кастомных критериев, то не знаю в чем дело. Если же при пересборке самого OCLint, то:

  1. Не вижу смысла его пересобирать, т.к. от этой сборки конкретно мне нужны только некоторые библиотеки (.so и .a), которые там собираются. Нужны они, поскольку они линкуются с нашими критериями.
  2. Если это действительно критично, тогда не знаю что делать. Скрипт build внутри oclint/oclint-scripts , насколько я понимаю, собирает oclint без никаких лишних телодвижений, ОДНАКО у меня build зависает на одном из пунктов (зависает настолько, что компьютер перестает реагировать на любые нажатия клавиш и движения мышью, перезагружаюсь зажатием кнопки питания)

Будет ли работать с компилятором gcc, которые используется в проверках?

У меня работает (Debian 12). Остальное не могу знать.

jcdkiki commented 9 months ago
jcdkiki commented 9 months ago

GlobalVariableRule отлавливает глобальные и static переменные

AndrewGavril commented 8 months ago
  1. Предлагаю объединить скрипты в один в виде функций, чтобы каждый скрипт был автономен и выполнял все шаги с зависимостями. Добавить скрипту аргументы для вызова нужных функций: build, intall deps, install oclint, build examples, run example . Добавьте скрипту справку по ее использованию. В качестве альтернативы можно использовать существующие скрипты, но в Makefile (там как раз можно проверить установлен ли oclint, сбилжены ли примеры и остальные зависимости для выполнения вышеописанных функций). На текущий момент readme и wiki несколько отличаются и нужно разбираться, чтобы воспроизвести результат. Скрипты должны минимизировать ошибки пользователя.
  2. После пункта 1 нужно обновить всю документацию (wiki и readme). В Readme добавить самый простой способ запуска примера, вариации запуска и использования скриптов уже можно вынести на wiki.
  3. Добавьте примеры для итогового запуска примера. Я дошел до этапа запуска test-gcc.sh, но не знаю параметров oclint. которые нужно передавать.
jcdkiki commented 8 months ago

Создал один большой Makefile, заменяющий все .sh скрипты для установки и сборки всего подряд. Про него можно почитать в обновленном wiki.

README.md тоже был обновлен

jcdkiki commented 8 months ago

55caf7e

Доделанный TooLongIfSequenceRule

Проверяет подряд идущие if-ы не только на их существование, но и смотрит, какие у этих if-ов условия. Сравнивая условия, он просто проходится по их синтаксическим деревьям.

Степень "жесткости" проверки можно настраивать. Этот критерий имеет следующие параметры:

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

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

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

Напомню, как передавать параметры OCLint`у:

через флажок -rc:

-rc=PARAMETER=VALUE

т.е. можно писать так:

examples/test-gcc.sh examples/ex-if -rc=CHECK_FUNCTION_CALL=0 -rc=MAX_IF_SEQUENCE_LEN=7
thehighestmath commented 4 months ago

Не смог запустить

Вроде всё делал по инструкции, а сборка сломалась

➜  oclint_extensions git:(new) sudo make install
[sudo] password for kirillkry: 
apt install -y ninja-build cmake bear
echo "install deps: OK"
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  cloud-guest-utils eatmydata libeatmydata1 libpkcs11-helper1 libsysmetrics1
  python-babel-localedata python3-babel python3-configobj python3-jinja2
  python3-json-pointer python3-jsonpatch python3-jsonschema python3-pyrsistent
  python3-serial
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  cmake-data dh-elpa-helper libear libfmt8 libgrpc++1 libgrpc10 libjsoncpp25
  librhash0 libspdlog1
Suggested packages:
  cmake-doc cmake-format
The following NEW packages will be installed:
  bear cmake cmake-data dh-elpa-helper libear libfmt8 libgrpc++1 libgrpc10
  libjsoncpp25 librhash0 libspdlog1 ninja-build
0 upgraded, 12 newly installed, 0 to remove and 12 not upgraded.
Need to get 9,790 kB of archives.
After this operation, 43.4 MB of additional disk space will be used.
Get:1 https://mirror.yandex.ru/ubuntu jammy/universe amd64 libfmt8 amd64 8.1.1+ds1-2 [60.2 kB]
Get:2 https://mirror.yandex.ru/ubuntu jammy/universe amd64 libgrpc10 amd64 1.30.2-3build6 [1,470 kB]
Get:3 https://mirror.yandex.ru/ubuntu jammy/universe amd64 libgrpc++1 amd64 1.30.2-3build6 [402 kB]
Get:4 https://mirror.yandex.ru/ubuntu jammy/universe amd64 libspdlog1 amd64 1:1.9.2+ds-0.2 [126 kB]
Get:5 https://mirror.yandex.ru/ubuntu jammy/universe amd64 libear amd64 3.0.18-1 [138 kB]
Get:6 https://mirror.yandex.ru/ubuntu jammy/universe amd64 bear amd64 3.0.18-1 [348 kB]
Get:7 https://mirror.yandex.ru/ubuntu jammy/main amd64 libjsoncpp25 amd64 1.9.5-3 [80.0 kB]
Get:8 https://mirror.yandex.ru/ubuntu jammy/main amd64 librhash0 amd64 1.4.2-1ubuntu1 [125 kB]
Get:9 https://mirror.yandex.ru/ubuntu jammy/main amd64 dh-elpa-helper all 2.0.9ubuntu1 [7,610 B]
Get:10 https://mirror.yandex.ru/ubuntu jammy-updates/main amd64 cmake-data all 3.22.1-1ubuntu1.22.04.2 [1,913 kB]
Get:11 https://mirror.yandex.ru/ubuntu jammy-updates/main amd64 cmake amd64 3.22.1-1ubuntu1.22.04.2 [5,010 kB]
Get:12 https://mirror.yandex.ru/ubuntu jammy/universe amd64 ninja-build amd64 1.10.1-1 [111 kB]
Fetched 9,790 kB in 2s (5,219 kB/s)    
Selecting previously unselected package libfmt8:amd64.
(Reading database ... 246958 files and directories currently installed.)
Preparing to unpack .../00-libfmt8_8.1.1+ds1-2_amd64.deb ...
Unpacking libfmt8:amd64 (8.1.1+ds1-2) ...
Selecting previously unselected package libgrpc10:amd64.
Preparing to unpack .../01-libgrpc10_1.30.2-3build6_amd64.deb ...
Unpacking libgrpc10:amd64 (1.30.2-3build6) ...
Selecting previously unselected package libgrpc++1:amd64.
Preparing to unpack .../02-libgrpc++1_1.30.2-3build6_amd64.deb ...
Unpacking libgrpc++1:amd64 (1.30.2-3build6) ...
Selecting previously unselected package libspdlog1:amd64.
Preparing to unpack .../03-libspdlog1_1%3a1.9.2+ds-0.2_amd64.deb ...
Unpacking libspdlog1:amd64 (1:1.9.2+ds-0.2) ...
Selecting previously unselected package libear:amd64.
Preparing to unpack .../04-libear_3.0.18-1_amd64.deb ...
Unpacking libear:amd64 (3.0.18-1) ...
Selecting previously unselected package bear.
Preparing to unpack .../05-bear_3.0.18-1_amd64.deb ...
Unpacking bear (3.0.18-1) ...
Selecting previously unselected package libjsoncpp25:amd64.
Preparing to unpack .../06-libjsoncpp25_1.9.5-3_amd64.deb ...
Unpacking libjsoncpp25:amd64 (1.9.5-3) ...
Selecting previously unselected package librhash0:amd64.
Preparing to unpack .../07-librhash0_1.4.2-1ubuntu1_amd64.deb ...
Unpacking librhash0:amd64 (1.4.2-1ubuntu1) ...
Selecting previously unselected package dh-elpa-helper.
Preparing to unpack .../08-dh-elpa-helper_2.0.9ubuntu1_all.deb ...
Unpacking dh-elpa-helper (2.0.9ubuntu1) ...
Selecting previously unselected package cmake-data.
Preparing to unpack .../09-cmake-data_3.22.1-1ubuntu1.22.04.2_all.deb ...
Unpacking cmake-data (3.22.1-1ubuntu1.22.04.2) ...
Selecting previously unselected package cmake.
Preparing to unpack .../10-cmake_3.22.1-1ubuntu1.22.04.2_amd64.deb ...
Unpacking cmake (3.22.1-1ubuntu1.22.04.2) ...
Selecting previously unselected package ninja-build.
Preparing to unpack .../11-ninja-build_1.10.1-1_amd64.deb ...
Unpacking ninja-build (1.10.1-1) ...
Setting up ninja-build (1.10.1-1) ...
Setting up libgrpc10:amd64 (1.30.2-3build6) ...
Setting up dh-elpa-helper (2.0.9ubuntu1) ...
Setting up libjsoncpp25:amd64 (1.9.5-3) ...
Setting up librhash0:amd64 (1.4.2-1ubuntu1) ...
Setting up libfmt8:amd64 (8.1.1+ds1-2) ...
Setting up libspdlog1:amd64 (1:1.9.2+ds-0.2) ...
Setting up cmake-data (3.22.1-1ubuntu1.22.04.2) ...
Setting up libgrpc++1:amd64 (1.30.2-3build6) ...
Setting up libear:amd64 (3.0.18-1) ...
Setting up bear (3.0.18-1) ...
Setting up cmake (3.22.1-1ubuntu1.22.04.2) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.8) ...
install deps: OK
Cloning into 'oclint-json-compilation-database'...
remote: Enumerating objects: 91, done.
remote: Total 91 (delta 0), reused 0 (delta 0), pack-reused 91
Receiving objects: 100% (91/91), 18.16 KiB | 476.00 KiB/s, done.
Resolving deltas: 100% (41/41), done.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  514M  100  514M    0     0  10.1M      0  0:00:50  0:00:50 --:--:-- 10.2M
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
LLVM_ROOT: /home/kirillkry/moevm/oclint_extensions/oclint/build/llvm-install
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.11") 
-- Found LLVM LLVM_PACKAGE_VERSION: 13.0.1 - LLVM_VERSION_RELEASE: 13.0.1
-- Using LLVMConfig.cmake in: /home/kirillkry/moevm/oclint_extensions/oclint/build/llvm-install/lib/cmake/llvm
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kirillkry/moevm/oclint_extensions/oclint/build/oclint-core
[13/13] Linking CXX static library lib/libOCLintCore.a
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
LLVM_ROOT: /home/kirillkry/moevm/oclint_extensions/oclint/build/llvm-install
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.11") 
-- Found LLVM LLVM_PACKAGE_VERSION: 13.0.1 - LLVM_VERSION_RELEASE: 13.0.1
-- Using LLVMConfig.cmake in: /home/kirillkry/moevm/oclint_extensions/oclint/build/llvm-install/lib/cmake/llvm
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kirillkry/moevm/oclint_extensions/oclint/build/oclint-metrics
[5/5] Linking CXX static library lib/libOCLintMetric.a
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
LLVM_ROOT: /home/kirillkry/moevm/oclint_extensions/oclint/build/llvm-install
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.11") 
-- Found LLVM LLVM_PACKAGE_VERSION: 13.0.1 - LLVM_VERSION_RELEASE: 13.0.1
-- Using LLVMConfig.cmake in: /home/kirillkry/moevm/oclint_extensions/oclint/build/llvm-install/lib/cmake/llvm
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kirillkry/moevm/oclint_extensions/oclint/build/oclint-rules
[151/151] Linking CXX shared library rules.dl/libUnusedMethodParameterRule.so
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
LLVM_ROOT: /home/kirillkry/moevm/oclint_extensions/oclint/build/llvm-install
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.11") 
-- Found LLVM LLVM_PACKAGE_VERSION: 13.0.1 - LLVM_VERSION_RELEASE: 13.0.1
-- Using LLVMConfig.cmake in: /home/kirillkry/moevm/oclint_extensions/oclint/build/llvm-install/lib/cmake/llvm
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kirillkry/moevm/oclint_extensions/oclint/build/oclint-reporters
[12/12] Linking CXX shared library reporters.dl/libJSONReporter.so
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
LLVM_ROOT: /home/kirillkry/moevm/oclint_extensions/oclint/build/llvm-install
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.11") 
-- Found LLVM LLVM_PACKAGE_VERSION: 13.0.1 - LLVM_VERSION_RELEASE: 13.0.1
-- Using LLVMConfig.cmake in: /home/kirillkry/moevm/oclint_extensions/oclint/build/llvm-install/lib/cmake/llvm
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kirillkry/moevm/oclint_extensions/oclint/build/oclint-driver
[7/14] Building CXX object lib/CMakeFiles/OCLintDriver.dir/ConfigFile.cpp.o
/home/kirillkry/moevm/oclint_extensions/oclint/oclint-driver/lib/ConfigFile.cpp: In function ‘llvm::Optional<bool> createOptionalBool(oclint::option::TriState)’:
/home/kirillkry/moevm/oclint_extensions/oclint/oclint-driver/lib/ConfigFile.cpp:181:1: warning: control reaches end of non-void function [-Wreturn-type]
  181 | }
      | ^
[14/14] Linking CXX executable bin/oclint-22.02
build oclint: OK
cp -r oclint/build/oclint-release/lib/* /usr/local/lib/
cp -r oclint/build/oclint-release/bin/* /usr/local/bin/
echo "install oclint: OK"
install oclint: OK
Error: could not load cache
cp: cannot stat 'compile_commands.json': No such file or directory
CMake Error: Error processing file: /home/kirillkry/moevm/oclint_extensions/build/cmake_install.cmake
➜  oclint_extensions git:(new) neofetch
            .-/+oossssoo+/-.               kirillkry@i110745558 
        `:+ssssssssssssssssss+:`           -------------------- 
      -+ssssssssssssssssssyyssss+-         OS: Ubuntu 22.04.4 LTS x86_64 
    .ossssssssssssssssssdMMMNysssso.       Host: Latitude 5521 
   /ssssssssssshdmmNNmmyNMMMMhssssss/      Kernel: 6.5.0-41-generic 
  +ssssssssshmydMMMMMMMNddddyssssssss+     Uptime: 22 hours, 30 mins 
 /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/    Packages: 2117 (dpkg), 12 (snap) 
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Shell: zsh 5.8.1 
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   Resolution: 1920x1080, 2560x1440 
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   DE: GNOME 42.9 
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   WM: Mutter 
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   WM Theme: Adwaita 
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Theme: Yaru-dark [GTK2/3] 
 /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/    Icons: Yaru [GTK2/3] 
  +sssssssssdmydMMMMMMMMddddyssssssss+     Terminal: gnome-terminal 
   /ssssssssssshdmNNNNmyNMMMMhssssss/      CPU: 11th Gen Intel i7-11850H (16) @ 
    .ossssssssssssssssssdMMMNysssso.       GPU: Intel TigerLake-H GT1 [UHD Grap 
      -+sssssssssssssssssyyyssss+-         Memory: 6293MiB / 31814MiB 
        `:+ssssssssssssssssss+:`
            .-/+oossssoo+/-.