Путеводитель 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.

Комментарии (6)


  1. Cheater
    28.01.2025 11:47

    Да, одна из лучших книг по продвинутому C++... У книги есть неофициальный алиас под которым её и знают (ubbook). Можно сказать критерий успеха, подобно dragonbook итд.
    Также стиль изложения просто огонь:

    Был теплый весенний денек. Попивая чай, я медленно и лениво пролистывал студенческие работы. Я бы мог сказать, что ничего не предвещало беды, но, увы, работы были выполнены на C++.

    https://github.com/Nekrolm/ubbook/blob/master/lifetime/unexpected_mutability.md


    1. Andrey2008 Автор
      28.01.2025 11:47

      Если открыть первую часть, то можно прочитать :)

      Так что, встретив путеводитель Дмитрия Свиридкина по UB на GitHub (ubbook), я с большим любопытством с ним ознакомился. Выписал для себя ряд интересных мыслей, которые со временем станут основой новых диагностических правил. В общем, я получил от чтения и удовольствие, и пользу.

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

      Я связался с Дмитрием и предложил сотрудничество по редактированию, дополнению и переводу его материала. Он согласился, и мы приступили к работе над этой электронной книгой, которую со временем попробуем превратить в печатную. Приглашаю посмотреть, что у нас получилось. Запасайтесь печеньками и вниманием для приятного и вдумчивого чтения.

      В общем, перед вами переработанная и расширенная ubbook.

      Плюс перевод на английский.


  1. 9241304
    28.01.2025 11:47

    В кои это веки предельно полезный материал на хабре, и без тг канала)

    Многие... Да я бы даже сказал, почти все плюсовики забивают на ub. Забивают в том плане, что считают, что ничего страшного не произойдёт, даже если это ub случится.

    Так что в первую очередь надо вбить, что наличие ub недопустимо, а потом уж разбирать кейсы. Один умный человек объяснял это предельно доходчиво: может, ты ничего и не заметишь, а может у тебя и важный файл на диске удалится)


  1. mpa4b
    28.01.2025 11:47

    Блин, а в ПДФку собрать никак было?


  1. qweururu
    28.01.2025 11:47

    Я как-то и не обратил внимания кто там автор, а кто ещё кто-то. Заметил только сейчас.

    Автор — Дмитрий Свиридкин

    Более восьми лет работает в сфере коммерческой разработки высокопроизводительного программного обеспечения на C и C++.

    Это та растошлюха, которая обгадилась здесь: https://habr.com/ru/companies/ruvds/articles/747826/comments/#comment_25755608 ? О производительности персонаж ничего не знает. Как и о безопасности, кстати. Типичная картина.


    1. Siemargl
      28.01.2025 11:47

      А в чем там проблема? Что абстрактное УБ не проявляется (пока) на существующих компиляторах?