Clang ++ 3.3 static analyzer, how to get rid of false positive?

I ran a static analyzer clang 3.3for my various projects. Except for some problems that were my own mistake (which is to be expected, I would be very sad and very smug otherwise), everything went pretty smoothly, except for the following problem regarding the move constructor std::function, which is false positive.

Before discussing this further, here is a simple test case:

int main() {
  std::function<void ()> f1;
  std::function<void ()> f2 = std::move(f1);
}

Run it through clang++ -std=c++11 --analyze -Xanalyzer -analyzer-output=text foo.cpp(which uses GCC libstdc++- namely version 4.8.1 - not clang libc++), and you will get the following trace:

In file included from foo.cpp:1:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/iostream:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:38:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ios:40:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/char_traits.h:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_algobase.h:64:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_pair.h:59:
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:175:7: warning: Assigned value is garbage or undefined
      _Tp __tmp = _GLIBCXX_MOVE(__a);
      ^~~~~~~~~   ~~~~~~~~~~~~~~~~~~
foo.cpp:30:31: note: Calling move constructor for 'function'
  std::function<void ()> f2 = std::move(f1);
                              ^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/functional:2232:2: note: Calling 'function::swap'
        __x.swap(*this);
        ^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/functional:2359:2: note: Calling 'swap'
        std::swap(_M_invoker, __x._M_invoker);
        ^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:175:19: note: Calling 'move'
      _Tp __tmp = _GLIBCXX_MOVE(__a);
                  ^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:142:30: note: expanded from macro '_GLIBCXX_MOVE'
#define _GLIBCXX_MOVE(__val) std::move(__val)
                             ^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:175:19: note: Returning from 'move'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:142:30: note: expanded from macro '_GLIBCXX_MOVE'
#define _GLIBCXX_MOVE(__val) std::move(__val)
                             ^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:175:7: note: Assigned value is garbage or undefined
      _Tp __tmp = _GLIBCXX_MOVE(__a);
      ^
1 warning generated.

, std::function(std::function&&) swap. ( clang):

  • f1
  • f2 , ,
  • f1 f2, swap
  • f2 f1, f1 f2 ..
  • - f1, , ... ?

, . , , , std::function _Function_base, , (.. _M_manager), , clang _M_invoker .

- , , . GCC function : _M_manager , ( _M_invoker) "" .

GCC function, clang. , , , , , .

clang ?

, , clang 3.3 GCC libstdc++ 4.8.1.


. clang 3.4 , , , , . , 3,4 (Debian Jessie), , .

+4
1

:

, TU

#ifndef __clang_analyzer__
...
#endif

. , , .

0

All Articles