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
Valgrind: как найти переменную стека, которая определяется как не инициализированная? ⇐ C++
Программы на C++. Форум разработчиков
1732829232
Anonymous
[b]UPDATE-1:[/b] сделал пример немного более реалистичным
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? (учитывая, что мои реальные сценарии намного больше и старше)
[b]ДРУГОЙ СЦЕНАРИЙ:[/b]
маленький пример, но в реальности что неинициализированный доступ спрятан где-то под +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
Подробнее здесь: [url]https://stackoverflow.com/questions/79233169/valgrind-how-to-find-the-stack-variable-that-is-detected-as-not-initalized[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия