I get exactly the same results from centos7, clang-3.6.1, built from source, using the fedora rpm specifier. Ubuntu 14.04, clang-3.4
Using the instructions from the wiki here https://github.com/google/sanitizers/wiki/MemorySanitizerLibcxxHowTo as much as possible. The page was updated 6 months ago.
googlest revision 613 still uses tr1
In file included from /home/hal/googletest/src/gtest-all.cc:39: In file included from /home/hal/googletest/include/gtest/gtest.h:58: In file included from /home/hal/googletest/include/gtest/internal/gtest-internal.h:40: /home/hal/googletest/include/gtest/internal/gtest-port.h:507:13: fatal error: 'tr1/tuple' file not found # include <tr1/tuple> // NOLINT ^ 1 error generated.
update googletest to tip (746) and compile it with the following warning
โ [ hal@davis 9:54 ~/gtest-msan] make Scanning dependencies of target gtest [ 50%] Building CXX object CMakeFiles/gtest.dir/src/gtest-all.cc.o clang: warning: -lc++abi: 'linker' input unused clang: warning: -lc++abi: 'linker' input unused clang: warning: argument unused during compilation: '-L/home/hal/libcxx_msan/lib' clang: warning: argument unused during compilation: '-L/home/hal/libcxx_msan/lib' Linking CXX static library libgtest.a
And the trivial suggested case from this page was not found with msan
[==========] Running 1 test from 1 test case. [----------] Global test environment set-up. [----------] 1 test from FooTest [ RUN ] FooTest.Foo test.cc:7: Failure Value of: foo[4] Actual: '\0' Expected: 'z' Which is: 'z' (122, 0x7A) [ FAILED ] FooTest.Foo (1 ms) [----------] 1 test from FooTest (1 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test case ran. (1 ms total) [ PASSED ] 0 tests. [ FAILED ] 1 test, listed below: [ FAILED ] FooTest.Foo 1 FAILED TEST
I have a project in which valgrind barfs due to the use of some very large mmaps, so memory sanitation would be really useful. If I do something wrong. It seems that googletest is somehow suppressing the error. Remove google test and convert test case to
if (foo [4] == 'z') std :: cout <"this is z" <std :: cps;
Starts an obvious error message as expected
==29128== WARNING: MemorySanitizer: use-of-uninitialized-value
Is it possible to use memory defragmentation with the unit test library?