Утилита Clang «scan-build» не работает с «make»

Я пытаюсь статически проанализировать свой код с помощью инструмента анализа статического кода 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.

  • Clang версии 8.0.0 (теги/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;
}

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

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.
scan-build cmake . попробуй это
Sergei Nikulov 31.05.2019 12:55

Нет, одно и то же No bugs found. сообщение как для scan-build cmake ., так и для scan-build make

Yevhenii Mamontov 31.05.2019 13:27

Не могли бы вы показать свои журналы? Вот мой gist.github.com/snikulov/b2d6c6e0571defdd2e4dd7d529df6283

Sergei Nikulov 31.05.2019 13:53

И одно замечание - я удалил все наборы из CMakeLists.txt.

Sergei Nikulov 31.05.2019 14:02

Что ж, большое спасибо, ваша последняя заметка помогла мне подняться scan-build. Я одного не понимаю - почему это не работает с компилятором clang? И почему это работает с gcc?

Yevhenii Mamontov 31.05.2019 16:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
1 738
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Другие вопросы по теме