web-dev-qa-db-fra.com

Ignorer les en-têtes du système dans Clang-Tidy

tldr;> Comment masquer les avertissements des en-têtes système dans clang-tidy?

J'ai l'exemple de fichier source minimal suivant, qui déclenche un avertissement net dans les en-têtes du système:

#include <future>

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

L'appeler avec libstdc ++ 7.0.1 en utilisant clang-tidy 4.0.0 sur Ubuntu 17.04:

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

les rendements

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
    }

Je souhaite masquer les avertissements dans les en-têtes du système. J'ai essayé ce qui suit:

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

mais l'avertissement reste visible.

18
Heinzi

J'ai également rencontré ce problème et j'ai passé un certain temps à essayer de le comprendre, mais je ne pouvais pas voir un moyen de désactiver ce type d'avertissement dans Clang-Tidy.

En lisant cette discussion sur le traqueur de problèmes LLVM concernant un problème similaire , j'ai l'impression que le problème est que du point de vue de clang-tidy, l'avertissement se trouve en fait dans main.cpp, car l'appel à set_value vient de là.

Ma solution de contournement a consisté à désactiver les vérifications de l'analyse statique dans clang-tidy et à utiliser l'utilitaire scan-build pour exécuter l'analyse statique de clang, ce qui semble éviter ces problèmes. Par exemple, en utilisant votre 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.

L'analyseur trouve la même erreur dans un en-tête du système, mais il est suffisamment intelligent pour ne pas l'inclure dans le rapport final. ("Aucun bogue trouvé")

Vous devrez toujours exécuter clang-tidy séparément si vous êtes intéressé par les avertissements de type guide de style, comme modernize-* ou readability-*.

3
Jason Creighton