Size: a a a

Конференция C++ Russia

2020 May 20

AV

Alexey Veselovsky in Конференция C++ Russia
видимо придется доклад править 🙂
источник

m

magras in Конференция C++ Russia
Alexey Veselovsky
ASAN стек тоже чекает
Я был. Но разве он может поймать обращение не за границами стэка, а когда объект умер и на его месте уже новые данные лежат?
источник

AV

Alexey Veselovsky in Конференция C++ Russia
magras
Я был. Но разве он может поймать обращение не за границами стэка, а когда объект умер и на его месте уже новые данные лежат?
может. там есть вариант с карантином
источник

A

Alex Ф-ф-фэils!🌠︙... in Конференция C++ Russia
Alexey Veselovsky
блин. надо срочно щупать!
Да я тут как раз скачал себе; они ещё улучшили remote debug on *nix
источник

AV

Alexey Veselovsky in Конференция C++ Russia
magras
Я был. Но разве он может поймать обращение не за границами стэка, а когда объект умер и на его месте уже новые данные лежат?
Попробую добавить этот момент в доклад
источник

m

magras in Конференция C++ Russia
Alexey Veselovsky
может. там есть вариант с карантином
хм. Интересно. Спасибо, пойду поищу инфу об этом.
источник

PZ

Pavel Zhigulin in Конференция C++ Russia
Alexey Veselovsky
любая функция которая вызовет эту функцию - также приведет в UB и должна быть unsafe. очевидно же.

эта функция тут - мина замедленного действия
Это неверно. Если я знаю все ограничения платформы и явным образом соблюду контракт - эта функция становится полностью safe на конкретной платформе.

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

AV

Alexey Veselovsky in Конференция C++ Russia
Pavel Zhigulin
Это неверно. Если я знаю все ограничения платформы и явным образом соблюду контракт - эта функция становится полностью safe на конкретной платформе.

Моя основная задача тут - не дать коду скомпилироваться на платформах, контракт которых я не соблюл
а откуда ты знаешь, что ты знаешь все ограничения платформы?

есть гарантии языка, а дальше уже идет личное фантазирование и системное программирование.

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

PZ

Pavel Zhigulin in Конференция C++ Russia
Alexey Veselovsky
а откуда ты знаешь, что ты знаешь все ограничения платформы?

есть гарантии языка, а дальше уже идет личное фантазирование и системное программирование.

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

1) Самые низкоуровневые вещи (интринсики) предоставляют разработчики компилятора. Они уже ковыряются в деталях конкретной железки и бекэнда к ней.
2) Разработчики стандартной библиотеки под каждую из платформ пишут safe-обёртки, полагаясь на то, что разрабы компилятора не обманывают.
3) Core-разработчики проекта используют то, что предоставили люди из п.1 и п.2.
4) Обычные разрабы используют то, что выдали им Core-разрабы

В чём, собственно соль - если что-то пошло не так, нужно заглянуть лишь в unsafe функции/блоки кода в стеке вызовов, потому что только они могли что-то сломать.
источник

PZ

Pavel Zhigulin in Конференция C++ Russia
И легче понять кто косячнул.
источник

AV

Alexey Veselovsky in Конференция C++ Russia
ну, тут как бы то есть UB же не только в чем-то для чего могут быть интринсики. тот же например ODR violation.
источник

AV

Alexey Veselovsky in Конференция C++ Russia
или если просто в памяти ковыряешься
источник

AV

Alexey Veselovsky in Конференция C++ Russia
вот есть у тебя объект в памяти, и для какой-нибудь платформы ты просто таки знаешь где там будет лежать rtti для него например. ну, или думаешь, что знаешь. и ходишь в ту память. а бац - а нету там того, но есть что-то другое.
источник

PZ

Pavel Zhigulin in Конференция C++ Russia
Alexey Veselovsky
вот есть у тебя объект в памяти, и для какой-нибудь платформы ты просто таки знаешь где там будет лежать rtti для него например. ну, или думаешь, что знаешь. и ходишь в ту память. а бац - а нету там того, но есть что-то другое.
Да, но ты знаешь кто виноват! Область поиска - unsafe функции/блоки. Просто ищешь все, а потом ищешь те, что используются в той области кода, которая у тебя сломалась)
источник

AV

Alexey Veselovsky in Конференция C++ Russia
это при условии, что ты выявил этот дефект на этапе тестирования
источник

AV

Alexey Veselovsky in Конференция C++ Russia
поскольку тут UB, то стрельнуть оно может в проде
источник

AV

Alexey Veselovsky in Конференция C++ Russia
при редком стечении обстоятельств
источник

AV

Alexey Veselovsky in Конференция C++ Russia
и будет очень хорошо, если приложение крашнется хотя бы
источник

PZ

Pavel Zhigulin in Конференция C++ Russia
Ну, блин)) Весь код на C++ - потенциальный UB. В Rust (при корректной реализации компилятора) - UB только unsafe подмножество. Если стреляет что-то в С++ - область поиска - весь код. Если стреляет Rust - только подмножество)
источник

PZ

Pavel Zhigulin in Конференция C++ Russia
Опять же, в Rust все потенциальные UB места ты должен обозначить явно. В С++ можно получить UB на ровном месте :)
источник