tldr;> Как скрыть предупреждения от системных заголовков в clang-tidy?
У меня есть следующий минимальный пример исходного файла, который вызывает предупреждение clang-tidy в системных заголовках:
#include <future>
int main() {
std::promise<int> p;
p.set_value(3);
}
Вызов его с помощью libstdc ++ 7.0.1 с использованием clang-tidy 4.0.0 в Ubuntu 17.04:
$ clang-tidy main.cpp -extra-arg=-std=c++14
доходность
Running without flags.
1 warning generated.
/usr/lib/gcc/x86_64-linux-gnu/7.0.1/../../../../include/c++/7.0.1/mutex:693:5: warning: Address of stack memory associated with local variable '__callable' is still referred to by the global variable '__once_callable' upon returning to the caller. This will be a dangling reference [clang-analyzer-core.StackAddressEscape]
}
^
/home/user/main.cpp:5:3: note: Calling 'promise::set_value'
p.set_value(3);
^
/usr/lib/gcc/x86_64-linux-gnu/7.0.1/../../../../include/c++/7.0.1/future:1094:9: note: Calling '_State_baseV2::_M_set_result'
{ _M_future->_M_set_result(_State::__setter(this, std::move(__r))); }
^
/usr/lib/gcc/x86_64-linux-gnu/7.0.1/../../../../include/c++/7.0.1/future:401:2: note: Calling 'call_once'
call_once(_M_once, &_State_baseV2::_M_do_set, this,
^
/usr/lib/gcc/x86_64-linux-gnu/7.0.1/../../../../include/c++/7.0.1/mutex:691:11: note: Assuming '__e' is 0
if (__e)
^
/usr/lib/gcc/x86_64-linux-gnu/7.0.1/../../../../include/c++/7.0.1/mutex:691:7: note: Taking false branch
if (__e)
^
/usr/lib/gcc/x86_64-linux-gnu/7.0.1/../../../../include/c++/7.0.1/mutex:693:5: note: Address of stack memory associated with local variable '__callable' is still referred to by the global variable '__once_callable' upon returning to the caller. This will be a dangling reference
}
Я хочу скрыть предупреждения в системных заголовках. Я попробовал следующее:
$ clang-tidy -extra-arg=-std=c++14 main.cpp -header-filter=$(realpath .) -system-headers=0
но предупреждение все еще показывает.
Я тоже столкнулся с этой проблемой и потратил некоторое время, пытаясь понять ее, но я не мог найти способ отключить этот тип предупреждения в clang-tidy.
От чтения это обсуждение трекера LLVM по аналогичной проблеме, У меня создается впечатление, что проблема в том, что с точки зрения Clang-Tidy, предупреждение на самом деле находится в main.cpp
потому что призыв к set_value
оттуда
Мой обходной путь состоял в том, чтобы отключить проверки статического анализа в clang-tidy и использовать утилита сканирования-сборки запустить статический анализ Clang, который, кажется, избежать этих проблем. Например, используя ваш main.cpp
:
$ scan-build-3.9 clang++ -std=c++14 main.cpp
scan-build: Using '/usr/lib/llvm-3.9/bin/clang' for static analysis
In file included from main.cpp:1:
In file included from /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/future:39:
/usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/mutex:621:11: warning: Address of stack memory associated with local variable '__callable' is still referred to by the global variable '__once_callable' upon returning to the caller. This will be a dangling reference
if (__e)
^~~
1 warning generated.
scan-build: Removing directory '/tmp/scan-build-2017-12-02-112018-13035-1' because it contains no reports.
scan-build: No bugs found.
Анализатор находит ту же ошибку в системном заголовке, но он достаточно умен, чтобы не включать ее в окончательный отчет. («Ошибок не найдено»)
Вам все равно нужно будет запускать clang-tidy отдельно, если вы заинтересованы в предупреждениях типа руководства по стилю, например modernize-*
или же readability-*
,
Других решений пока нет …