Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ignore system headers in clang-tidy

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.

like image 784
Heinzi Avatar asked Oct 09 '17 03:10

Heinzi


People also ask

How do I disable clang-tidy checks?

If you must enable or disable particular checks, use the clang-tidy command-line format in your . clang-tidy files. The command-line format specifies a comma-separated list of positive and negative globs: positive globs add subsets of checks, and negative globs (prefixed with - ) remove subsets of checks.

What does clang-tidy do?

clang-tidy is a clang-based C++ “linter” tool. Its purpose is to provide an extensible framework for diagnosing and fixing typical programming errors, like style violations, interface misuse, or bugs that can be deduced via static analysis.

Where does clang look for headers?

Some header files ( stddef. h , stdarg. h , and others) are shipped with Clang — these are called builtin includes. Clang searches for them in a directory relative to the location of the clang binary.

How do you use clang-tidy and clang format?

clang-tidy in our project root directory and, now, we just have to run part of the previous command with the option -config='' to get the content of the . clang-tidy file as default configuration file: $> clang-tidy Example. [ch]pp -config='' -- -std=c++11 -I/usr/include/c++/5/ 2533 warnings generated.


1 Answers

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 to set_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:

$ 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. 

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-* or readability-*.

like image 194
Jason Creighton Avatar answered Oct 02 '22 11:10

Jason Creighton