Closed jcdkiki closed 4 months ago
Хотелось бы еще поинтересоваться насчет Вашей терминологии: какая мотивация использовать слово "критерий"? В документации oclint`а используется термин "rule", прямой перевод -- "правило", никак не "критерий"
Против слова "правило" ничего не имею, использовал "критерий" просто потому, что не сильно заглядывал в код.
Чуть позже постараюсь прокомментировать и дополнить.
Что сделано:
install-oclint.sh
добавлена установка самого бинарника oclint
.build_oclint.sh
вынесен в отдельную переменную. Имя переменной спорно (OCLINT_22_02_COMMIT
)... С одной стороны, этот репозиторий рассчитал на конкретную версию OCLint, а с другой стороны никто не мешает попробовать другие.examples
. Про них информация в README.При пересборке почему-то не подтянулись уже собранные объектники_
При пересборке чего именно? Если при пересборке кастомных критериев, то не знаю в чем дело. Если же при пересборке самого OCLint, то:
.so
и .a
), которые там собираются. Нужны они, поскольку они линкуются с нашими критериями.build
внутри oclint/oclint-scripts
, насколько я понимаю, собирает oclint
без никаких лишних телодвижений, ОДНАКО у меня build
зависает на одном из пунктов (зависает настолько, что компьютер перестает реагировать на любые нажатия клавиш и движения мышью, перезагружаюсь зажатием кнопки питания)Будет ли работать с компилятором gcc, которые используется в проверках?
У меня работает (Debian 12). Остальное не могу знать.
GlobalVariableRule отлавливает глобальные и static переменные
test-gcc.sh
, но не знаю параметров oclint. которые нужно передавать.Создал один большой Makefile, заменяющий все .sh скрипты для установки и сборки всего подряд. Про него можно почитать в обновленном wiki.
README.md тоже был обновлен
Доделанный 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
Не смог запустить
Вроде всё делал по инструкции, а сборка сломалась
➜ 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+/-.
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
Этот код, похоже, не будет ничего собирать, однако доверия он не вызывает.
Хотелось бы услышать комментарии и критику, в частности критику tester.py. По ощущениям сделал грязь.