• Marko Mäkelä's avatar
    MDEV-20377: Make WITH_MSAN more usable · c36834c8
    Marko Mäkelä authored
    MemorySanitizer (clang -fsanitize=memory) requires that all code
    be compiled with instrumentation enabled. The only exception is the
    C runtime library. Failure to use instrumented libraries will cause
    bogus messages about memory being uninitialized.
    
    In WITH_MSAN builds, we must avoid calling getservbyname(),
    because even though it is a standard library function, it is
    not instrumented, not even in clang 10.
    
    Note: Before MariaDB Server 10.5, ./mtr will typically fail
    due to the old PCRE library, which was updated in MDEV-14024.
    
    The following cmake options were tested on 10.5
    in commit 94d0bb4d:
    
    cmake \
    -DCMAKE_C_FLAGS='-march=native -O2' \
    -DCMAKE_CXX_FLAGS='-stdlib=libc++ -march=native -O2' \
    -DWITH_EMBEDDED_SERVER=OFF -DWITH_UNIT_TESTS=OFF -DCMAKE_BUILD_TYPE=Debug \
    -DWITH_INNODB_{BZIP2,LZ4,LZMA,LZO,SNAPPY}=OFF \
    -DPLUGIN_{ARCHIVE,TOKUDB,MROONGA,OQGRAPH,ROCKSDB,CONNECT,SPIDER}=NO \
    -DWITH_SAFEMALLOC=OFF \
    -DWITH_{ZLIB,SSL,PCRE}=bundled \
    -DHAVE_LIBAIO_H=0 \
    -DWITH_MSAN=ON
    
    MEM_MAKE_DEFINED(): An alias for VALGRIND_MAKE_MEM_DEFINED()
    and __msan_unpoison().
    
    MEM_GET_VBITS(), MEM_SET_VBITS(): Aliases for
    VALGRIND_GET_VBITS(), VALGRIND_SET_VBITS(), __msan_copy_shadow().
    
    InnoDB: Replace the UNIV_MEM_ macros with corresponding MEM_ macros.
    
    ut_crc32_8_hw(), ut_crc32_64_low_hw(): Use the compiler built-in
    functions instead of inline assembler when building WITH_MSAN.
    This will require at least -msse4.2 when building for IA-32 or AMD64.
    The inline assembler would not be instrumented, and would thus cause
    bogus failures.
    c36834c8
mtr0mtr.cc 22.5 KB