Как стать автором
Обновить
252.24
PVS-Studio
Статический анализ кода для C, C++, C# и Java

Путеводитель C++ программиста по неопределённому поведению

Уровень сложностиСложный
Время на прочтение3 мин
Количество просмотров7.1K

Путеводитель C\+\+\ программиста по неопределённому поведению


Вашему вниманию предлагается полный список разделов электронной книги (12 из 11 :)), посвящённой неопределённому поведению. Книга не является учебным пособием и рассчитана на тех, кто уже хорошо знаком с программированием на C++. Это своего рода путеводитель C++ программиста по неопределённому поведению, причём по самым его тайным и экзотическим местам. Автор книги — Дмитрий Свиридкин, редактор — Андрей Карпов.


Около полугода мы готовили и публиковали в блоге PVS-Studio материалы, посвящённые неопределённому поведению. Это была большая работа, и мы рады, что наконец она подошла к концу. Или почти к концу. Данный материал планируется после адаптации выпустить в виде печатного издания, но это уже другая история.


Изначально предполагалось, что частей будет 11. Однако в процессе работы выяснилось, что материалов хватит ещё на одну статью. Так что получилось символично, что вышло 12 частей из 11. Классический выход за границу массива, близкий душе C++ программистов :) Да и не стоит отказываться от традиции (пасхальная 51-ая глава из 50).


Итак, неопределённое поведение во всей своей красе. Будет очень много букв, так что готовьтесь, и приятного погружения.


  1. Часть 1: предисловие, что такое неопределённое поведение и как оно проявляется, сужающие преобразования и неявное приведение типов.
  2. Часть 2: переполнение целых знаковых чисел, числа с плавающей точкой, integer promotion, char и знаковое расширение.
  3. Часть 3: висячие ссылки, string_view, синтаксический сахар с ложкой дёгтя (range-based for), self-reference, std::vector и инвалидация ссылок.
  4. Часть 4: списки захвата лямбда-функций, кортежи, внезапная мутабельность, неявные ссылки, use-after-move, lifetime extension.
  5. Часть 5: Most Vexing Parse, неконстантные константы, семантика перемещения, std::enable_if_t против std::void_t, забытый return.
  6. Часть 6: эллипсис и функции, operator [], iostreams (счастливой отладки!), оператор запятая, function-try-block, типы "нулевого" размера.
  7. Часть 7: NULL-терминированные строки, std::shared_ptr, (не)явное приведение типов, как передать стандартную функцию и ничего не сломать.
  8. Часть 8: бесконечные циклы и проблема остановки, рекурсия, ложный noexcept, переполнение буфера.
  9. Часть 9: (N)RVO vs RAII, разыменование нулевых указателей, static initialization order fiasco, static inline, нарушение ODR, зарезервированные имена.
  10. Часть 10: тривиальные типы и ABI, неинициализированные переменные, С++20 unbounded ranges, невиртуальные виртуальные функции, VLA.
  11. Часть 11: невалидные указатели, placement new для массивов, data race, повторный захват mutex, сигнало(не)безопасность, как сделать всё правильно и уйти в deadlock.
  12. Часть 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.

Теги:
Хабы:
+47
Комментарии5

Публикации

Информация

Сайт
pvs-studio.ru
Дата регистрации
Дата основания
2008
Численность
51–100 человек
Местоположение
Россия
Представитель
Андрей Карпов