🧨 Address Sanitizer в Visual Studio 2022
💡 Microsoft выпустила обновление Address Sanitizer для Visual Studio 2022 версии 17.14 с фокусом на качество и внедрение
❗ Ключевые улучшения версии:
• расширенная поддержка
• автоматизированное тестирование совместимости с
• исправление регрессии отображения
• возможность отключения
Самое интересное —
Это означает, что
👉 Статья
Библиотека C/C++ разработчика #буст
«Опять segfault в продакшене из-за memory corruption... А ведь код проходил все тесты!»
💡 Microsoft выпустила обновление Address Sanitizer для Visual Studio 2022 версии 17.14 с фокусом на качество и внедрение
ASan
в собственный toolchain
.❗ Ключевые улучшения версии:
• расширенная поддержка
__asan_default_options
для secure приложений• автоматизированное тестирование совместимости с
Xbox OS
• исправление регрессии отображения
call stack
на x64• возможность отключения
container annotations
по allocator
Самое интересное —
Microsoft
теперь использует ASan
для тестирования самого MSVC
компилятора. Каждый PR должен проходить тесты, где компилятор собран с /fsanitize=address😼
Это означает, что
ASan
теперь мониторит не только вашу программу, но и сам процесс компиляции, выявляя memory safety
ошибки в toolchain
.👉 Статья
Библиотека C/C++ разработчика #буст
🔥4❤3
📦 Создание модулей C++20 для быстрой компиляции
❗️ Проблема:
Медленная компиляция из-за #include файлов.
✅ Решение:
1️⃣ Создайте
2️⃣ Экспортируйте нужные декларации
3️⃣ Импортируйте модуль в коде
❌ Частые ошибки:
Забывать ключевое слово export для публичных функций.
💡 Совет:
Modules работают не во всех компиляторах — проверяйте поддержку!
Библиотека C/C++ разработчика #буст
Modules
— это будущее организации C++ кода.Медленная компиляция из-за #include файлов.
module interface
файл// math_utils.ixx
export module math_utils;
export namespace math {
int add(int a, int b) {
return a + b;
}
double sqrt_approx(double x) {
return x / 2.0; // Упрощенная версия
}
}
// main.cpp
import math_utils;
#include <iostream>
int main() {
std::cout << math::add(3, 4) << std::endl;
return 0;
}
Забывать ключевое слово export для публичных функций.
Modules работают не во всех компиляторах — проверяйте поддержку!
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤1
🎯 Что посмотреть: когда метрики мотивируют неправильно
❗ Основные идеи подкаста:
✅ Не оптимизируй code coverage ради 100% — качество тестов важнее
✅ Lines of code — антиметрика (меньше часто лучше)
✅ Build time должен мотивировать на лучшую архитектуру
✅ Bug count без контекста может демотивировать тестирование
Метрики должны направлять к правильным решениям, а не быть игрой в цифры.
👉 Подкаст о метриках
Библиотека C/C++ разработчика #буст
Знаешь закон Гудхарта? «Когда метрика становится целью, она перестаёт быть хорошей метрикой». В C++ разработке это особенно актуально.
Андрей Бреслав
(ex-JetBrains, а теперь основатель стартапа) и Александр Ложечкин
(ex-Microsoft, ex-Amazon, а теперь CIO в банке) рассуждают, спорят, делятся опытом, и просто болтают на темы развития людей, руководства, технологий и всего остального.❗ Основные идеи подкаста:
✅ Не оптимизируй code coverage ради 100% — качество тестов важнее
✅ Lines of code — антиметрика (меньше часто лучше)
✅ Build time должен мотивировать на лучшую архитектуру
✅ Bug count без контекста может демотивировать тестирование
Метрики должны направлять к правильным решениям, а не быть игрой в цифры.
👉 Подкаст о метриках
Библиотека C/C++ разработчика #буст
❤5
🧑💻 AI-инструменты, которые я использую каждый день
Андрей, мидл C++ разработчик, рассказывает о том, какие современные AI-инструменты разработки он использует в повседневной работе.
Какие AI-инструменты облегчают вашу работу? Делитесь в комментариях 👇
Библиотека C/C++ разработчика #буст
Андрей, мидл C++ разработчик, рассказывает о том, какие современные AI-инструменты разработки он использует в повседневной работе.
Какие AI-инструменты облегчают вашу работу? Делитесь в комментариях 👇
Библиотека C/C++ разработчика #буст
👍4❤1🥰1
🎨 Qt Quick/QML — декларативный UI для C++ приложений
Если хотите создавать современные, анимированные интерфейсы без
Qt Quick — это декларативный framework для создания
👉 Установка:
💡 Примеры использования:
Дополнительные возможности:
— Встроенная поддержка анимаций
— Биндинг данных с C++ моделями
— Кастомные компоненты
— Горячая перезагрузка во время разработки
🔍 Интеграция с C++:
Библиотека C/C++ разработчика #буст
Если хотите создавать современные, анимированные интерфейсы без
HTML/CSS
, то Qt Quick
хороший выбор.Qt Quick — это декларативный framework для создания
UI
с использованием языка QML
. Позволяет легко создавать анимации, переходы и современные интерфейсы, интегрируясь с C++
логикой.👉 Установка:
# Часть Qt framework
# Установка через Qt Online Installer
# Или sudo apt install qtquick2-dev qtdeclarative5-dev
💡 Примеры использования:
// main.qml
import QtQuick 2.15
Rectangle {
width: 300; height: 200
color: "lightblue"
Text {
anchors.centerIn: parent
text: "Hello QML!"
}
}
Дополнительные возможности:
— Встроенная поддержка анимаций
— Биндинг данных с C++ моделями
— Кастомные компоненты
— Горячая перезагрузка во время разработки
🔍 Интеграция с C++:
class Backend : public QObject {
Q_OBJECT
Q_PROPERTY(QString data READ data NOTIFY dataChanged)
public slots:
void updateData() { /* логика */ }
};
qmlRegisterType<Backend>("com.myapp", 1, 0, "Backend");
Библиотека C/C++ разработчика #буст
👍7❤3😢1
Иногда мы не замечаем уязвимости и потенциальные проблемы в нашем коде. AI-помощник может сэкономить не только время, но и избавить от серьезных багов в продакшене.
Review this code for errors and refactor to fix any issues:
[Вставь свой код]
Было:
class DataProcessor {
public:
char* processData(char* input) {
char* buffer = new char[100];
strcpy(buffer, input);
return buffer;
}
void cleanup() {
// забыли освободить память
}
};
void example() {
DataProcessor dp;
char* result = dp.processData("some long input data that might overflow");
// утечка памяти - не вызываем delete
}
Стало (после AI-ревью):
class DataProcessor {
public:
std::string ProcessData(const std::string& input) {
// Используем std::string для безопасности
return input; // или любая другая обработка
}
// Деструктор не нужен - RAII работает автоматически
};
void Example() {
DataProcessor dp;
std::string result = dp.ProcessData("some long input data that might overflow");
// Автоматическое управление памятью
}
Что исправил AI:
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚8❤5😁2
🔄 std::source_location: автоматическое логирование
Забудьте FILE и LINE! std::source_location автоматически получает информацию о местоположении в коде.
Важно:
Библиотека C/C++ разработчика #буст
Забудьте FILE и LINE! std::source_location автоматически получает информацию о местоположении в коде.
#include <iostream>
#include <source_location>
#include <string_view>
void log_error(std::string_view message,
const std::source_location& loc = std::source_location::current()) {
std::cout << "ОШИБКА в " << loc.file_name()
<< ":" << loc.line()
<< " в функции " << loc.function_name()
<< " - " << message << std::endl;
}
void problematic_function() {
log_error("Что-то пошло не так!"); // Автоматически получит location
}
int main() {
log_error("Ошибка инициализации");
problematic_function();
return 0;
}
Важно:
source_location
вычисляется в точке вызова, не в точке определения функции.Библиотека C/C++ разработчика #буст
🔥20❤1👏1
Периодически требуется реализовать интеграцию с STL алгоритмами. Для этого необходимо реализовать правильные API.
Проблема: Нужно создать контейнер, работающий с range-based for и STL.
#include <iterator>
#include <algorithm>
#include <iostream>
template<typename T>
class CircularBuffer {
T* data;
size_t capacity_;
size_t size_;
size_t head_ = 0;
public:
explicit CircularBuffer(size_t capacity)
: data(new T[capacity]), capacity_(capacity), size_(0) {}
~CircularBuffer() { delete[] data; }
// Iterator class
class iterator {
T* ptr;
size_t capacity;
size_t index;
public:
using iterator_category = std::forward_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
using reference = T&;
iterator(T* ptr, size_t capacity, size_t index)
: ptr(ptr), capacity(capacity), index(index) {}
reference operator*() { return ptr[index % capacity]; }
pointer operator->() { return &ptr[index % capacity]; }
iterator& operator++() {
++index;
return *this;
}
iterator operator++(int) {
iterator tmp = *this;
++index;
return tmp;
}
bool operator==(const iterator& other) const {
return index == other.index;
}
bool operator!=(const iterator& other) const {
return !(*this == other);
}
};
void push(const T& item) {
data[(head_ + size_) % capacity_] = item;
if (size_ < capacity_) {
++size_;
} else {
++head_;
head_ %= capacity_;
}
}
iterator begin() { return iterator(data, capacity_, head_); }
iterator end() { return iterator(data, capacity_, head_ + size_); }
size_t size() const { return size_; }
bool empty() const { return size_ == 0; }
};
int main() {
CircularBuffer<int> buffer(5);
// Заполняем буфер
for (int i = 1; i <= 7; ++i) {
buffer.push(i);
}
// Range-based for работает!
for (const auto& item : buffer) {
std::cout << item << " ";
}
std::cout << std::endl;
// STL алгоритмы работают!
auto it = std::find(buffer.begin(), buffer.end(), 5);
if (it != buffer.end()) {
std::cout << "Found: " << *it << std::endl;
}
}
Частые ошибки: Не реализовать все необходимые operator для итератора.
💡 Совет: Правильные итераторы делают ваш контейнер first-class citizen в ST.
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3
⚙️ Boost.Program_options
Boost.Program_options — это библиотека для элегантного парсинга аргументов командной строки и конфигурационных файлов с автоматической генерацией help и валидацией параметров.
👉 Установка:
💡 Примеры использования:
✍️ Дополнительные возможности:
— Поддержка конфигурационных файлов
— Валидация типов и значений
— Группировка опций
— Автоматическая генерация справки
🔍 Специальная фича:
Библиотека C/C++ разработчика #буст
Устали писать парсинг argc/argv вручную для каждого приложения?
Boost.Program_options — это библиотека для элегантного парсинга аргументов командной строки и конфигурационных файлов с автоматической генерацией help и валидацией параметров.
👉 Установка:
# Часть Boost libraries
sudo apt install libboost-program-options-dev
# Или через vcpkg: vcpkg install boost-program-options
💡 Примеры использования:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
po::options_description desc("Options");
desc.add_options()
("help,h", "Help message")
("input,i", po::value<string>(), "Input file")
("verbose,v", "Verbose output");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
✍️ Дополнительные возможности:
— Поддержка конфигурационных файлов
— Валидация типов и значений
— Группировка опций
— Автоматическая генерация справки
🔍 Специальная фича:
// Комбинирование источников конфигурации
po::store(po::parse_command_line(argc, argv, desc), vm);
po::store(po::parse_config_file("config.ini", desc), vm);
po::notify(vm); // Применение всех значений
Библиотека C/C++ разработчика #буст
🔥5❤3👍3❤🔥1
Часто возникает ситуация, когда нужно добавить новую функциональность в существующую функцию. В C++ это особенно актуально при работе с шаблонами, алгоритмами и обработкой данных.
Для того чтобы корректно добавить параметр в функцию и расширить её возможности, используй следующий промпт:
Add a parameter to this function to do [ФУНКЦИОНАЛЬНОСТЬ]
[ВСТАВТЕ ВАШ КОД ЗДЕСЬ]
До:
void processData(const std::vector<int>& data) {
for (const auto& item : data) {
std::cout << item << std::endl;
}
}
После (добавили параметр для кастомного форматирования):
void processData(const std::vector<int>& data,
const std::string& format = "{}: {}") {
for (size_t i = 0; i < data.size(); ++i) {
std::cout << std::format(format, i, data[i]) << std::endl;
}
}
✏️ Как часто вам приходится расширять функциональность существующих функций?
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😢6🔥2🥱2❤1
✅ Чек-лист: Автоматическое форматирование кода для единообразного стиля в команде
🎯 Настройка и конфигурация
✓ Создайте .clang-format файл в корне проекта
✓ Выберите базовый стиль
✓ Настройте отступы, скобки и переносы строк
✓ Добавьте специфичные правила для вашего проекта
🎯 Интеграция с инструментами
✓ Настройте автоформатирование в IDE
✓ Используйте pre-commit hooks для Git
✓ Интегрируйте с CI для проверки стиля
✓ Добавьте команды форматирования в CMake
🎯 Командная работа
✓ Документируйте стиль кода в README
✓ Проводите code review с проверкой стиля
✓ Используйте .clang-format-ignore для исключений
✓ Настройте автоматическое форматирование
🎯 Продвинутые возможности
✓ Используйте clang-format-diff для частичного форматирования
✓ Настройте языкоспецифичные правила
✓ Применяйте макросы для кастомизации
✓ Интегрируйте с другими linter'ами
Как измерить результат: Подсчитайте количество комментариев по стилю кода в code review.
Библиотека C/C++ разработчика #буст
🎯 Настройка и конфигурация
✓ Создайте .clang-format файл в корне проекта
✓ Выберите базовый стиль
✓ Настройте отступы, скобки и переносы строк
✓ Добавьте специфичные правила для вашего проекта
🎯 Интеграция с инструментами
✓ Настройте автоформатирование в IDE
✓ Используйте pre-commit hooks для Git
✓ Интегрируйте с CI для проверки стиля
✓ Добавьте команды форматирования в CMake
🎯 Командная работа
✓ Документируйте стиль кода в README
✓ Проводите code review с проверкой стиля
✓ Используйте .clang-format-ignore для исключений
✓ Настройте автоматическое форматирование
🎯 Продвинутые возможности
✓ Используйте clang-format-diff для частичного форматирования
✓ Настройте языкоспецифичные правила
✓ Применяйте макросы для кастомизации
✓ Интегрируйте с другими linter'ами
Как измерить результат: Подсчитайте количество комментариев по стилю кода в code review.
Библиотека C/C++ разработчика #буст
🔥4🥰1🤩1
⚠️ Частая ошибка: почему std::vector<bool> — это не то, что вы думаете
Это один из самых неожиданных моментов в STL. std::vector<bool> ведет себя не как обычный vector!
Причина: std::vector<bool> оптимизирован для экономии памяти (1 бит на элемент), поэтому не может дать настоящие ссылки.
🔎 Сталкивались ли вы с этой особенностью? Как решали проблему?
Библиотека C/C++ разработчика #буст
Это один из самых неожиданных моментов в STL. std::vector<bool> ведет себя не как обычный vector!
// Обычный vector - все работает как ожидается
std::vector<int> vec_int = {1, 2, 3};
int& ref = vec_int[0]; // Настоящая ссылка
int* ptr = &vec_int[0]; // Настоящий указатель
// vector<bool> - сюрприз!
std::vector<bool> vec_bool = {true, false, true};
// auto& ref = vec_bool[0]; // Ошибка компиляции!
// bool* ptr = &vec_bool[0]; // Тоже ошибка!
// Это работает, но ref - не настоящая ссылка
auto ref = vec_bool[0]; // Тип: std::vector<bool>::reference
ref = false; // Работает, но через прокси-объект
// Если нужен настоящий vector<bool>
std::deque<bool> real_bool_container = {true, false, true};
bool& real_ref = real_bool_container[0]; // Настоящая ссылка!
Причина: std::vector<bool> оптимизирован для экономии памяти (1 бит на элемент), поэтому не может дать настоящие ссылки.
🔎 Сталкивались ли вы с этой особенностью? Как решали проблему?
Библиотека C/C++ разработчика #буст
❤8🌚5
👾 C++26 — что нового и почему стандартизация это так сложно
💡 Антон Полухин и Павел Новиков разбирают, что нового в C++26 и почему процесс стандартизации настолько сложен.
❗ Ключевые моменты обсуждения:
• контракты и рефлексия наконец добавлены в C++26
• стандартизация учитывает интересы всех участников экосистемы
• модули в C++20 — пример удачного компромисса после 5 лет обсуждений
Основной фокус — понимание того, что комитет по стандартизации должен учитывать интересы разработчиков мобильных устройств, бэкенд-приложений, экзотических платформ и крупных компаний одновременно.
Особенно интересно для тех, кто хочет понять механизмы принятия решений в мире C++ и почему некоторые «очевидные» фичи добавляются годами.
Вы узнаете, что медленность стандартизации — это не бюрократия, а необходимость найти решение, которое работает для всех участников экосистемы, от разработчиков встроенных систем до авторов высокоуровневых библиотек.
👉 Видео
Библиотека C/C++ разработчика #буст
💡 Антон Полухин и Павел Новиков разбирают, что нового в C++26 и почему процесс стандартизации настолько сложен.
❗ Ключевые моменты обсуждения:
• контракты и рефлексия наконец добавлены в C++26
• стандартизация учитывает интересы всех участников экосистемы
• модули в C++20 — пример удачного компромисса после 5 лет обсуждений
Основной фокус — понимание того, что комитет по стандартизации должен учитывать интересы разработчиков мобильных устройств, бэкенд-приложений, экзотических платформ и крупных компаний одновременно.
Особенно интересно для тех, кто хочет понять механизмы принятия решений в мире C++ и почему некоторые «очевидные» фичи добавляются годами.
Вы узнаете, что медленность стандартизации — это не бюрократия, а необходимость найти решение, которое работает для всех участников экосистемы, от разработчиков встроенных систем до авторов высокоуровневых библиотек.
👉 Видео
Библиотека C/C++ разработчика #буст
❤3👍2
Поддержка актуальной документации для C++ проектов требует постоянного обновления отдельных файлов. Разработчики забывают обновлять документацию после изменения кода, что приводит к устаревшей и неточной информации.
Doxygen автоматически генерирует документацию из специальных комментариев в коде. Инструмент создает HTML, PDF и другие форматы документации с диаграммами классов и зависимостей.
/**
* @brief Класс для работы с геометрическими фигурами
* @author Имя разработчика
* @date 2024-01-15
*/
class Shape {
protected:
double width; ///< Ширина фигуры
double height; ///< Высота фигуры
public:
/**
* @brief Конструктор с параметрами
* @param w Ширина фигуры (должна быть > 0)
* @param h Высота фигуры (должна быть > 0)
* @throw std::invalid_argument при некорректных параметрах
*/
Shape(double w, double h) : width(w), height(h) {
if (w <= 0 || h <= 0) {
throw std::invalid_argument("Размеры должны быть положительными");
}
}
/**
* @brief Вычисляет площадь фигуры
* @return Площадь в квадратных единицах
* @note Виртуальный метод, должен быть переопределен
*/
virtual double calculateArea() const = 0;
/// Деструктор по умолчанию
virtual ~Shape() = default;
};
# Генерация документации
doxygen -g # Создание конфигурационного файла
doxygen Doxyfile # Генерация документации
— Автоматическая генерация документации из кода
— Поддержка множества выходных форматов
— Создание диаграмм классов и зависимостей
— Синхронизация документации с кодом
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍4❤2🥰1
🚀 std::unreachable в C++23
Компилятор не всегда понимает, что некоторые участки кода недостижимы. std::unreachable() помогает ему генерировать более оптимальный код.
📋 Пошаговое решение:
1️⃣ Подключите заголовок
2️⃣ Используйте в switch без default
3️⃣ Применяйте в условных блоках
⚠️ Частые ошибки:
❌ Неправильно: Использовать когда код действительно достижим
❌ Неправильно: Забывать про обработку ошибок перед unreachable()
✅ Правильно: Использовать только когда логически уверены в недостижимости
🎯 Практический совет:
std::unreachable() - это контракт с компилятором. Если код всё-таки достигнет этой точки, поведение неопределено. Используйте только когда на 100% уверены.
🎯 Альтернатива:
В старых стандартах используйте
🐸 Библиотека C/C++ разработчика #буст
Компилятор не всегда понимает, что некоторые участки кода недостижимы. std::unreachable() помогает ему генерировать более оптимальный код.
📋 Пошаговое решение:
1️⃣ Подключите заголовок
#include <utility> // C++23
2️⃣ Используйте в switch без default
enum class Color { RED, GREEN, BLUE };
std::string colorToString(Color c) {
switch(c) {
case Color::RED: return "red";
case Color::GREEN: return "green";
case Color::BLUE: return "blue";
}
std::unreachable(); // Говорим компилятору: сюда не попадём!
}
3️⃣ Применяйте в условных блоках
int divide(int a, int b) {
if (b != 0) {
return a / b;
}
// Логически сюда не должны попасть
handleError(); // Наша обработка
std::unreachable(); // Оптимизация для компилятора
}
⚠️ Частые ошибки:
❌ Неправильно: Использовать когда код действительно достижим
❌ Неправильно: Забывать про обработку ошибок перед unreachable()
✅ Правильно: Использовать только когда логически уверены в недостижимости
🎯 Практический совет:
std::unreachable() - это контракт с компилятором. Если код всё-таки достигнет этой точки, поведение неопределено. Используйте только когда на 100% уверены.
🎯 Альтернатива:
В старых стандартах используйте
__builtin_unreachable()
(GCC/Clang) или __assume(false)
(MSVC).Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤4