tldr;> How do I hide warnings from system headers in clang-tidy?
I have the following minimal example source file, which triggers a clang-tidy warning in the system headers:
#include <future>
int main() {
std::promise<int> p;
p.set_value(3);
}
Calling it with libstdc++ 7.0.1 using clang-tidy 4.0.0 on Ubuntu 17.04:
$ clang-tidy main.cpp -extra-arg=-std=c++14
yields
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
}
I want to hide warnings in system headers. I tried the following:
$ clang-tidy -extra-arg=-std=c++14 main.cpp -header-filter=$(realpath .) -system-headers=0
but the warning still shows.
I ran into this issue as well, and spent some time trying to figure it out, but I could not see a way to disable this type of warning in clang-tidy.
From reading this discussion on the LLVM issue tracker regarding a similar issue, I get the impression that the problem is that from clang-tidy's perspective, the warning is actually located in
main.cpp
, because the call toset_value
is from there.My workaround has been to disable the static analysis checks in clang-tidy, and use the scan-build utility to run clang's static analysis, which seems to avoid these problems. For example, using your
main.cpp
:The analyzer finds the same error in a system header, but it's smart enough not to include it in the final report. ("No bugs found")
You'll still need to run clang-tidy separately if you are interested in the style guide type warnings, like
modernize-*
orreadability-*
.I initially came to the conclusion that this was not possible, but I've got a hack that gets pretty close.
When I compile I use CMAKE_EXPORT_COMPILE_COMMANDS=ON which generates a compile_commands.json file showing what commands were passed to the compiler for each cpp file compiled. When I run
clang-tidy
I give it the -p option to point to the directory containing this file.A typical entry in this file looks something like this:
If I re-write this file so that
-I/opt/thirdparty/include
becomes-isystem /opt/thirdparty/include
the previously problematic headers in /opt/third-party/include are ignored because clang-tidy will see them as system headers.I use
sed
to rewrite the file