2017-10-09 81 views
6

tldr;> Jak ukryć ostrzeżenia od nagłówków systemowych w brzękiem-uporządkowane?Ignoruj ​​nagłówki systemowe w dzyń-schludny

Mam następujący plik źródłowy minimalny przykład, który wyzwala ostrzeżenie clang-uporządkowane w nagłówkach System:

#include <future> 

int main() { 
    std::promise<int> p; 
    p.set_value(3); 
} 

nazywając ją z libstdC++ 7.0.1 używając dzyń-schludny 4.0.0 na Ubuntu 17.04 :

$ clang-tidy main.cpp -extra-arg=-std=c++14 

daje

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 
    } 

chcę ukryć ostrzec w nagłówkach systemu. Próbowałem:

$ clang-tidy -extra-arg=-std=c++14 main.cpp -header-filter=$(realpath .) -system-headers=0 

, ale nadal wyświetla się ostrzeżenie.

Odpowiedz

2

Pobiegłem do tej kwestii, jak również i spędził trochę czasu próbując zrozumieć to, ale nie mogę zobaczyć sposób, aby wyłączyć ten rodzaj ostrzeżenia w brzękiem-schludny.

Od czytania this discussion on the LLVM issue tracker regarding a similar issue, mam wrażenie, że problemem jest to, że z punktu widzenia dzyń-schludny, The ostrzegawczy jest rzeczywiście znajduje się w main.cpp, ponieważ wywołanie set_value jest stamtąd.

Moim obejściem było wyłączenie sprawdzania analizy statycznej w klang-tidy i użycie scan-build utility do wykonania analizy statycznej klanu, która wydaje się unikać tych problemów. Na przykład, przy użyciu 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. 

Analizator znajdzie ten sam błąd w nagłówku systemowym, ale jest na tyle mądry, by nie uwzględnić go w raporcie końcowym. ("Nie znaleziono błędów")

Będziesz nadal musiał osobno prowadzić kampanię, jeśli jesteś zainteresowany ostrzeżeniami typu przewodnika stylu, takimi jak modernize-* lub readability-*.