170 похожих чатов

Народ, а есть ли в С++ компиляторах нечто вроде локальных

санитайзеров ошибки которых можно поймать try-catch блоком? Я хочу например аттрибутом на try-catch блоке обозначить тип санитайзера и потом словить ошибку в catch-блоке
[[sanitizer(address)]]
try {
someBuggyFunction();
} catch(AddressSanitizerError err){
log(err);
someCleanup();
}
И С++ компилятор должен санитайзить только тот код которых находится внутри только этого try-блока (и всех вызываемых из него функций, но не всего бинарника)

19 ответов

24 просмотра

По идее можно вынести этот код в отдельную либу и скомпилить с санитайзером

Нет. Санитайзеры не обязаны юзать С++ исключения

Evgeniy Partizan
По идее можно вынести этот код в отдельную либу и ...

есть такая фича Conditional Compilation with __has_feature(address_sanitizer) In some cases one may need to execute different code depending on whether AddressSanitizer is enabled. __has_feature can be used for this purpose.

Богдан- Автор вопроса

Зачем это собственно надо - идея заключается в том что есть например бэкенд-фреймворк который оттестирован, без UB и т.д и есть всякие джуниор С++ разработчики которые будут писать бизнес-логику (зачастую без тестов) под этот фреймворк и у которых может довольно часто втречаться UB. И для того чтобы ошибка из-за UB в коде при обработке конкретного API-запроса не валила весь процесс с бэкендом то хочется завернуть обработку запросов вот таким try-catch блоком с санитайзингом но только того кода бизнес-логики которого будут писать джуниор-разработчики Подобное можно сделать и сейчас если вынести весь код бизнес-логики в отдельный бинарник (в котором код будет скомпилирован с включенным санитайзингом) и дальше бэкенд-фреймворк на каждый API запрос запускать этот бинарник в отдельном процессе операционной системы и дальше ловить ошибку санитайзеров стандартными средствами но это очевидно будет достаточно неэффективное решение

Conditional Compilation with __has_feature(address_sanitizer)

Богдан
Зачем это собственно надо - идея заключается в том...

что бы код модифицировать по минимуму и проверить конкретную фичу

Богдан
Зачем это собственно надо - идея заключается в том...

что бы код модифицировать по минимуму, и проверить конкретную фичу в естественных условиях

Богдан
Зачем это собственно надо - идея заключается в том...

Нет никакой гарантии, что после отловленного и предотвращённого UB программа останется в валидном состоянии.

Богдан- Автор вопроса
Alexander Karaev
Нет никакой гарантии, что после отловленного и пре...

Гарантии нет если код бизнес-логики может свободно модифицировать какие-то общие структуры фреймворка. Но если построить такую архитектуру которая будет изолировать код бизнес-логики (например все временные данные в рамках обработки запроса бизнес-логики будут аллоцироваться в арена-буффере который будет очищаться с каждым запросом ну и также в случае ошибок санитайзинга в этом catch-блоке) то я думаю мы можно достичь неких гарантий что программа останется в валидном состоянии

Богдан
Гарантии нет если код бизнес-логики может свободно...

Ну попробуй ловить сигналы, которыми санитайзер обычно прибивает процесс после срабатывания

Богдан
Зачем это собственно надо - идея заключается в том...

как я понимаю с тем как работает асан его нельзя отключить для секции кода

feedable
как я понимаю с тем как работает асан его нельзя о...

ОП под локальностью понимает не отключение санитайзера для части кода, а восстановление после обнаружения UB

После того как санитайзер упал продолжать исполнение так себе идея. Не понятно что там сломалось в памяти

Богдан- Автор вопроса
Alex Noname
После того как санитайзер упал продолжать исполнен...

А что там может сломаться? По идее санитайзеры просто добавляют рантайм проверки и останавливают всю программу если они не сработали А дальше можно попробовать мысленно представить что будет если вместо остановки будет просто выброс исключения (с соотвествующим вызовом деструкторов и выходом наверх по калл-стеку пока не дойдем до catch-блока) - программа находится в валидном состоянии потому что до UB дело не дошло.

Богдан
А что там может сломаться? По идее санитайзеры про...

Ага, например проезд по памяти который покораптил пол строки, а потом все упало, когда он обратился к памяти за ее концом

Богдан
А что там может сломаться? По идее санитайзеры про...

санитайзер может сработать в местах, которые в остальное время считаются за "не бросает исключений", прерывание выполнения которых нарушит инварианты и гарантии один Великий Электрон знает где после такого в лучшем случае ваше волшебное исключение долетит до выхода из noexcept функции и сделает terminate, а в худшем приложение продолжит работать с диагнозом шизофрения и на основе битых данных что-то где-то делать (самый шик такое в приложении рулящем финансами устроить)

Гражданин Котейко
санитайзер может сработать в местах, которые в ост...

Слушай, я не очень понимаю что-то в санитайзерах, но они же просто индексируют доступную память (вставляют проверки) и выбрасывают ошибки, когда происходит работа с памятью, которую они не проиндексировали как доступную. Ты говоришь про кейсы где невалидный код что-то натыкал в переменной выше скоупом, потом по идее человека выше, кинул исключение и теперь мы работаем с рандомным говном в этой переменной?

Vitalii
Слушай, я не очень понимаю что-то в санитайзерах, ...

Разве нельзя было бы на этапе компиляции с санитайзером проверить изменил ли он переменные выше скоупом, чтобы выбрасывать просто разные исключения. Ведь если он не изменил состояние переменных, которые ещё будут использоваться, то всё хорошо.

Богдан
Гарантии нет если код бизнес-логики может свободно...

Ну и фантазия у тебя, может тебе лучше книги писать, по типу Филипа Дика?

Похожие вопросы

Обсуждают сегодня

Ребят в СИ можно реализовать ООП?
Николай
33
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
Кто кодит под Лазарем на винде, у вас аналогично VCL переопределяются CreateWnd и CreateParams для конкретных классов контролов и все заданные флаги влияют?
А Андрей
11
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
А, ты про текущую реализацию? Нет конечно, я бы сделал правильно - сейчас там гавнокод
Александр (Rouse_) Багель
6
Карта сайта