Экскурс в неопределенное поведение C++, Свиридкин Д.О., Карпов А.Н., 2025.
Книга представляет собой обширный справочник типичных, а также очень редко встречающихся ошибок, характерных для программ на C++, Rust и других языках для низкоуровневого и системного программирования, в частности на ассемблере. Все рассмотренные проблемы так или иначе связаны с неопределенным, неуточненным и определяемым реализацией поведением языковых конструкций. Наибольшее внимание уделено неопределенному поведению, возможным признакам его присутствия в про-граммах и методам поиска, диагностики и устранения такого поведения.

Прямая инициализация и ссылочные поля.
Инициализация в C++— одна из самых сложных и запутанных тем среди, наверное. всех языков программирования. Ей даже отдельная книга на 400 страниц посвящена — Bartlomiej Filipek "C++ Initialization Story: A Guide Through All Initialization Options and Related C++ Areas (C++ Stories)". Так что я позволю себе не разбирать все тонкости инициализации, а затрону лишь ту прекрасную часть, которая непосредственно связана с нашими любимыми ошибками — висячими ссылками.
С++11 принес в язык списки инициализации (list uniform initialization syntax). С фигурными скобочками. Они считаются нынче почти всегда предпочтительными. Но вот незадача: в некоторых краевых случаях их недостаточно.
ОГЛАВЛЕНИЕ.
От автора, или Коротко о том, зачем и почему.
От научного редактора.
Введение.
Что такое неопределенное поведение и как оно проявляется.
Как искать неопределенное поведение?.
ГЛАВА 1. Целые и вещественные числа.
Переполнение целых знаковых чисел.
Сужающие преобразования и неявное приведение типов.
Integer promotion.
Что происходит?.
К чему это приводит?.
Что делать?.
Тип char и знаковое расширение.
Что делать?.
Унарный минус и беззнаковые числа.
Числа с плавающей точкой.
Плавающая точка и шаблоны.
ГЛАВА 2. Нарушение жизненного цикла объектов.
Висячие ссылки, указатели и use-after-free: общие случаи.
Автовывод типов и висячие ссылки.
Проблема явного указания типа.
Проблемы автоматического вывода типа.
Что за зверь std::string_view?.
Самоинициализация.
std::vector и инвалидация ссылок.
Списки захвата лямбда-функций.
Создание кортежей.
Внезапная мутабельность.
Такие разные контейнеры.
Короткие строки и длинные баги.
Как бороться?.
Proxy-объекты и неявные ссылки.
Паттерн Proxy и proxy-объекты.
Больше неожиданностей!.
Что еще нужно сделать и почему нужно быть бдительным?.
Что делать и как бороться?.
Ситуация use-after-move.
std::vector и другие похожие контейнеры.
std::string.
std::optional.
Что же делать?.
Циклы по диапазонам.
Стандарт С++23.
Продление времени жизни объектов.
Прямая инициализация и ссылочные поля.
Значения по умолчанию для ссылочных полей.
Тернарный оператор и временные объекты.
Корутины и ссылки.
ГЛАВА 3. (Не)работающий синтаксис.
Забытый return.
Самое раздражающее правило синтаксического анализа.
Неконстантные константы.
Const и оптимизации.
Const, время жизни и происхождение указателей.
Семантика перемещения.
Накладные расходы.
Что случается после.
Эллипсис и функции с произвольным числом аргументов.
Оператор "запятая".
Перегрузки оператора "запятая".
Многомерный operator[].
try-блок функций.
Типы нулевого размера.
Массив нулевого размера.
Теговая диспетчеризация.
Послесловие к оптимизации размеров структур.
(Не)явное приведение типов.
Неявное приведение к bool.
Пользовательские операторы сравнения в C++20.
Атрибут [[assume]].
Конструктор по умолчанию и =default.
ГЛАВА 4. Стандартная библиотека.
NULL-терминированные строки.
Длина строки.
С++ и std::string.
C++ и std::string_view.
Как бороться?.
Конструкторы std::shared_ptr.
Всё как обычно плохо.
Функция std::shared_from_this.
Потоки ввода-вывода.
Грабли первые: состояние объекта i/ostream.
Грабли вторые: глобальная локаль.
Грабли третьи: кодировка путей к файлам и fstream.
Грабли четвертые: бинарный режим.
Грабли пятые: ошибки чтения и конец потока.
Грабли шестые: readsome.
Функции стандартной библиотеки как параметры.
Что же делать?.
Представление std::ranges::views.
Библиотека std::ranges.
Концепты.
А теперь стреляем с двух рук!.
Конструкция std::views::transform | filter.
Как же это всё получилось и кто в этом виноват?.
Что же делать?.
operator[] для ассоциативных контейнеров.
std::enable_if_t против std::void_t.
Тип std::aligned_storage.
Перегруженные конструкторы стандартной библиотеки.
Класс std::uniform_int_distribution.
Функция std::vector::reserve и метод std::vector::resize.
Применение std::make_unique_for_overwrite.
Функция-член std::basic_string::resize_and_overwrite.
Класс-шаблон std::function.
Спецэффект 1: вариантность.
Спецэффект 2: отломанный const.
Спецэффект 3: move-only не поддерживается.
Функция std::forward.
ГЛАВА 5. Исполнение программы.
Бесконечные циклы и проблема остановки.
Рекурсия.
Ложный noexcept.
Условный noexcept.
Переполнение буфера.
Поддержка сборщика мусора (неактуально для C++23 и новее).
(N)RVO против RAII.
Pазыменование нулевых указателей.
Фиаско со статическим порядком инициализации.
SIOF и неиспользуемые заголовки.
Смешиваем static и inline.
Нарушение правила ODR.
Что же делать?.
Зарезервированные имена.
Нарушение правила ODR и разделяемые библиотеки.
Тривиальные типы и ABI.
Неинициализированные переменные.
Как избежать неинициализированные переменные.
И последнее.
Бесконечные диапазоны в С++20.
Нам поможет std::unreachable_sentinel.
Невиртуальные виртуальные функции.
Освобождение ресурсов в деструкторах с использованием вспомогательных функций.
Массивы переменной длины.
Владение, исключения и ошибки.
ГЛАВА 6. Происхождение указателей.
Невалидные указатели.
Размещающий оператор new и массивы.
Невыровненные ссылки.
Правило strict aliasing и практика type punning.
Что же делать?.
ГЛАВА 7. Асинхронность и параллелизм.
Гонка данных.
Потокобезопасен ли указатель std::shared_ptr?.
Ожидание потоков.
Повторный захват мьютекса.
Сигнало(не)безопасность.
Как бороться?.
Примитив сondition_variable, или Как сделать всё правильно и уйти в deadlock.
Гонки за vptr.
Асинхронное выполнение кода с помощью std::async.
Конкурентный доступ к файловой системе.
Послесловие: статический анализ и неопределенное поведение.
Интернет-источники и литература.
Бесплатно скачать электронную книгу в удобном формате, смотреть и читать:
Скачать книгу Экскурс в неопределенное поведение C++, Свиридкин Д.О., Карпов А.Н., 2025 - fileskachat.com, быстрое и бесплатное скачивание.
Скачать pdf
Ниже можно купить эту книгу, если она есть в продаже, и похожие книги по лучшей цене со скидкой с доставкой по всей России.Купить книги
Скачать - pdf - Яндекс.Диск.
Дата публикации:
Теги: учебник по программированию :: программирование :: Свиридкин :: Карпов
Смотрите также учебники, книги и учебные материалы:
Предыдущие статьи:








