Название: Порядок инициализации Отправлено: Авварон от Июль 11, 2019, 11:38 А вот ещё интересное наткнулся=)
Вот есть простой код: Код: #include <QStringList> Собираем с -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), порядок инициализации не определен. С другой, в дебаггере видно "хорошие" значения (https://code.woboq.org/qt5/qtbase/src/corelib/tools/qlist.cpp.html#QListData::shared_null) - нули для указателей и -1 для атомарного счетчика (индикатор shared_null). То есть это всё таки было проинициализировано корректно. Очередной false positive анализатора? Название: Re: Порядок инициализации Отправлено: qate от Июль 11, 2019, 13:16 как выглядит полная строка компиляции ? (clang не настроен)
Название: Re: Порядок инициализации Отправлено: Авварон от Июль 11, 2019, 14:21 Код: /usr/lib/ccache/clang++ -g -O0 -Wall -Wextra -fsanitize=memory -target x86_64-pc-linux-gnu -pipe -fexceptions -fvisibility=default -fno-omit-frame-pointer -fPIC -DQT_DEPRECATED_WARNINGS -DQT_CORE_LIB -I/home/ivk/Qt/5.12.3/gcc_64/include -I/home/ivk/Qt/5.12.3/gcc_64/include/QtCore -I/home/ivk/Qt/5.12.3/gcc_64/mkspecs/linux-g++ -I/home/ivk/programming/build-test-cpp1-Desktop_Qt_5_12_3_clang_64bit-Debug/Debug/test-cpp1.5d46f22d/qt.headers -std=c++11 -o /home/ivk/programming/build-test-cpp1-Desktop_Qt_5_12_3_clang_64bit-Debug/Debug/test-cpp1.5d46f22d/3a52ce780950d4d9/main.cpp.o -c /home/ivk/programming/test-cpp1/main.cpp в гцц нет флажка -fsanitize=memory, кажется Название: Re: Порядок инициализации Отправлено: qate от Июль 11, 2019, 15:59 сборка ничего не написала, а valgrind всю память выедает со свопом )
Название: Re: Порядок инициализации Отправлено: Авварон от Июль 11, 2019, 16:02 сборка ничего не написала, а valgrind всю память выедает со свопом ) Надо просто запустить без валгринда. Название: Re: Порядок инициализации Отправлено: qate от Июль 11, 2019, 16:49 может анализатор не учёл что либа уже собрана ?
Код: $ objdump -x main |grep shared_null |