А вот ещё интересное наткнулся=)
Вот есть простой код:
#include <QStringList>
QStringList list = {QStringLiteral("hello"), QStringLiteral("world")}; // global static
int main(int argc, char *argv[])
{
return 0;
}
Собираем с -fsanitize=memory -fno-omit-frame-pointer, получаем
==105522==WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x49aa17 in QList<QString>::node_copy(QList<QString>::Node*, QList<QString>::Node*, QList<QString>::Node*) /home/ivk/Qt/5.12.3/gcc_64/include/QtCore/qlist.h:477:13
#1 0x49a5da in QList<QString>::detach_helper(int) /home/ivk/Qt/5.12.3/gcc_64/include/QtCore/qlist.h:791:9
#2 0x499d8d in QList<QString>::reserve(int) /home/ivk/Qt/5.12.3/gcc_64/include/QtCore/qlist.h:575:13
#3 0x499961 in QList<QString>::QList(std::initializer_list<QString>) /home/ivk/Qt/5.12.3/gcc_64/include/QtCore/qlist.h:165:7
#4 0x498ee8 in QStringList::QStringList(std::initializer_list<QString>) /home/ivk/Qt/5.12.3/gcc_64/include/QtCore/qstringlist.h:110:63
#5 0x41f527 in __cxx_global_var_init.1 /home/ivk/programming/test-cpp1/main.cpp:29:20
#6 0x41f7ad in _GLOBAL__sub_I_main.cpp /home/ivk/programming/test-cpp1/main.cpp
#7 0x49d554 in __libc_csu_init (/home/ivk/programming/build-test-cpp1-Desktop_Qt_5_12_3_clang_64bit-Debug/Debug/install-root/usr/local/bin/test-cpp1+0x49d554)
#8 0x7f8e29d92029 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24029)
#9 0x41f7d9 in _start (/home/ivk/programming/build-test-cpp1-Desktop_Qt_5_12_3_clang_64bit-Debug/Debug/install-root/usr/local/bin/test-cpp1+0x41f7d9)
SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/ivk/Qt/5.12.3/gcc_64/include/QtCore/qlist.h:477:13 in QList<QString>::node_copy(QList<QString>::Node*, QList<QString>::Node*, QList<QString>::Node*)
Exiting
С одной стороны понятно, QList использует (global static) shared_null для индикации "пустого" списка (чтобы не проверять d-ptr на null в каждом методе). Есть два глобал статика (наш QStringList и его shared_null), порядок инициализации не определен.
С другой, в дебаггере видно "хорошие"
значения - нули для указателей и -1 для атомарного счетчика (индикатор shared_null). То есть это всё таки было проинициализировано корректно.
Очередной false positive анализатора?