Skip to content

[Msan]False positive reported of std::__1::basic_istream<char, std::__1::char_traits<char>>& std::__1::getline #151952

@zhaojiangkun-1

Description

@zhaojiangkun-1

When I use getline, there are some warnings even though it's initialized.
Is this a false positive behavior of getline?

clang++ -g -fsanitize=memory -fsanitize-recover=memory -fPIE -fpie test.cpp
#include <string>
class A
{
public:
    A () {}
    ~A() {}
    void func1() noexcept;
};

void A::func1() noexcept
{
    std::string str = "heloworld";
    getline(std::cin, str, '\n');
    std::cout << str << std::endl;
}

int main() {
    A a {};
    a.func1();
    return 0;
}

Compiler version:

clang version 15.0.4
Target: aarch64-unknown-linux-gnu
Thread model: posix
[root@xxxxx]# ./msan-run
==3544==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0xaaaab0ade4b4 in std::__1::basic_istream<char, std::__1::char_traits<char>>& std::__1::getline<char, std::__1::char_traits<char>, std::__1::allocator<char>>(std::__1::basic_istream<char, std::__1::char_traits<char>>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>&, char) /xxxxx/usr/include/c++/v1/istream:1507:9
    #1 0xaaaab0ade024 in A::func1() /home/ci/workspace/tmp-warning/test.cpp:14:5
    #2 0xaaaab0ade164 in main /home/ci/workspace/tmp-warning/test.cpp:20:7
    #3 0xe7fbe5a2ae6c  (/usr/lib64/libc.so.6+0x2ae6c)
    #4 0xe7fbe5a2af48 in __libc_start_main (/usr/lib64/libc.so.6+0x2af48)
    #5 0xaaaab0a5b52c in _start /xxxx/aarch64-aos-linux/glibc/2.34-AOS4.0/glibc-2.34/csu/../sysdeps/aarch64/start.S:81

SUMMARY: MemorySanitizer: use-of-uninitialized-value /xxxx/usr/include/c++/v1/istream:1507:9 in std::__1::basic_istream<char, std::__1::char_traits<char>>& std::__1::getline<char, std::__1::char_traits<char>, std::__1::allocator<char>>(std::__1::basic_istream<char, std::__1::char_traits<char>>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>&, char)
==3544==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0xaaaab0adf534 in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>::clear[abi:v15004]() /xxxxxxx/usr/include/c++/v1/string:3328:9
    #1 0xaaaab0ade4e8 in std::__1::basic_istream<char, std::__1::char_traits<char>>& std::__1::getline<char, std::__1::char_traits<char>, std::__1::allocator<char>>(std::__1::basic_istream<char, std::__1::char_traits<char>>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>&, char) /xxxxxxx/usr/include/c++/v1/istream:1513:19
    #2 0xaaaab0ade024 in A::func1() /home/ci/workspace/tmp-warning/test.cpp:14:5
    #3 0xaaaab0ade164 in main /home/ci/workspace/tmp-warning/test.cpp:20:7
    #4 0xe7fbe5a2ae6c  (/usr/lib64/libc.so.6+0x2ae6c)
    #5 0xe7fbe5a2af48 in __libc_start_main (/usr/lib64/libc.so.6+0x2af48)
    #6 0xaaaab0a5b52c in _start /xxxxxx/aarch64-aos-linux/glibc/2.34-AOS4.0/glibc-2.34/csu/../sysdeps/aarch64/start.S:81

SUMMARY: MemorySanitizer: use-of-uninitialized-value /xxxxx/usr/include/c++/v1/string:3328:9 in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>::clear[abi:v15004]()
hello
==3544==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0xaaaab0ae106c in std::__1::basic_ostream<char, std::__1::char_traits<char>>& std::__1::__put_character_sequence<char, std::__1::char_traits<char>>(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, char const*, unsigned long) /xxxxx/usr/include/c++/v1/ostream:760:13
    #1 0xaaaab0adeed0 in std::__1::basic_ostream<char, std::__1::char_traits<char>>& std::__1::operator<<<char, std::__1::char_traits<char>, std::__1::allocator<char>>(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) /xxxxx/usr/include/c++/v1/ostream:1086:12
    #2 0xaaaab0ade060 in A::func1() /home/ci/workspace/tmp-warning/test.cpp:15:15
    #3 0xaaaab0ade164 in main /home/ci/workspace/tmp-warning/test.cpp:20:7
    #4 0xe7fbe5a2ae6c  (/usr/lib64/libc.so.6+0x2ae6c)
    #5 0xe7fbe5a2af48 in __libc_start_main (/usr/lib64/libc.so.6+0x2af48)
    #6 0xaaaab0a5b52c in _start /xxxxxx/aarch64-aos-linux/glibc/2.34-AOS4.0/glibc-2.34/csu/../sysdeps/aarch64/start.S:81

SUMMARY: MemorySanitizer: use-of-uninitialized-value /xxxxxx/usr/include/c++/v1/ostream:760:13 in std::__1::basic_ostream<char, std::__1::char_traits<char>>& std::__1::__put_character_sequence<char, std::__1::char_traits<char>>(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, char const*, unsigned long)
hello
MemorySanitizer: 3 warnings reported.

Metadata

Metadata

Assignees

No one assigned

    Labels

    compiler-rt:msanMemory sanitizerfalse-positiveWarning fires when it should notlibc++libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions