Я пытаюсь статически проанализировать свой код с помощью инструмента анализа статического кода Clang scan-build
, и когда я запускаю код с помощью команды scan-build g++
, он предоставляет мне отчет об ошибке, но когда я пытаюсь сделать то же самое с помощью CMake и команды scan-build make
, мне пишет, что багов не обнаружено.
Я уже пробовал подставлять переменные CC
и CXX
командой bash export, использовал флаги --use_cc
и --use_c++
и строил отдельные цели с помощью scan-build make TARGET
. Все это не привело меня к правильному решению, и я боюсь, что scan-build
не сможет работать с CMake/make.
Вот простой пример.
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
set(CMAKE_C_COMPILER "usr/bin/clang")
set(CMAKE_CXX_COMPILER "usr/bin/clang++")
set(CMAKE_AR "usr/bin/llvm-ar")
set(CMAKE_LINKER "usr/bin/llvm-ld")
set(CMAKE_NM "usr/bin/llvm-nm")
set(CMAKE_OBJDUMP "usr/bin/llvm-objdump")
set(CMAKE_RANLIB "usr/bin/llvm-ranlib")
project(scan-build-test)
add_executable(${PROJECT_NAME} main.cpp)
main.cpp
#include <iostream>
int main()
{
int *a;
std::cout << a << std::endl;
}
scan-build g++ main.cpp -o main
scan-build: Using 'usr/bin/clang-8' for static analysis main.cpp:6:2: warning: 1st function call argument is an uninitialized value
std::cout << a << std::endl;
^~~~~~~~~~~~~~
1 warning generated.
scan-build: 1 bug found.
scan-build: Run 'scan-view /tmp/scan-build-2019-05-30-134021-30676-1' to examine bug reports.`
cmake .
scan-build make
scan-build: Using 'usr/bin/clang-8' for static analysis
[ 50%] Building CXX object CMakeFiles/scan-build-test.dir/main.cpp.o
[100%] Linking CXX executable scan-build-test
[100%] Built target scan-build-test
scan-build: Removing directory '/tmp/scan-build-2019-05-30-134302-30720-1' because it contains no reports.
scan-build: No bugs found.
Нет, одно и то же No bugs found.
сообщение как для scan-build cmake .
, так и для scan-build make
Не могли бы вы показать свои журналы? Вот мой gist.github.com/snikulov/b2d6c6e0571defdd2e4dd7d529df6283
И одно замечание - я удалил все наборы из CMakeLists.txt.
Что ж, большое спасибо, ваша последняя заметка помогла мне подняться scan-build
. Я одного не понимаю - почему это не работает с компилятором clang? И почему это работает с gcc?
Все инструменты статического анализа (и другие инструменты, связанные с исходным кодом) для C/C++ должны повторять процесс компиляции для каждого исходного файла в вашем проекте. Чтобы все сделать правильно, им нужно иметь все параметры компиляции (например, определения макросов и включаемые каталоги), которые использовались во время реальной компиляции.
Есть несколько способов сделать это. Не вдаваясь в подробности о других подходах, вот как это делает scan-build
.
Он заменяет настоящий компилятор его исполняемым файлом-оболочкой, получает все команды компилятора от системы сборки, выполняет свою работу и передает все те же параметры настоящему компилятору.
Вот почему прямые команды SET для компилятора в вашем CMakeLists.txt
файле не позволили scan-build
сделать свое дело. Он будет работать как с gcc, так и с лязг, но вам не следует жестко кодировать их и вместо этого использовать переменные среды CC
и CXX
.
scan-build cmake .
попробуй это