Nil A
2023-10-13 18:35:16 UTC
Hello, Vitaliy!
Во-первых, зачем по-умолчанию включены отладки GTHROW_LOG и GTHROW_DEBUG? Я
иногда видел какие-то трейсы про память пишутся в golded.log, но реально, хоть
что-то когда-нибудь присылал сюда в эху, или куда-то, какие-то отладочные
трейсы памяти?
Отладка GTHROW_DEBUG в голдеде сделана таким образом, что они аллоцируют памяти
больше на структурку Throw, и прячут её в начале. Перед адресом и после
обкладывают магическими цифирками BEFOREVAL и AFTERVAL, чтобы потом на недоезды
и заезды проверить. Также они двухсвязный список хранят, чтобы потом потерянную
память напечатать. А потом пришёл Гугл и запили ASAN билды, и такое делать в
ручную уже стало не нужно, так что выключить по-умолчанию я бы рекомендовал.
Решилось мне прогнать UBSAN билд, и прямо на запуске, где происходит
сканирование всех областей (баз эх), случается UB
/home/fido/src/golded-plus/goldlib/gall/gmemdbg.cpp:130:53: runtime error:
pointer index expression with base 0x000000000000 overflowed to
0xffffffffffffffd4
#0 0xae8fbc in throw_ptrtodl(void const*)
/home/fido/src/golded-plus/goldlib/gall/gmemdbg.cpp:130
#1 0xae6a1c in throw_realloc_debug(void*, unsigned long, char const*, int)
/home/fido/src/golded-plus/goldlib/gall/gmemdbg.cpp:389
#2 0x94880f in SquishArea::refresh()
/home/fido/src/golded-plus/goldlib/gmb3/gmosqsh2.cpp:71
#3 0x94b7f1 in SquishArea::raw_scan(int, int)
/home/fido/src/golded-plus/goldlib/gmb3/gmosqsh2.cpp:153
#4 0x94fd9b in SquishArea::scan_area()
/home/fido/src/golded-plus/goldlib/gmb3/gmosqsh2.cpp:333
#5 0x7ebee5 in Area::ScanArea()
/home/fido/src/golded-plus/golded3/gescan.cpp:71
#6 0x7efc77 in AreaList::AreaScan(int, unsigned int, int, int&, int&, char
const*) /home/fido/src/golded-plus/golded3/gescan.cpp:281
#7 0x7b236f in Reader() /home/fido/src/golded-plus/golded3/geread.cpp:171
#8 0x6c63bb in main /home/fido/src/golded-plus/golded3/gemain.cpp:54
#9 0x7f7f53f1ef44 in __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x21f44)
#10 0x407c98
(/home/fido/src/golded-plus/build_asan/golded3/golded+0x407c98)
Тут хотят вычитать целиком .SQI индекс файл в память. Зовут функцию
throw_realloc(), где оригинальный указатель в NULL. Так то норм, звать realloc
с nullptr, тогда он просто в malloc() превращается.
Вобщем-то бага то и нет, но всё равно, я бы почиНИЛ throw_realloc_debug(),
пододвинул throw_ptrtodl() туда, где он реально используется. Т.е. вот такой
фикс бы влил, но.. у меня нет на гитхабе аккаунта.
--- a/goldlib/gall/gmemdbg.cpp
+++ b/goldlib/gall/gmemdbg.cpp
@@ -386,7 +386,6 @@ void* throw_realloc_debug(void* __oldptr, size_t __size,
const char* __file, int
{
void* _ptr;
- Throw* dl = throw_ptrtodl(__oldptr);
if(__size == 0)
{
@@ -399,6 +398,7 @@ void* throw_realloc_debug(void* __oldptr, size_t __size,
const char* __file, int
}
else
{
+ Throw* dl = throw_ptrtodl(__oldptr);
_ptr = throw_malloc_debug(__size,__file,__line);
if(dl->nbytes < __size)
__size = dl->nbytes;
Best Regards, Nil
Во-первых, зачем по-умолчанию включены отладки GTHROW_LOG и GTHROW_DEBUG? Я
иногда видел какие-то трейсы про память пишутся в golded.log, но реально, хоть
что-то когда-нибудь присылал сюда в эху, или куда-то, какие-то отладочные
трейсы памяти?
Отладка GTHROW_DEBUG в голдеде сделана таким образом, что они аллоцируют памяти
больше на структурку Throw, и прячут её в начале. Перед адресом и после
обкладывают магическими цифирками BEFOREVAL и AFTERVAL, чтобы потом на недоезды
и заезды проверить. Также они двухсвязный список хранят, чтобы потом потерянную
память напечатать. А потом пришёл Гугл и запили ASAN билды, и такое делать в
ручную уже стало не нужно, так что выключить по-умолчанию я бы рекомендовал.
Решилось мне прогнать UBSAN билд, и прямо на запуске, где происходит
сканирование всех областей (баз эх), случается UB
/home/fido/src/golded-plus/goldlib/gall/gmemdbg.cpp:130:53: runtime error:
pointer index expression with base 0x000000000000 overflowed to
0xffffffffffffffd4
#0 0xae8fbc in throw_ptrtodl(void const*)
/home/fido/src/golded-plus/goldlib/gall/gmemdbg.cpp:130
#1 0xae6a1c in throw_realloc_debug(void*, unsigned long, char const*, int)
/home/fido/src/golded-plus/goldlib/gall/gmemdbg.cpp:389
#2 0x94880f in SquishArea::refresh()
/home/fido/src/golded-plus/goldlib/gmb3/gmosqsh2.cpp:71
#3 0x94b7f1 in SquishArea::raw_scan(int, int)
/home/fido/src/golded-plus/goldlib/gmb3/gmosqsh2.cpp:153
#4 0x94fd9b in SquishArea::scan_area()
/home/fido/src/golded-plus/goldlib/gmb3/gmosqsh2.cpp:333
#5 0x7ebee5 in Area::ScanArea()
/home/fido/src/golded-plus/golded3/gescan.cpp:71
#6 0x7efc77 in AreaList::AreaScan(int, unsigned int, int, int&, int&, char
const*) /home/fido/src/golded-plus/golded3/gescan.cpp:281
#7 0x7b236f in Reader() /home/fido/src/golded-plus/golded3/geread.cpp:171
#8 0x6c63bb in main /home/fido/src/golded-plus/golded3/gemain.cpp:54
#9 0x7f7f53f1ef44 in __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x21f44)
#10 0x407c98
(/home/fido/src/golded-plus/build_asan/golded3/golded+0x407c98)
Тут хотят вычитать целиком .SQI индекс файл в память. Зовут функцию
throw_realloc(), где оригинальный указатель в NULL. Так то норм, звать realloc
с nullptr, тогда он просто в malloc() превращается.
Вобщем-то бага то и нет, но всё равно, я бы почиНИЛ throw_realloc_debug(),
пододвинул throw_ptrtodl() туда, где он реально используется. Т.е. вот такой
фикс бы влил, но.. у меня нет на гитхабе аккаунта.
--- a/goldlib/gall/gmemdbg.cpp
+++ b/goldlib/gall/gmemdbg.cpp
@@ -386,7 +386,6 @@ void* throw_realloc_debug(void* __oldptr, size_t __size,
const char* __file, int
{
void* _ptr;
- Throw* dl = throw_ptrtodl(__oldptr);
if(__size == 0)
{
@@ -399,6 +398,7 @@ void* throw_realloc_debug(void* __oldptr, size_t __size,
const char* __file, int
}
else
{
+ Throw* dl = throw_ptrtodl(__oldptr);
_ptr = throw_malloc_debug(__size,__file,__line);
if(dl->nbytes < __size)
__size = dl->nbytes;
Best Regards, Nil