Вашему вниманию предлагается полный список разделов электронной книги (12 из 11 :)), посвящённой неопределённому поведению. Книга не является учебным пособием и рассчитана на тех, кто уже хорошо знаком с программированием на C++. Это своего рода путеводитель C++ программиста по неопределённому поведению, причём по самым его тайным и экзотическим местам. Автор книги — Дмитрий Свиридкин, редактор — Андрей Карпов.
Около полугода мы готовили и публиковали в блоге PVS-Studio материалы, посвящённые неопределённому поведению. Это была большая работа, и мы рады, что наконец она подошла к концу. Или почти к концу. Данный материал планируется после адаптации выпустить в виде печатного издания, но это уже другая история.
Изначально предполагалось, что частей будет 11. Однако в процессе работы выяснилось, что материалов хватит ещё на одну статью. Так что получилось символично, что вышло 12 частей из 11. Классический выход за границу массива, близкий душе C++ программистов :) Да и не стоит отказываться от традиции (пасхальная 51-ая глава из 50).
Итак, неопределённое поведение во всей своей красе. Будет очень много букв, так что готовьтесь, и приятного погружения.
- Часть 1: предисловие, что такое неопределённое поведение и как оно проявляется, сужающие преобразования и неявное приведение типов.
- Часть 2: переполнение целых знаковых чисел, числа с плавающей точкой, integer promotion, char и знаковое расширение.
- Часть 3: висячие ссылки, string_view, синтаксический сахар с ложкой дёгтя (range-based for), self-reference, std::vector и инвалидация ссылок.
- Часть 4: списки захвата лямбда-функций, кортежи, внезапная мутабельность, неявные ссылки, use-after-move, lifetime extension.
- Часть 5: Most Vexing Parse, неконстантные константы, семантика перемещения, std::enable_if_t против std::void_t, забытый return.
- Часть 6: эллипсис и функции, operator [], iostreams (счастливой отладки!), оператор запятая, function-try-block, типы "нулевого" размера.
- Часть 7: NULL-терминированные строки, std::shared_ptr, (не)явное приведение типов, как передать стандартную функцию и ничего не сломать.
- Часть 8: бесконечные циклы и проблема остановки, рекурсия, ложный noexcept, переполнение буфера.
- Часть 9: (N)RVO vs RAII, разыменование нулевых указателей, static initialization order fiasco, static inline, нарушение ODR, зарезервированные имена.
- Часть 10: тривиальные типы и ABI, неинициализированные переменные, С++20 unbounded ranges, невиртуальные виртуальные функции, VLA.
- Часть 11: невалидные указатели, placement new для массивов, data race, повторный захват mutex, сигнало(не)безопасность, как сделать всё правильно и уйти в deadlock.
- Часть 12: std::vector::reserve и std::vector::resize, невыровненные ссылки, время жизни и смерти, статический анализ и UB, заключение.
Примечание
На эту книгу, опубликованную в виде цикла статей, можно ссылаться. Можно приводить примеры из неё со ссылками, конечно же. Для копирования и иного воспроизведения необходимо получить согласие автора. Контакт Дмитрия: dmisvrl1@gmail.com. Нельзя использовать в платных сервисах или взимать плату за обучение по этим материалам.
Автор — Дмитрий Свиридкин
Более восьми лет работает в сфере коммерческой разработки высокопроизводительного программного обеспечения на C и C++. С 2019 по 2021 год преподавал курсы системного программирования под Linux в СПбГУ и практики C++ в ВШЭ. В настоящее время — Software Engineer в AWS (Cloudfront), занимается системной и embedded-разработкой на Rust и C++ для edge-серверов. Основная сфера интересов — безопасность программного обеспечения.
Редактор — Андрей Карпов
Более 15 лет занимается темой статического анализа кода и качества программного обеспечения. Автор большого количества статей, посвящённых написанию качественного кода на языке C++. С 2011 по 2021 год удостаивался награды Microsoft MVP в номинации Developer Technologies. Один из основателей проекта PVS-Studio. Долгое время являлся CTO компании и занимался разработкой С++ ядра анализатора. Основная деятельность на данный момент — управление командами, обучение сотрудников и DevRel активности.
Если хотите поделиться этой статьёй с англоязычной аудиторией, то прошу использовать ссылку на перевод: Andrey Karpov. C++ programmer's guide to undefined behavior.
Комментарии (6)
9241304
28.01.2025 11:47В кои это веки предельно полезный материал на хабре, и без тг канала)
Многие... Да я бы даже сказал, почти все плюсовики забивают на ub. Забивают в том плане, что считают, что ничего страшного не произойдёт, даже если это ub случится.
Так что в первую очередь надо вбить, что наличие ub недопустимо, а потом уж разбирать кейсы. Один умный человек объяснял это предельно доходчиво: может, ты ничего и не заметишь, а может у тебя и важный файл на диске удалится)
qweururu
28.01.2025 11:47Я как-то и не обратил внимания кто там автор, а кто ещё кто-то. Заметил только сейчас.
Автор — Дмитрий Свиридкин
Более восьми лет работает в сфере коммерческой разработки высокопроизводительного программного обеспечения на C и C++.
Это та растошлюха, которая обгадилась здесь: https://habr.com/ru/companies/ruvds/articles/747826/comments/#comment_25755608 ? О производительности персонаж ничего не знает. Как и о безопасности, кстати. Типичная картина.
Siemargl
28.01.2025 11:47А в чем там проблема? Что абстрактное УБ не проявляется (пока) на существующих компиляторах?
Cheater
Да, одна из лучших книг по продвинутому C++... У книги есть неофициальный алиас под которым её и знают (ubbook). Можно сказать критерий успеха, подобно dragonbook итд.
Также стиль изложения просто огонь:
https://github.com/Nekrolm/ubbook/blob/master/lifetime/unexpected_mutability.md
Andrey2008 Автор
Если открыть первую часть, то можно прочитать :)
В общем, перед вами переработанная и расширенная ubbook.
Плюс перевод на английский.