Андрей Карпов, Дмитрий Свиридкин | Экскурс в неопределенное поведение C++ (2025) [PDF]
Автор: Андрей Карпов, Дмитрий Свиридкин
Издательство: БХВ-Петербург
Серия: Профессиональное программирование
ISBN: 978-5-9775-2073-7
Жанр: Компьютерная литература, С++
Формат: PDF
Качество: Изначально электронное (ebook)
Иллюстрации: Отсутствуют
Описание:Книга представляет собой обширный справочник типичных, а также очень редко встречающихся ошибок, характерных для программ на C++, Rust и других языках для низкоуровневого и системного программирования, в частности на ассемблере. Все рассмотренные проблемы так или иначе связаны с неопределенным, неуточненным и определяемым реализацией поведением языковых конструкций. Наибольшее внимание уделено неопределенному поведению, возможным признакам его присутствия в программах и методам поиска, диагностики и устранения такого поведения.
Оглавление:
От автора, или Коротко о том, зачем и почему......................................................... 9
От научного редактора ................................................................................................ 11
Введение.......................................................................................................................... 13
Что такое неопределенное поведение и как оно проявляется..................................... 13
Как искать неопределенное поведение? ....................................................................... 15
ГЛАВА 1. Целые и вещественные числа.................................................................. 19
Переполнение целых знаковых чисел ........................................................................... 19
Сужающие преобразования и неявное приведение типов .......................................... 30
Integer promotion.............................................................................................................. 35
Что происходит? ...................................................................................................... 36
К чему это приводит? .............................................................................................. 36
Что делать? ............................................................................................................... 36
Тип char и знаковое расширение ................................................................................... 37
Что делать? ............................................................................................................... 38
Унарный минус и беззнаковые числа............................................................................ 39
Числа с плавающей точкой ............................................................................................ 40
Плавающая точка и шаблоны ................................................................................. 41
ГЛАВА 2. Нарушение жизненного цикла объектов ............................................... 45
Висячие ссылки, указатели и use-after-free: общие случаи ......................................... 45
Автовывод типов и висячие ссылки.............................................................................. 51
Проблема явного указания типа ............................................................................. 51
Проблемы автоматического вывода типа .............................................................. 54
Что за зверь std::string_view? ......................................................................................... 56
Самоинициализация........................................................................................................ 59
std::vector и инвалидация ссылок................................................................................... 62
Списки захвата лямбда-функций................................................................................... 64
Создание кортежей ......................................................................................................... 66
Внезапная мутабельность............................................................................................... 69
Такие разные контейнеры ....................................................................................... 69
Короткие строки и длинные баги ........................................................................... 70
Как бороться? ........................................................................................................... 72
Proxy-объекты и неявные ссылки.................................................................................. 73
Паттерн Proxy и proxy-объекты.............................................................................. 74
Больше неожиданностей!........................................................................................ 76
Что еще нужно сделать и почему нужно быть бдительным? .............................. 77
Что делать и как бороться? ..................................................................................... 78
Ситуация use-after-move ................................................................................................. 78
std::vector и другие похожие контейнеры.............................................................. 80
std::string ................................................................................................................... 82
std::optional ............................................................................................................... 83
Что же делать?.......................................................................................................... 83
Циклы по диапазонам ..................................................................................................... 84
Стандарт С++23 ....................................................................................................... 87
Продление времени жизни объектов............................................................................. 87
Прямая инициализация и ссылочные поля ................................................................... 94
Значения по умолчанию для ссылочных полей .................................................... 96
Тернарный оператор и временные объекты ................................................................. 97
Корутины и ссылки....................................................................................................... 104
ГЛАВА 3. (Не)работающий синтаксис.................................................................... 121
Забытый return ............................................................................................................... 121
Самое раздражающее правило синтаксического анализа ......................................... 123
Неконстантные константы ........................................................................................... 125
Const и оптимизации..................................................................................................... 127
Const, время жизни и происхождение указателей ..................................................... 130
Семантика перемещения .............................................................................................. 132
Накладные расходы ............................................................................................... 132
Что случается после............................................................................................... 133
Эллипсис и функции с произвольным числом аргументов ...................................... 135
Оператор "запятая" ....................................................................................................... 138
Перегрузки оператора "запятая"........................................................................... 139
Многомерный operator[] ............................................................................................... 141
try-блок функций........................................................................................................... 144
Типы нулевого размера ................................................................................................ 148
Массив нулевого размера...................................................................................... 151
Теговая диспетчеризация ...................................................................................... 152
Послесловие к оптимизации размеров структур ................................................ 153
(Не)явное приведение типов ........................................................................................ 154
Неявное приведение к bool........................................................................................... 161
Пользовательские операторы сравнения в C++20 ..................................................... 163
Атрибут [[assume]] ........................................................................................................ 166
Конструктор по умолчанию и =default ....................................................................... 169
ГЛАВА 4. Стандартная библиотека ........................................................................ 173
NULL-терминированные строки ................................................................................. 173
Длина строки .......................................................................................................... 173
С++ и std::string ...................................................................................................... 174
C++ и std::string_view ............................................................................................ 174
Как бороться? ......................................................................................................... 176
Конструкторы std::shared_ptr ....................................................................................... 176
Всё как обычно плохо............................................................................................ 179
Функция std::shared_from_this ..................................................................................... 180
Потоки ввода-вывода.................................................................................................... 188
Грабли первые: состояние объекта i/ostream....................................................... 188
Грабли вторые: глобальная локаль....................................................................... 189
Грабли третьи: кодировка путей к файлам и fstream.......................................... 189
Грабли четвертые: бинарный режим.................................................................... 190
Грабли пятые: ошибки чтения и конец потока ................................................... 191
Грабли шестые: readsome ...................................................................................... 192
Функции стандартной библиотеки как параметры.................................................... 193
Что же делать?........................................................................................................ 196
Представление std::ranges::views ................................................................................. 199
Библиотека std::ranges ........................................................................................... 199
Концепты ................................................................................................................ 200
А теперь стреляем с двух рук! .............................................................................. 200
Конструкция std::views::transform | filter..................................................................... 207
Как же это всё получилось и кто в этом виноват? .............................................. 212
Что же делать?........................................................................................................ 213
operator[] для ассоциативных контейнеров................................................................. 216
std::enable_if_t против std::void_t................................................................................. 218
Тип std::aligned_storage................................................................................................. 223
Перегруженные конструкторы стандартной библиотеки ......................................... 228
Класс std::uniform_int_distribution ............................................................................... 229
Функция std::vector::reserve и метод std::vector::resize .............................................. 231
Применение std::make_unique_for_overwrite ....................................................... 236
Функция-член std::basic_string::resize_and_overwrite ......................................... 236
Класс-шаблон std::function ........................................................................................... 237
Спецэффект 1: вариантность ................................................................................ 237
Спецэффект 2: отломанный const......................................................................... 241
Спецэффект 3: move-only не поддерживается..................................................... 242
Функция std::forward..................................................................................................... 243
ГЛАВА 5. Исполнение программы.......................................................................... 247
Бесконечные циклы и проблема остановки................................................................ 247
Рекурсия......................................................................................................................... 250
Ложный noexcept........................................................................................................... 252
Условный noexcept................................................................................................. 253
Переполнение буфера ................................................................................................... 254
Поддержка сборщика мусора (неактуально для C++23 и новее) ............................. 257
(N)RVO против RAII..................................................................................................... 260
Pазыменование нулевых указателей ........................................................................... 264
Фиаско со статическим порядком инициализации .................................................... 268
SIOF и неиспользуемые заголовки....................................................................... 271
Смешиваем static и inline.............................................................................................. 273
Нарушение правила ODR ............................................................................................. 280
Что же делать?........................................................................................................ 282
Зарезервированные имена..................................................................................... 288
Нарушение правила ODR и разделяемые библиотеки ....................................... 290
Тривиальные типы и ABI ............................................................................................. 296
Неинициализированные переменные.......................................................................... 300
Как избежать неинициализированные переменные ........................................... 303
И последнее ............................................................................................................ 306
Бесконечные диапазоны в С++20 ................................................................................ 306
Нам поможет std::unreachable_sentinel................................................................. 310
Невиртуальные виртуальные функции ....................................................................... 312
Освобождение ресурсов в деструкторах с использованием
вспомогательных функций.................................................................................... 316
Массивы переменной длины........................................................................................ 324
Владение, исключения и ошибки ................................................................................ 330
ГЛАВА 6. Происхождение указателей .................................................................... 335
Невалидные указатели.................................................................................................. 335
Размещающий оператор new и массивы ..................................................................... 338
Невыровненные ссылки................................................................................................ 339
Правило strict aliasing и практика type punning .......................................................... 343
Что же делать?........................................................................................................ 349
ГЛАВА 7. Асинхронность и параллелизм .............................................................. 351
Гонка данных................................................................................................................. 351
Потокобезопасен ли указатель std::shared_ptr? .......................................................... 354
Ожидание потоков ........................................................................................................ 355
Повторный захват мьютекса ........................................................................................ 356
Сигнало(не)безопасность ............................................................................................. 358
Как бороться? ......................................................................................................... 360
Примитив сondition_variable, или Как сделать всё правильно
и уйти в deadlock ........................................................................................................... 360
Гонки за vptr .................................................................................................................. 363
Асинхронное выполнение кода с помощью std::async .............................................. 366
Конкурентный доступ к файловой системе................................................................ 371
Послесловие: статический анализ и неопределенное поведение ....................... 373
Интернет-источники и литература.......................................................................... 375
Скриншоты:
Время раздачи: с 10 до 20 (минимум до появления первых 3-5 скачавших)