Обновить
40

Пользователь

4
Подписчики
Отправить сообщение

Очень часто приходим к тому, что простой остановки программы недостаточно, а нужно куда-то сохранить информацию об ассерте

Assert вызовет abort(), тот посылает SIGABRT, и по-умолчанию создаётся core dump.
Обычно вы запускаете программу/демон из какой-то обёртки на shell/python, и если программа завершила аварийно, то можно посмотреть создалась ли кора, и зайти gdb bt, и прислать, например, на email.

Классика же, сравнивать с snprtinf(), забыли?

Каждый год выходит по несколько очередных "убийц" C++. Что-то пока ни как не взлетит. Где сейчас язык D?

UPD 2019: Для 64-битный билдов они перешли на Lazarus, но для 32-бит всё ещё на старом Delphi, потому что делает компактные .exe.

Чтобы самому не изобретать TUI-велосипеды, и не связываться с ncurses, а писать на современном C++, предлагаю взять готовую библиотеку https://github.com/ArthurSonzogni/FTXUI

По факту не готово.
C++ compiler support Standard Library Modules (FTM)* P2465R3

GCC libstdc++ 15*

Clang libc++ 17 (partial)*

MSVC STL 19.35* (partial)*

Apple Clang* 19.36*

C++23: старый добрый друг с новыми трюками
Модули наконец-то работают как надо

Подключить библиотеку std можно только в MSVC. Модули только для своего проекта - так себе.

Coroutines в стандартной библиотеке

std::generator только если. Корутины есть в языке в виде co_await/co_yield/co_return, а дальше надо брать какую-то стороннюю библиотеку, типа cppcoro или Boost::ASIO.

До сих пор нет нормальной системы пакетов (хотя vcpkg и Conan спасают)

cmake с FetchContent или сразу CPM.cmake.

Нужны очень опытные разработчики

На Rust тоже нужны, и их чаще всего не завезли, и кто-то будет переучиваться с плюсов или джавы.

Фактор автобуса, только лишь на владении Растом, не канает. Если несколько человек знакомы с проектом, если есть какая-то документация, если есть какие-то автотесты, то автобуса тут нет.

Информация: Нет Google и Stack Overflow. Только MSDN Library на CD-ROM и бумажные мануалы.

Есть ChatGPT, Sonnet/Opus и кросс-платформенные тулы/либы. Why бы и not? И зачем писать под Windows only?

Это расширение для VSCode. А если рабочая IDE это vim/neovim?

Причём тут C++?

Это если предварительно сделали нормализацию текста, иначе текст с акцентами может быть по разному представлен и вы не найдете.

Особенно нравится ваш код ‘ "ERROR", "ERROR" + 5’. Возлагается надежда на компилятор, что он текстовые константы положит в сегмент статических данных только для чтения ровно один раз, хотя в стандарте про такую оптимизацию не просят.

Причём здесь C++, C#?

Как происходит автодополнение, через clangd? Я вот такой плагин знаю https://vimawesome.com/plugin/vim-clangd

Ещё хочется хочется в реалтайм видеть сообщения от Clang-Tidy. Говорят надо использовать плагин ALE (Asynchronous Lint Engine).

Спасибо за статью. Было бы ещё здорово сравнить с std::pmr контейнерами c
monotonic_buffer_resource.

a + (b - a) /2 тоже переполняется, если b > a.
Если вам по классике, тогда вот так auto avg = (a & b) + ((a ^ b) >> 1);

Всё хорошо, но формул для вычисления средних очень много.
Вот у тебя, Хабра читатель, есть машина? Она показывает среднюю скорость, средний расход? А как она это делает, никогда не задумывался?

Вы главное забыли. Статья должна была быть про

  • strict aliasing, -Wstrict-aliasing=3 вам в помощь, правда при -O2 и выше.

  • object lifetime violations (ваш std::launder тут спасает, но ваши примеры плохи), тут санитайзеры в помощь.

  • type-punning (классика UB, особенно через union или reinterpret_cast между несовместимыми структурами)

  • alignment issues (на x86 пофиг, но я на продакшене словил от более нового gcc movdqu вместо movdqa, хотя они стоят одинаковое количество тактов) -Wcast-align в помощь

Ваш код

struct Widget {
    const int id;
    std::string name;
};

alignas(Widget) std::byte buf[sizeof(Widget)];
auto *p = new (buf) Widget{1, "old"};
p->~Widget();
new (buf) Widget{2, "new"};

std::cout << p->id << '\n';   // UB: p указывает на покойника

меняем на

...
p->~Widget();
auto *q = new (buf) Widget{2, "new"};

std::cout << q->id << '\n'; // И здесь всё хорошо

Это простой "use after destruction" или "stale pointer", пока ничего необычного.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность