Valgrind: как найти переменную стека, которая определяется как не инициализированная?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Valgrind: как найти переменную стека, которая определяется как не инициализированная?

Сообщение Anonymous »

UPDATE-1: сделал пример немного более реалистичным
SUSE Tumbleweed, clang 19.1.4, gcc 14.2.1, valgrind 3.24.0 ( построено из исходного кода)
в my_proc.cpp
int proc()
{
int y;
return y;
}

int main()
{
int y = proc();
int x;
return x+y;
}

с использованием g++ и valgrind
g++ -g -O0 -fno-omit-frame-pointer my_prog.cpp
valgrind --tool=memcheck --leak-check=no --track-origins=yes ./a.out

давая мне только строку 2, которая является началом int proc()
==469== Memcheck, a memory error detector
==469== Copyright (C) 2002-2024, and GNU GPL'd, by Julian Seward et al.
==469== Using Valgrind-3.24.0 and LibVEX; rerun with -h for copyright info
==469== Command: ./a.out
==469==
==469== Syscall param exit_group(status) contains uninitialised byte(s)
==469== at 0x4CC909D: _Exit (in /usr/lib64/libc.so.6)
==469== by 0x4C26EB5: __run_exit_handlers (in /usr/lib64/libc.so.6)
==469== by 0x4C26FFF: exit (in /usr/lib64/libc.so.6)
==469== by 0x4C0D2B4: (below main) (in /usr/lib64/libc.so.6)
==469== Uninitialised value was created by a stack allocation
==469== at 0x401116: proc() (my_prog.cpp:2)
==469==
==469==
==469== HEAP SUMMARY:
==469== in use at exit: 0 bytes in 0 blocks
==469== total heap usage: 1 allocs, 1 frees, 73,728 bytes allocated
==469==
==469== For a detailed leak analysis, rerun with: --leak-check=full
==469==
==469== For lists of detected and suppressed errors, rerun with: -s
==469== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

использование clang++ с очистителем памяти для сравнения (но я знаю, что создание всех зависимостей с помощью msan сопряжено с большими трудностями, поэтому я использую valgrind)
clang++ -g -O0 -fno-omit-frame-pointer -fsanitize=memory my_prog.cpp

давая мне точное местоположение первого использования неинициализированной переменной в строке 4, возвращаем y; и 9 int y = proc(); и затем выходим
р>
==480==WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x564ffb0f818a in proc() /home/linux/temp/my_prog.cpp:4:5
#1 0x564ffb0f820a in main /home/linux/temp/my_prog.cpp:9:13
#2 0x7fc2d66092ad in __libc_start_call_main (/lib64/libc.so.6+0x2a2ad) (BuildId: 03f1631dc9760d3e30311fe62e15cc4baaa89db7)
#3 0x7fc2d6609378 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x2a378) (BuildId: 03f1631dc9760d3e30311fe62e15cc4baaa89db7)
#4 0x564ffb05b104 in _start /home/abuild/rpmbuild/BUILD/glibc-2.40/csu/../sysdeps/x86_64/start.S:115

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/linux/temp/my_prog.cpp:4:5 in proc()
Exiting

есть ли какие-нибудь хитрости, настройки компилятора, приемы dbg, чтобы точно определить местоположение переменной в этом нереально маленьком примере с выходными данными valgrind? (учитывая, что мои реальные сценарии намного больше и старше)
ДРУГОЙ СЦЕНАРИЙ:
маленький пример, но в реальности что неинициализированный доступ спрятан где-то под +100 тысячами строк встроенного кода - слишком большие функции (разработанные не мной), чтобы быстро понять, из какого var возникла проблема
с помощью UBSAN (и MSAN в качестве примера) и -Werror -Wall
без предупреждений UBSAN, без предупреждений ASAN, только MSAN (очень подробно) или Valgrind с только основной точкой в ​​качестве начальной точки, где это происходит - но в моем реальном сценарии во всей функции загромождено гораздо больше переменных ( в качестве примера)
что я могу сделать сейчас, чтобы получить больше от информации о valgrind (дополнительные опции, другие дополнительные инструменты, помогающие valgrind?) - чтобы лучше подготовиться к будущему или к расширение моего CI-сервера для предоставления более качественной информации
MSAN выходит за рамки, поскольку используется 20 сторонних библиотек (и даже не все доступны в исходном коде) - причина использования valgrind
и меня интересуют только результаты неинициализированной памяти — ASAN уже много лет используется для поиска других проблем, связанных с памятью
union blub_t
{
short a;
int b;
};

int main()
{
blub_t g;
g.a = 10;
return g.b;
}

build + valgrind
clang++ -g -O0 -fno-omit-frame-pointer -Werror -Wall my_prog.cpp
valgrind --tool=memcheck --leak-check=no --track-origins=yes ./a.out

дает
==636== Memcheck, a memory error detector
==636== Copyright (C) 2002-2024, and GNU GPL'd, by Julian Seward et al.
==636== Using Valgrind-3.24.0 and LibVEX; rerun with -h for copyright info
==636== Command: ./a.out
==636==
==636== Syscall param exit_group(status) contains uninitialised byte(s)
==636== at 0x4CC909D: _Exit (in /usr/lib64/libc.so.6)
==636== by 0x4C26EB5: __run_exit_handlers (in /usr/lib64/libc.so.6)
==636== by 0x4C26FFF: exit (in /usr/lib64/libc.so.6)
==636== by 0x4C0D2B4: (below main) (in /usr/lib64/libc.so.6)
==636== Uninitialised value was created by a stack allocation
==636== at 0x401116: main (my_prog.cpp:8)
==636==
==636==
==636== HEAP SUMMARY:
==636== in use at exit: 0 bytes in 0 blocks
==636== total heap usage: 1 allocs, 1 frees, 73,728 bytes allocated
==636==
==636== For a detailed leak analysis, rerun with: --leak-check=full
==636==
==636== For lists of detected and suppressed errors, rerun with: -s
==636== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

сборка с помощью MSAN
clang++ -g -O0 -fno-omit-frame-pointer -fsanitize=memory,undefined -Werror -Wall my_prog.cpp

дает
==585==WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x559d2f9471ec in main /home/linux/temp/my_prog.cpp:11:5
#1 0x7f47941bf2ad in __libc_start_call_main (/lib64/libc.so.6+0x2a2ad) (BuildId: 03f1631dc9760d3e30311fe62e15cc4baaa89db7)
#2 0x7f47941bf378 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x2a378) (BuildId: 03f1631dc9760d3e30311fe62e15cc4baaa89db7)
#3 0x559d2f8aa104 in _start /home/abuild/rpmbuild/BUILD/glibc-2.40/csu/../sysdeps/x86_64/start.S:115

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/linux/temp/my_prog.cpp:11:5 in main
Exiting


Подробнее здесь: https://stackoverflow.com/questions/792 ... initalized
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»