
Undefined behaviour в C++: как выстрелить себе в ногу
Программа с UB может годами работать в отладке и падать в проде после смены компилятора. Разбираем, почему это происходит, где чаще всего прячется UB и как его ловить.

Программа с UB может годами работать в отладке и падать в проде после смены компилятора. Разбираем, почему это происходит, где чаще всего прячется UB и как его ловить.

Почему два потока видят записи в разном порядке, что на самом деле означают memory_order_relaxed и seq_cst и где счётчик на atomic всё равно ломается.

Что проверить в сетевом коде на C++ до того, как он уйдёт под нагрузку: таймауты, частичные записи, обработка EINTR, лимиты дескрипторов и корректное завершение соединений.

Разбор строк через std::stringstream и ручные циклы даёт лишние копии и падает на кривом вводе. Разбираем std::string_view, std::from_chars и подходы к разбору без аллокаций на C++17 и C++20.

Три популярных фреймворка для юнит-тестов в C++: чем отличаются по скорости сборки, синтаксису и возможностям, что мокать проще и когда какой брать.

Проект собирается локально, а на CI падает с undefined reference. Разбираемся, где заканчивается заголовочный файл и начинается линковка, и почему CMake здесь надёжнее ручных флагов.

Как организовать сборку C++ через CMake, чтобы проект собирался у коллеги без правки путей: target-based подход, поиск зависимостей и типичные грабли с переменными и глобальными флагами.

Где ставить const, а где он бесполезен, чем const& отличается от const и как не сломать бинарную совместимость. Практический чек-лист для C++17 и новее.

Ручной new/delete — источник утечек и двойных освобождений. Разбираем, как владение памятью выражать через типы, а не комментарии, и когда какой умный указатель уместен.

std::atomic не делает код автоматически потокобезопасным. Разбираем ошибки с моделями памяти, составными операциями и ложным ощущением защиты — на примерах, которые компилируются, но ведут себя не так, как ждёт автор.

Как безопасно делить данные между потоками в C++17/20: mutex против atomic, где нужен lock_guard, а где обойтись без него, и почему condition_variable проверяют в цикле.

Исключения, коды возврата, std::expected и std::optional решают одну задачу — сообщить о неудаче, но по-разному бьют по производительности и читаемости. Разбираем, где какой подход платит меньше.