Тема: Golded SIGABRT
Показать сообщение отдельно
  #3  
Старый 12.08.2023, 10:41
Nil A
Guest
 
Сообщений: n/a
По умолчанию Golded SIGABRT

Nil A написал(а) к Vitaliy Aksyonov в Aug 23 08:33:52 по местному времени:

Нello, Vitaliy!

Friday August 11 2023 12:02, from Vitaliy Aksyonov -> Nil A:

NA>> Чё-то, где-то. про Скан Клуджей. Я сейчас просто тут это оставлю,
NA>> разбираться ночью с этим багом я не буду, не on-call я сегодня по
NA>> голдеду.
VA> Так неспортивно. А Steps to reproduce? Ну или корку на крайняк.

В hobbit.test эхе хулиганят, написали вот такой вот длинный ориджин

> * Origin: И стали драться Илья Муромец со змеем Горынычем и отрубил
> Муромец одну голову Змею. Но выросло у того 2. И отрубил он у змея 2
> головы, но выросло 4... и отрубил он у Горыныча 65535

и фсё, голдед на свою голую попу сел. Причём, там есть нюанс, когда билд -O0 и -O1,.. может в кору упасть, а может и не упасть, точнее в другом месте упадёт ;-)

Так то строчка выглядит норм
> strxcpy(msg->origin, line->txt.c_str()+11, sizeof(msg->origin));
Чертовски длинный ориджин лежит в стринге line->txt, msg->origin это char[160] просто. Я уж не буду комментировать +11 отступ, чтобы пропустить " * Origin: " ;-)
Внутри strxcpy() делает strcpy() размер -1, и закрывает \0 буфер - всё вроде хорошо.



Короче, вот что я точно знаю, что Одинн Соренсен (царство ему небесное), он был кулхацкером в 90е года, когда плюсы были "Си с классами". Его хакерский стиль - это переиспользовать структурки, просто memset() затираем все поля, и дальше едем. Конструкторы/декструкторы - это для слабаков, мы сейчас сэкономим на new/delete. Окей, всё будет работать, пока у тебя структурка просто POD (типа std::istrivialv), но когда там добавили стринги..

А потом пришли чувачки, невкурили они идею Одинна, и втащили местами std::string с std::vector, и структурки стали уже не POD. Я как-то под valgrind запустил, и там потерянная память, потому что кулхацкер Одинн memset() затирает структурки, а стринги и вектора никто не деструктирует как положено. Короче, там где стринги и вектора, то там новодел - инфа 100%.



Да говно код вашего голдеда, вот чесно. Думал, сейчас голыми руками голдеда поймаю, собрал АСАН билд

> -fsanitize=address -fsanitize=undefined -fno-sanitize-recover=all
> -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow
> -fno-sanitize=null -fno-sanitize=alignment

и что? До списка эх не дошёл, уже арифметика указателей нитаво

> goldlib/gall/gmemdbg.cpp:130:53: runtime error: pointer index expression
> with base 0x000000000000 overflowed to 0xffffffffffffffd4
Вот тут хитро прячут структурку Throw за адресом буфера - тот ещё хак. Ну блин, не свой же кастомный маллок пишем.
> (Throw)((const char)ptr-sizeof(Throw)+1);

Ну окей, мне сейчас надо чисто санитайзер на адреса сделать, просто один -fsanitize=address. Опять до списка эх не дошёл.
> AddressSanitizer: alloc-dealloc-mismatch (operator new [] vs operator
> delete)

Да блин, там десятилетиями эти баги сидят, и всем пофиг. Надо прораваться дальше, запускаем с ASANOPTIONS=alloc_deallocmismatch=0 -у нас список эх уже, нажимаем клавишу названия эхи, и...
> AddressSanitizer: dynamic-stack-buffer-overflow on address 0x7ffded765a05
> at pc 0x00000071d98d bp 0x7ffded765910 sp 0x7ffded765908

Стрёмненько как-то вобщем.

Best Regards, Nil
--- GoldED+/LNX 1.1.5
Ответить с цитированием