{"id":15038982,"url":"https://github.com/nekrolm/ubbook","last_synced_at":"2026-01-28T10:32:12.193Z","repository":{"id":37008358,"uuid":"321057091","full_name":"Nekrolm/ubbook","owner":"Nekrolm","description":"C++ programmer's guide to undefined behavior","archived":false,"fork":false,"pushed_at":"2025-01-22T15:41:30.000Z","size":529,"stargazers_count":1206,"open_issues_count":6,"forks_count":60,"subscribers_count":49,"default_branch":"master","last_synced_at":"2025-02-01T09:15:43.444Z","etag":null,"topics":["cpp-programming","rust-programming","undefined-behavior"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Nekrolm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-13T12:14:45.000Z","updated_at":"2025-02-01T08:36:44.000Z","dependencies_parsed_at":"2024-04-20T11:30:07.350Z","dependency_job_id":"b8efb2bd-70be-444c-88a6-1ffd11342a0f","html_url":"https://github.com/Nekrolm/ubbook","commit_stats":{"total_commits":253,"total_committers":22,"mean_commits":11.5,"dds":0.2490118577075099,"last_synced_commit":"c6f44fdb16e1ee490fc1f67022ebfa9c43f0bd88"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nekrolm%2Fubbook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nekrolm%2Fubbook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nekrolm%2Fubbook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nekrolm%2Fubbook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Nekrolm","download_url":"https://codeload.github.com/Nekrolm/ubbook/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245779445,"owners_count":20670684,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp-programming","rust-programming","undefined-behavior"],"created_at":"2024-09-24T20:41:06.160Z","updated_at":"2026-01-28T10:32:12.152Z","avatar_url":"https://github.com/Nekrolm.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Путеводитель C++ программиста по неопределенному поведению\n\n*[If you are looking for english version](README_ENG.md)*\n\n#### *Паникуй!*\n\n--------------\n\n### Коротко о том, зачем и почему\n\nВсе начинается просто и незатейливо: обычный десятиклассник увлекается программированием, знакомится с алгоритмическими задачками, решения которых должны быть быстрыми. Узнает о языке C++, учит минимальный синтаксис, основные конструкции, контейнеры, решает задачи с предопределенным и всегда корректным форматом ввода и вывода, и горя не знает...\n\nВ это же время, где-то в большом мире, матерые разработчики каждый день ругают то одни языки программирования, то другие. По самым разным причинам: не удобно, нет какой-то возможности, много лишних букв писать, ошибки в стандартной библиотеке... Но есть язык, который ругают за все и особенно за такую непонятную и таинственную вещь как неопределенное поведение (undefined behavior, UB).\n\nСпустя лет пять или шесть наш простой десятиклассник, горя не видавший в море оторванных от реальности программ, внезапно узнает, что тем самым горячо нелюбимым языком всегда был, остается и будет его C++.\n\nА потом еще в течение нескольких лет он наткнется на самые кошмарные и невероятные ужасы, поджидающие программистов на C++ почти на каждом шагу. Так и появится эта серия заметок, собирающая наиболее отвратительные примеры, на которые очень легко наткнуться при решении повседневных задач.\n\n--------------\n\n«Преждевременная оптимизация — корень всех зол» (Д. Кнут или Э. Хоар — в зависимости от того, какой источник смотрите). Язык С++, пожалуй, наиболее яркая тому демонстрация: огромное количество ошибок в C++ программах связаны\nс неопределенным поведением, заложенным в фундаменте языка просто для того, чтобы дать простор оптимизациям на этапе компиляции.\n\nЕсли вы собираетесь писать на C++ код, в работоспособности которого хотите быть хоть немного уверенными, стоит знать о существовании различных  подводных камней и ловко расставленных мин в стандарте языка, его библиотеке, и всячески их избегать. Иначе ваши программы будут работать правильно только на конкретной машине и только по воле случая.\n\nВ этой книге я собрал множество самых разных примеров как в коде на C и C++ можно наткнуться на неопределенное, неожиданное и совершенно ошибочное поведение. И хотя основной фокус книги всё же на неопределенном поведении, в некоторых разделах описываются вещи вполе специфицированные, но довольно неочевидные.\n\n**Важно:** этот сборник **не является учебным пособием** по языку и рассчитан на тех, кто уже знаком с программированием, с C++, и понимает основные его конструкции.\n\n----\n\n\n# Содержание\n0. [Что такое UB и как оно проявляется](what_is_ub.md)\n1. [Как искать UB?](how_to_find_ub.md)\n2. Целые и вещественные числа\n   1. [Сужающие преобразования](numeric/narrowing.md)\n   2. [Переполнение знаковых целых чисел](numeric/overflow.md)\n   3. [Числа с плавающей точкой](numeric/floats.md)\n   4. [Integer promotion](numeric/integer_promotion.md)\n   5. [char и знаковое расширение](numeric/char_sign_extension.md)\n   6. [Унарный минус для беззнаковых чисел](numeric/unsigned_unary_minus.md)\n3. Нарушения lifetime объектов\n   1. [Висячие ссылки — общие случаи](lifetime/use_after_free_in_general.md)\n   2. [Автовывод типов и висячие ссылки](lifetime/decltype_auto_and_explicit_types.md)\n   3. [std::string_view](lifetime/string_view.md)\n   4. [Range-based for](lifetime/for_loop.md)\n   5. [Cамоинициализация](lifetime/self_init.md)\n   6. [std::vector и инвалидация ссылок](lifetime/vector_invalidation.md)\n   7. [Висячие ссылки в лямбдах](lifetime/lambda_capture.md)\n   8. [Создание кортежей](lifetime/tuple_creation.md)\n   9. [Внезапная мутабельность](lifetime/unexpected_mutability.md)\n   10. [Proxy-объекты и ссылки](lifetime/proxy_objects.md)\n   11. [use-after-move](lifetime/use-after-move.md)\n   12. [lifetime extension](lifetime/lifetime_extension.md)\n   13. [C++20 direct initialization и ссылочные поля](lifetime/direct_initialization_references.md)\n   14. [Тернарный оператор](lifetime/ternary_operator.md)\n   15. [Корутины и время жизни](lifetime/coroutines_and_lifetimes.md)\n4. (Не)работающий синтаксис\n   1. [Most Vexing Parse](syntax/most_vexing_parse.md)\n   2. [Const](syntax/const_launder.md)\n   3. [std::move](syntax/move.md)\n   4. [Потерянный return](syntax/missing_return.md)\n   5. [Эллипсис и функции с произвольным числом аргументов](syntax/c_variadic.md)\n   6. [`operator ,`](syntax/comma_operator.md)\n   7. [function-try-block](syntax/function-try-catch.md)\n   8. [Пустые структуры и типы нулевого размера](syntax/zero_size.md)\n   9. [(Не)явное приведение типов](syntax/explicit_but_implicit.md)\n   10. [Многомерный operator[]](syntax/multidimensional_subscript.md)\n   11. [Операторы сравнения в C++20](syntax/comparison_operator_rewrite.md)\n   12. [Атрибут [[assume]]](syntax/assume.md)\n   13. [Конструкторы по умолчанию и = default](syntax/default_default_constructor.md)\n   14. [implicit bool](syntax/implicit_bool.md)\n5. Стандартная библиотека\n   1. [NULL-терминированные строки](standard_lib/null_terminated_string.md)\n   2. [Конструирование std::shared_ptr](standard_lib/shared_ptr_constructor.md)\n   3. [shared_from_this](standard_lib/shared_from_this.md)\n   4. [потоки ввода/вывода](standard_lib/iostreams.md)\n   5. [std::aligned_storage](standard_lib/aligned_storage.md)\n   6. [функции стандартной библиотеки как параметры](standard_lib/function_pass_and_address_restriction.md)\n   7. [std::ranges::views](standard_lib/ranges_views_lazy.md)\n   8. [`operator[] ` ассоциативных контейнеров](standard_lib/map_subscript.md)\n   9. [std::enable_if/std::void_t](standard_lib/enable_if_void_t.md)\n   10. [Конструкторы контейнеров](standard_lib/stl_constructors.md)\n   11. [std::uniform_int_distribution](standard_lib/uniform_int_distribution.md)\n   12. [std::ranges::transform | filter](standard_lib/transform_filter_ranges.md)\n   13. [vector::reserve и vector::resize](standard_lib/vector_resize_reserve.md)\n   14. [std::function](standard_lib/std_function_const.md)\n   15. [std::forward](standard_lib/forward.md)\n6. Исполнение программы\n   1.  [Бесконечные циклы](runtime/endless_loop.md)\n   2.  [Рекурсия](runtime/recursion.md)\n   3.  [Ложный noexcept](runtime/noexcept.md)\n   4.  [Переполнение буфера](runtime/array_overrun.md)\n   5.  [Сборщик мусора](runtime/garbage_collector.md)\n   6.  [RAII vs (N)RVO](runtime/rvo_vs_raii.md)\n   7.  [Разыменование nullptr](runtime/nullptr_dereference.md)\n   8.  [Static initialization order fiasco](runtime/static_initialization_order_fiasco.md)\n   9.  [Static inline](runtime/static_inline.md)\n   10.  [ODR violation](runtime/odr_violation.md)\n   11. [Зарезервированные имена](runtime/reserved_names.md)\n   12. [Тривиальные типы и ABI](runtime/trivial_types_and_ABI.md)\n   13. [Неинициализированные переменные](runtime/uninitialized.md)\n   14. [Ranges. Unreachable sentinel](runtime/unreachable_sentinel.md)\n   15. [Невиртуальные виртуальные функции](runtime/virtual_functions.md)\n   16. [Variable length array](runtime/vla.md)\n   17. [ODR violation и разделяемые библиотеки](runtime/dll_and_odr_violation.md)\n   18. [Владение и исключения](runtime/ownership_and_exceptions.md)\n7. Происхождение указателей\n   1. [Невалидные указатели](pointer_provenance/invalid_pointer.md)\n   2. [Placement `operator new[]`](pointer_provenance/array_placement_new.md)\n   3. [Невыровненные ссылки](pointer_provenance/misaligned_reference.md)\n   4. [strict aliasing](pointer_provenance/strict_aliasing.md)\n8. Асинхронность и параллелизм\n   1. [Race condition](concurrency/race_condition.md)\n   2. [shared_ptr](concurrency/shared_ptr.md)\n   3. [thread::join](concurrency/jthread.md)\n   4. [Повторный захват mutex](concurrency/double_lock.md)\n   5. [Signal-unsafe](concurrency/signal_unsafe.md)\n   6. [condition_variable](concurrency/condition_variable.md)\n   7. [Гонки за vptr](concurrency/vptr.md)\n   8. [std::async](concurrency/std_async.md)\n   9. [Файловая система](concurrency/filesystem.md)\n\n\n---\n## Помощь\n\nВ тексте могут быть ошибки, опечатки, неточности, он может устаревать. Пожелания, предложения и замечания приветствуются: можно завести `issue` или сделать `pull request`.\n\n## И еще кое-что\n\nБегать за вами и судиться автор сего сборника не будет, но все-таки:\n\nНа этот проект **можно** ссылаться. Можно приводить примеры из него, со ссылками, конечно же.\n\nДля копирования и иного воспроизведения **надо** получить согласие автора\n\n**Нельзя** использовать в платных сервисах или взимать плату за обучение по этим материалам.\n\n#### Ну и самое последнее примечание\n\nЧерновое название этой работы, \"Ружье достаточной огневой мощи, чтобы на нем повеситься\", как могли догадаться искушенные читатели, было эдаким реверансом в сторону известного (но очень плохо состарившегося) сборника по C++ \"Веревка достаточной длины, чтобы выстрелить себе в ногу\" от Алана Голуба. Но, к сожалению, мы живем в нежном мире победивших алгоритмов ранжирования и надзорных органов, то и дело стремящихся кого-нибудь от чего-нибудь защитить. \n\nАвтор, конечно, очень бы хотел защитить всех от C++, и именно этому и служит данных сборник, но с заблокированным и пессимизированным репозиторием прогресса в этом направлении не будет.\n\n\n_Copyright 2020-2024 Dmitry Sviridkin_\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnekrolm%2Fubbook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnekrolm%2Fubbook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnekrolm%2Fubbook/lists"}