Утилита Clang 'scan-build' не работает с 'make' - PullRequest
2 голосов
/ 30 мая 2019

Я пытаюсь статически анализировать мой код с помощью инструмента статического анализа кода Clang scan-build, и когда я запускаю код с помощью команды scan-build g++, он выдает сообщение об ошибке, но когда я пытаюсь сделать то же самоеС помощью CMake и команды scan-build make он сообщает, что ошибок не найдено.

Я уже пытался заменить переменные CC и CXX командой экспорта bash, использовал --use_cc и --use_c++ помечает и строит отдельные цели, используя scan-build make TARGET.Все это не привело меня к правильному решению, и я боюсь, что scan-build не сможет работать с CMake / make.

  • Clang версия 8.0.0 (tags / RELEASE_800 / final)
  • Gcc версии 7.4.0 (Ubuntu 7.4.0-1ubuntu1 ~ 18.04)

Вот простой пример.

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;
}

Текущее поведение g ++:

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 & make:

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.

1 Ответ

0 голосов
/ 02 июня 2019

Все инструменты статического анализа (и другие связанные с исходным кодом) для C / C ++ должны дублировать процесс компиляции для каждого исходного файла в вашем проекте. Чтобы все было правильно, им нужно иметь все параметры компиляции (например, определения макросов и включаемые каталоги), которые использовались во время реальной компиляции.

Есть несколько способов сделать это. Не вдаваясь в подробности о других подходах, вот как scan-build делает это. Он заменяет реальный компилятор исполняемым файлом-оберткой, получает все команды компилятора из системы сборки, выполняет свою работу и передает все те же параметры реальному компилятору.

Именно поэтому прямые команды SET для компилятора в вашем файле CMakeLists.txt не позволили scan-build выполнить свою задачу. Он будет работать как с gcc , так и с clang , но вы не должны жестко их кодировать и использовать вместо них переменные окружения CC и CXX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...