Russian Qt Forum
Ноябрь 22, 2024, 11:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Порядок инициализации  (Прочитано 6842 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Июль 11, 2019, 11:38 »

А вот ещё интересное наткнулся=)
Вот есть простой код:
Код:
#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 анализатора?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Июль 11, 2019, 13:16 »

как выглядит полная строка компиляции ? (clang не настроен)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Июль 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, кажется
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #3 : Июль 11, 2019, 15:59 »

сборка ничего не написала, а valgrind всю память выедает со свопом )
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Июль 11, 2019, 16:02 »

сборка ничего не написала, а valgrind всю память выедает со свопом )


Надо просто запустить без валгринда.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #5 : Июль 11, 2019, 16:49 »

может анализатор не учёл что либа уже собрана ?

Код:
$ objdump -x main |grep shared_null
0000000000000000       O *UND*  0000000000000000              _ZN9QListData11shared_nullE@@Qt_5
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.069 секунд. Запросов: 23.