<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Все посты подряд / C++ / Хабр]]></title>
    <link>https://habr.com/ru/hubs/cpp/posts/</link>
    <description><![CDATA[C++ – типизированный язык программирования]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Wed, 15 Jul 2026 18:39:06 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    

  

  
  <item>
    <title><![CDATA[Пост @MaxRokatansky — Блог компании OTUS (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/otus/posts/1057968/</guid>
    <link>https://habr.com/ru/companies/otus/posts/1057968/?utm_campaign=1057968&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Ошибки, которых не видно в сигнатуре: зачем C++ нужен <code>std::expected</code></strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/73e/512/044/73e51204476db192fd7dca7dbff0395b.jpg" width="2048" height="768"></figure><p>Функция выглядит предсказуемо, пока один из вызовов не бросает исключение, о котором никто не вспомнил. Типы ошибок остаются в документации, управление расползается по <code>try/catch</code>, а изменение глубоко в стеке неожиданно ломает обработку выше.</p><p>Недавно в <a href="https://otus.pw/MLMk/" rel="noopener noreferrer nofollow">статье</a> разобрали <code>std::expected</code> из C++23: как сделать ошибку частью сигнатуры, собирать цепочки через <code>and_then</code> и <code>transform</code>, разделять типы ошибок между слоями и постепенно внедрять подход в legacy-код. Заодно увидели, где <code>std::expected</code> действительно полезен, а где добавит лишнюю сложность.</p><p><strong>16 июля в 20:00</strong> продолжим тему на бесплатном уроке «Выразительный C++: кодируем намерения». На практике разберём, как переносить неявные договорённости в типы, сигнатуры и структуру программы. <a href="https://otus.pw/hShj/" rel="noopener noreferrer nofollow">Присоединяйтесь</a>.</p><blockquote><p><em>Полный список бесплатных уроков июля смотрите </em><a href="https://otus.pw/89kk/" rel="noopener noreferrer nofollow"><em>в дайджесте.</em></a></p></blockquote> <a href="https://habr.com/ru/posts/1057968/?utm_campaign=1057968&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 11 Jul 2026 10:21:59 GMT</pubDate>
    <dc:creator><![CDATA[MaxRokatansky (OTUS)]]></dc:creator>
      
      <category><![CDATA[C++]]></category><category><![CDATA[обработка ошибок]]></category><category><![CDATA[исключения]]></category><category><![CDATA[сигнатура функции]]></category><category><![CDATA[типизация ошибок]]></category><category><![CDATA[c++23]]></category><category><![CDATA[функциональный стиль]]></category><category><![CDATA[архитектура приложений]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @armani-boi — Amazon Web Services (+4) — 10.07.2026 12:13]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1057804/</guid>
    <link>https://habr.com/ru/posts/1057804/?utm_campaign=1057804&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Как и многие подобные истории, эта началась с ночного парсинга, который к утру превратился в тыкву.</p><p>Я запустил скрапер вечером, он собрал пару тысяч страниц, я ушёл спать. Утром в логах сплошные 403 и капчи, а в базе за ночь легло страниц двести. Ок, думаю, прокси спалили. Поменял пул на резидентный, накинул puppeteer-stealth, сверху ещё пачку заплаток с гитхаба. Проработало ровно до следующего вечера. Потом опять тыква.</p><p>Так продолжалось полгода. В какой-то момент мне надоело в сотый раз докидывать заплатку, и я решил разобраться, что конкретно меня палит. Не прокси. Не поведение. Сам браузер.</p><p>Осмотрим пациента</p><p>Любой стелс устроен одинаково: поверх Chrome вешается слой JavaScript, который переписывает то, на что смотрит антибот. navigator, canvas, WebGL и ещё десятки поверхностей. И вот тут первая засада.</p><p>Берём подменённую функцию и просим показать её исходник через toString(). Настоящая функция браузера отвечает [native code]. А моя заплатка честно показывает мой же JavaScript. Спалился на первой строчке.</p><p>Ладно, стелс это тоже патчит. Но детектор не дурак и лезет глубже.</p><ul><li><p>Сверяет главный фрейм с воркером и iframe. Заплатка живёт в одном контексте, а тот же объект, вытащенный из другого, её не видит.</p></li><li><p>Ловит утечку Runtime.enable, по ней сразу понятно, что браузером кто-то рулит по CDP.</p></li><li><p>Смотрит на форму TLS-хендшейка (JA3/JA4) и сверяет её с тем, что обещает User-Agent. Заявляешь Chrome на Windows, а рукопожатие выдаёт питоновский клиент.</p></li><li><p>Перерисовывает один и тот же холст дважды и смотрит, стабилен ли отпечаток, или заплатка подмешивает случайный шум, которого у настоящего железа нет.</p></li></ul><p>Где-нибудь да разъедется. И так будет всегда, потому что я крашу браузер сверху, а не меняю его изнутри. Это не «кривая заплатка», это тупик подхода: маскировка и то, что её просвечивает, написаны на одном языке. Тот, кто читает страницу, всегда на уровень ниже того, кто патчит её из той же страницы.</p><p>Вскрытие</p><p>Раз проблема в слое поверх браузера, надо убрать слой и лезть в сам браузер. Я взял исходники Chromium и пошёл править фингерпринт прямо в C++, в Blink, V8 и BoringSSL.</p><p>Идея простая. Каждое значение, которое читает детектор, должно быть не подменено сверху, а просто другим внутри, ровно как оно было бы на чужой машине. Тогда никакого слоя нет. Подменённый геттер это настоящий C++ геттер, поэтому toString() в любом реалме честно отдаёт [native code]. Сверка «фрейм против воркера» ничего не находит, потому что находить нечего: значение одно и то же везде, оно вкомпилировано в движок. Браузер, который изучает сам себя, видит обычный Chrome. Потому что это и есть обычный Chrome, просто с другими числами внутри.</p><p>Что заработало, а что нет</p><p>Сразу оговорю, чего не заявляю, потому что именно на этом обычно и врут. Это про фингерпринт браузера, а не про поведение сессии. Серверный антифрод конкретной площадки, поведенческий анализ, скорость и траектория мышки, тут я вам не помощник. Fortress чинит браузер, а не то, как вы им управляете.</p><p>А что заявляю, можно проверить руками, не веря мне на слово. Я прогнал сборку по публичным</p><ul><li><p>CreepJS: 0% headless, 0% stealth.</p></li><li><p>Sannysoft: всё зелёное.</p></li><li><p>BrowserScan: пишет «Normal».</p></li><li><p>Живой Cloudflare Turnstile: проходит без клика мышкой.</p></li></ul><p>Всё это воспроизводится одним скриптом tools/<a href="http://gauntlet.py" rel="noopener noreferrer nofollow">gauntlet.py</a> из репозитория, так что можно прогнать самому и убедиться. Персона при этом собирается когерентно: платформа, GPU, таймзона, язык, набор голосов, раскладка клавиатуры и форма TLS съезжаются в один правдоподобный Windows-девайс, а не в ме</p><p>По коду менять нечего</p><p>Движок поднимает сырой CDP на порту 9222, без утечки Runtime.enable. Я цепляю к нему свой ж остальной код работает как работал. Меняется одна строчка, адрес подключения.</p><p>Патчей тридцать четыре, каждый маленький и на одну задачу, читается за минуту. Всё открыто  единому слову, соберите движок сами и проверьте, что внутри ровно то, что заявлено.</p><p>github.com/tiliondev/fortress</p> <a href="https://habr.com/ru/posts/1057804/?utm_campaign=1057804&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 10 Jul 2026 09:13:18 GMT</pubDate>
    <dc:creator><![CDATA[armani-boi]]></dc:creator>
      
      <category><![CDATA[scrapping]]></category><category><![CDATA[browser]]></category><category><![CDATA[data]]></category><category><![CDATA[data mining]]></category><category><![CDATA[antibot]]></category><category><![CDATA[chromium]]></category><category><![CDATA[patch]]></category><category><![CDATA[selenium]]></category><category><![CDATA[opensource]]></category><category><![CDATA[opensource projects]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dirvika — Блог компании Veai (+4) — 07.07.2026 18:08]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/veai/posts/1056666/</guid>
    <link>https://habr.com/ru/companies/veai/posts/1056666/?utm_campaign=1056666&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Почему ИИ-агент для кода промахивается мимо нужного метода</strong></p><p>Несколько последних постов об ИИ-агентах,&nbsp;которые я читала на этой неделе,&nbsp;сошлись в одну мысль:&nbsp;агенты часто ведут себя по-разному на одной и той же задаче,&nbsp;и разгадка почему&nbsp;-&nbsp;находится не там,&nbsp;где ожидаешь.&nbsp;Вот конкретный пример,&nbsp;на котором это видно сразу.</p><p>Агент,&nbsp;который ищет код текстом,&nbsp;физически не отличает <code>OrderService.validate</code> от&nbsp;<code>UserDto.validate</code>:&nbsp;для него это просто совпадение символов «validate». Агент,&nbsp;который спрашивает у IDE&nbsp;«кто на самом деле вызывает этот метод»,&nbsp;получает точный ответ,&nbsp;потому что IDE знает типы,&nbsp;разрешённые ссылки и видимость каждого символа.&nbsp;Разница между этими двумя подходами не абстрактная,&nbsp;она измеряется в конкретных цифрах.</p><p><strong>Точка отсчёта: почему grep и RAG промахиваются</strong></p><p>Кодовый агент ищет по проекту двумя способами:&nbsp;grep/ripgrep по содержимому файлов и векторный поиск по эмбеддингам кусков кода.&nbsp;На маленьком проекте оба варианта работают сносно.&nbsp;На enterprise-репозитории на миллионы строк с десятками модулей поведение ломается одинаково:&nbsp;запрос&nbsp;«найди использования метода&nbsp;<code>validate</code>»&nbsp;возвращает тысячу с лишним совпадений,&nbsp;из которых подавляющее большинство&nbsp;-&nbsp;другие методы с тем же именем в других классах.&nbsp;Векторный поиск находит куски кода,&nbsp;которые&nbsp;«похожи по смыслу»,&nbsp;но это может быть валидация в совершенно другом домене.</p><p><strong>Что показали цифры на 27 задачах</strong></p><p>Мы сравнили <strong>три версии агента</strong> на <strong>27 задачах вида</strong>&nbsp;«найди все места,&nbsp;где используется метод X»&nbsp;из реальных тикетов трёх внутренних репозиториев на Java и Kotlin:&nbsp;агент на ripgrep,&nbsp;агент на ripgrep с векторным RAG и агент на PSI-индексе IntelliJ&nbsp;(<code>find_usages</code>,&nbsp;<code>find_declaration</code>,&nbsp;<code>class_hierarchy</code>&nbsp;вместо текстового поиска).</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/70d/d43/514/70dd4351465ec1abac0efd433b5d47d5.png" alt="Вариант поискаPrecisionRecallF1Контекст, токенов$/ответripgrep0,410,820,5578 4001,12ripgrep + векторный RAG0,580,790,6792 1001,38PSI-индекс0,960,930,9416 7000,21" title="Вариант поискаPrecisionRecallF1Контекст, токенов$/ответripgrep0,410,820,5578 4001,12ripgrep + векторный RAG0,580,790,6792 1001,38PSI-индекс0,960,930,9416 7000,21" width="3200" height="1400"><div><figcaption>Вариант поискаPrecisionRecallF1Контекст, токенов$/ответripgrep0,410,820,5578 4001,12ripgrep + векторный RAG0,580,790,6792 1001,38PSI-индекс0,960,930,9416 7000,21</figcaption></div></figure><p>Precision показывает,&nbsp;сколько из найденного агентом оказалось реальными использованиями метода,&nbsp;а не случайным совпадением имён.&nbsp;Recall показывает,&nbsp;сколько из всех реальных использований в коде агент вообще нашёл,&nbsp;ничего не пропустив.</p><p>У ripgrep recall высокий&nbsp;(0,82):&nbsp;текстовый поиск почти никогда не пропускает совпадения по имени.&nbsp;Но precision низкий&nbsp;(0,41):&nbsp;больше половины найденного&nbsp;-&nbsp;чужие методы с тем же именем,&nbsp;и их приходится разбирать вручную.&nbsp;У PSI-индекса высоки обе величины&nbsp;(0,96 и 0,93):&nbsp;агент находит почти все нужные места и почти не приносит лишнего.&nbsp;F1 сводит обе величины в одно число,&nbsp;и у ripgrep он проседает именно из-за мусора в выдаче,&nbsp;хотя нужные места он и находит.</p><p>Отсюда пятикратная экономия контекста и в пять с лишним раз более дешёвый ответ при кратно более высокой точности:&nbsp;агент на PSI-индексе не читает тысячи лишних строк,&nbsp;которые вернул бы текстовый поиск.</p><p><strong>Точный поиск не отменяет проверку</strong></p><p>Даже когда агент точно нашёл все места,&nbsp;где используется метод,&nbsp;и внёс правку во все,&nbsp;это не гарантирует,&nbsp;что правка корректна:&nbsp;<strong>точный поиск решает только задачу&nbsp;«найти нужные места»</strong>,&nbsp;а не&nbsp;«проверить,&nbsp;что код после правки работает».&nbsp;Поэтому прежде чем объявить об успехе,&nbsp;агент должен прогнать компилятор и тесты:&nbsp;тест зелёный,&nbsp;ошибок компиляции нет,&nbsp;покрытие не просело.&nbsp;Пока в выводе компилятора или тестового прогона есть хоть одна ошибка,&nbsp;агент обязан либо исправить её,&nbsp;либо сообщить о проблеме,&nbsp;а не писать об успехе.</p><p>Но точный поиск снимает с агента часть ручной работы:&nbsp;не нужно самому перепроверять по всему проекту,&nbsp;все ли использования метода он нашёл&nbsp;-&nbsp;эту проверку берёт на себя IDE,&nbsp;как это устроено в Veai,&nbsp;а оставшуюся часть верификации&nbsp;-&nbsp;компилятор и тесты.</p> <a href="https://habr.com/ru/posts/1056666/?utm_campaign=1056666&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 07 Jul 2026 15:08:33 GMT</pubDate>
    <dc:creator><![CDATA[dirvika (Veai)]]></dc:creator>
      
      <category><![CDATA[программирование]]></category><category><![CDATA[ии-агенты]]></category><category><![CDATA[ии и машинное обучение]]></category><category><![CDATA[ии]]></category><category><![CDATA[java]]></category><category><![CDATA[ai-агенты]]></category><category><![CDATA[ai]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[аналитика]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Windows (+4) — 07.07.2026 15:39]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1056584/</guid>
    <link>https://habr.com/ru/posts/1056584/?utm_campaign=1056584&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый сервис <a href="https://github.com/mrT4ntr4/NtWarden" rel="noopener noreferrer nofollow">NtWARden</a> (Windows Analysis and Research Toolkit), который распознает любые вредоносы и проблемное ПО, даже если эти компоненты находятся глубоко в системе Windows.</p><p>Проект NtWARden:</p><ul><li><p>сканирует процессы, службы, сеть, внутренние механизмы ядра;</p></li><li><p>обнаруживает скрытые вредоносы;</p></li><li><p>убивает майнеры и трояны;</p></li><li><p>показывает реальную картину нагрузки на&nbsp;процессор;</p></li><li><p>помогает контролировать, что&nbsp;находится в&nbsp;системе прямо сейчас: службы, сетевые соединения, скрытые процессы;</p></li><li><p>может подключиться к&nbsp;другому ПК и также отслеживать его процессы.</p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/478/1ca/982/4781ca9826406b9edf32499f866bc939.jpg" width="1280" height="900"></figure> <a href="https://habr.com/ru/posts/1056584/?utm_campaign=1056584&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 07 Jul 2026 12:39:09 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[NtWARden]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Andrey2008 — Блог компании PVS-Studio (+4) — 02.07.2026 14:14]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1054832/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1054832/?utm_campaign=1054832&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как все так ловко ИИ пользуются... Обзоры кода делают...</strong></p><p>Не знаю, то ли я туповат, то ли невезучий, то ли кругом сказочники. Пытаюсь исследовать, какие новые интересные виды ошибок может находить ИИ в С++ коде, о которых не знает PVS-Studio. Claude Opus то нормально мне про интересные баги рассказывает, то на ровном месте с ума сходит.</p><p>Даю файл на вход, а он тревожно:</p><blockquote><p>В присланном файле есть места, где содержимое обрезано/повреждено вставкой <code>&lt;/context&gt;</code>, поэтому их я не рассматриваю как «баги кода» — это артефакты форматирования. Разберу реальные логические ошибки.</p></blockquote><p>Шо? Какой <code>context</code>? Там максимум — это <code>#include "context.hxx"</code>. Ну ладно, давай ошибки посмотрим.</p><p>Так, парочка сообщений по делу. Например, найден лишний аргумент при использовании функции форматирования.</p><pre><code class="cpp">addErrorMessage(&amp;sciErr, API_ERROR_CREATE_ZDOUBLE_IN_NAMED_LIST,
    _("%s: Unable to create list item #%d in Scilab memory"),
    "createComplexZMatrixOfDoubleInNamedList", _iItemPos + 1, _pstName);</code></pre><p>В строке форматирования два спецификатора <code>%s</code> и <code>%d</code>, а передаются три аргумента: <code>funcName</code>, <code>_iItemPos+1</code>, <code>_pstName</code>. Да, это баг. Про подобные паттерны PVS-Studio уже <a href="https://pvs-studio.ru/ru/blog/examples/v576/" rel="noopener noreferrer nofollow">знает</a>, хотя, возможно, нужно подсказать, что <code>addErrorMessage</code> — это printf-подобная функция. В целом, тут неинтересно, идём дальше.</p><p>Ооо, и тут начинается...</p><blockquote><p><code>checkListItemPosition</code> — неправильное сравнение границы:</p></blockquote><pre><code class="cpp">// check a valid item
if (_iItemPos &gt; iItem)
{
    addErrorMessage(...);
    return sciErr;
}
</code></pre><blockquote><p>Здесь проверка «позиция валидна» использует <code>&gt;</code>, хотя позиции 1-based, а <code>iItem</code> — количество элементов. Это выглядит как граничный дефект, но по сути <code>_iItemPos == iItem</code> допустимо, <code>_iItemPos &gt; iItem</code> — ошибка. Это в порядке — правильная граница. Не баг. (Указываю, чтобы было понятно, что я это проверил.)</p></blockquote><p>Так баг или не баг? Я три раза прочитал текст и посмотрел функцию с кодом. В итоге я не только не понимаю, есть ли здесь ошибка, но и не понимаю, что Claude пытается мне сказать.</p><p>Дальше ещё хуже шарики за ролики зашли.</p><blockquote><p>Баг 5 (реальный): утечка в readCommonMatrixOfPolyInNamedList и др. — нет, это API отдаёт указатели наружу. Не баг.</p></blockquote><p>Это всё описание пятого бага, больше ничего нет. Комментировать — только портить.</p><p>Я не понимаю, как на всём этом можно строить хоть сколько-то надёжные процессы автоматических обзоров кода, про которые в последнее время из разных утюгов вещают.</p><p>На сегодня мне ИИ достаточно. Пойду лучше пройдусь по парку, пока погода хорошая.</p> <a href="https://habr.com/ru/posts/1054832/?utm_campaign=1054832&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 02 Jul 2026 11:14:24 GMT</pubDate>
    <dc:creator><![CDATA[Andrey2008 (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[обзор кода]]></category><category><![CDATA[code review]]></category><category><![CDATA[ии]]></category><category><![CDATA[что-то пошло не так]]></category><category><![CDATA[галлюцинации]]></category><category><![CDATA[галлюцинации ии]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[статический анализ кода]]></category><category><![CDATA[claude]]></category><category><![CDATA[claude opus]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AleksandraUvarova — Блог компании PVS-Studio (+4) — 01.07.2026 11:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1054290/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1054290/?utm_campaign=1054290&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Нарезка кода: что скрывает OrcaSlicer</strong></p><figure class=""><img src="https://habrastorage.org/getpro/habr//post_images/269/d89/3df/269d893df78c3d35065f65dbc07fa297.png"></figure><p>Как не пропустить опасные участки кода при ревью? Можно воспользоваться инструментами статического анализа. Возьмём для примера OrcaSlicer — популярную программу, которая подготавливает 3D-модель к печати. Заглянем внутрь и посмотрим, какие сюрпризы нас ждут.</p><p>Посмотрим на одно из предупреждений статического анализатора <a href="https://pvs-studio.ru/ru/pvs-studio/" rel="noopener noreferrer nofollow">PVS-Studio</a>:</p><p><a href="https://pvs-studio.ru/ru/docs/warnings/v1047/" rel="noopener noreferrer nofollow">V1047</a> Lifetime of the lambda is greater than lifetime of the local variable ‘do_stop’ captured by reference. <a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/a167702038496b97e8495cc79f0c62660063ac87/src/slic3r/GUI/Jobs/FillBedJob.cpp#L250" rel="noopener noreferrer nofollow">FillBedJob.cpp 250</a></p><pre><code class="cpp">void FillBedJob::process(Ctl &amp;ctl)
{
  // ....
  bool do_stop = false;
  // ....
  params.on_packed = 
    [&amp;do_stop] (const ArrangePolygon &amp;ap)
    {
      do_stop = ap.bed_idx &gt; 0 &amp;&amp; ap.priority == 0;
    };
  // ....
}
</code></pre><p>Лямбда-выражение захватывает локальную переменную <code>do_stop</code> по ссылке, а затем сохраняется в <code>params.on_packed</code>. При этом <code>do_stop</code> уничтожается при выходе из метода <code>process</code>, так как заканчивается время жизни локального объекта. Если лямбда будет вызвана после выхода из этой функции-члена, произойдёт обращение к разрушенному объекту, и поведение в этой ситуации не определено.</p><p>Можно было бы сделать захват по значению, но в этой лямбде происходит перезапись переменной <code>do_stop</code>, а значит такой вариант не подходит. Поэтому можно сделать <code>do_stop</code> членом класса <code>FillBedJob</code>.</p><p>Это лишь один фрагмент, показывающий, что даже в работающем продукте могут быть ошибки. А <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1389/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">другие опасные места в коде OrcaSlicer</a> разобрали в новой статье.</p><p>Если вы тоже хотите минимизировать ошибки в своих проектах, сделайте статический анализ частью <a href="https://pvs-studio.ru/ru/pvs-studio/algoritm/" rel="noopener noreferrer nofollow">регулярного процесса</a>, а поможет с этим <a href="https://pvs-studio.ru/ru/pvs-studio/download/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=manual&amp;utm_content=Post_OrcaSlicer_ru" rel="noopener noreferrer nofollow">PVS-Studio</a>.</p> <a href="https://habr.com/ru/posts/1054290/?utm_campaign=1054290&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 01 Jul 2026 08:19:16 GMT</pubDate>
    <dc:creator><![CDATA[AleksandraUvarova (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[c++]]></category><category><![CDATA[программирование]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[ошибки программистов]]></category><category><![CDATA[ошибки в коде]]></category><category><![CDATA[безопасная разработка]]></category><category><![CDATA[3d графика]]></category><category><![CDATA[3d-печать]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Dan-Spec — Блог компании Спецлаб (+4) — 30.06.2026 09:52]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/speclab/posts/1053732/</guid>
    <link>https://habr.com/ru/companies/speclab/posts/1053732/?utm_campaign=1053732&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Илон Маск отдал приоритет видеокамерам. Радар и ультразвуковые датчики были ошибкой, от них больше помех</strong></p><p>Мы тоже часто спорим с коллегами о выборе средства распознавания объектов. С одной стороны, лидары и ультразвук лучше камер работают в темное время суток, что безусловный плюс. С другой, освещение в 21 веке – не экзотика или всегда можно применить ИК-прожекторы. Сегодняшние нейросети неплохо справляются и в ночных условиях. Тем более, что полной темноты в наше время не бывает, видеокамерам хватает света даже от сигареты.</p><p>Сегодняшние&nbsp;<a href="https://www.goal.ru/neuronet/" rel="noopener noreferrer nofollow">нейросети</a>&nbsp;совершают&nbsp;<a href="https://www.goal.ru/hi-tech-security/i-snova-revolyutsiya-v-videonablyudenii-/" rel="noopener noreferrer nofollow">революцию в видеонаблюдении</a>, распознавая даже мелкие объекты и даже в темноте. Наверное, поэтому Илон Маск в интервью про свои беспилотники высказал буквально следующее:</p><iframe id="6a436680a269d5af84018824" src="https://embedd.srv.habr.com/iframe/6a436680a269d5af84018824" class="embed_video embed__content" allowfullscreen="true"></iframe><p>«Честно говоря, радар и ультразвуковые датчики были ошибкой. Особенно радар. Потому что радар позволяет приблизиться к решению задачи и решать задачу в большинстве случаев, кроме тех моментов, когда невозможно соединить радар и нейросеть для визуального распознавания. То есть радар и “зрение” расходятся - кто прав? По сути, нужно избавляться от радара. И как только мы избавились от радара - и кстати команда автопилота была сильно против такого решения - теперь никто не хочет возвращать радар.</p><p>Мне пришлось настоять на своем. Радару тут не место. Радар был костылем, и, если тащить костыль за собой, бежать не получится. Радар - просто сигнал. В конечном счете от радара было больше помех, чем сигналов. Иногда это было очень полезно, но помех от него было больше. От него нужно было избавляться. Как только мы убрали радар, стало очевидно, что наши нейросети гораздо хуже, чем мы думали. Радар им слишком сильно помогал.&nbsp;<strong>Использование компьютерного зрения предполагает, что ни на что больше полагаться нельзя, оно должно работать. Нейросеть должна работать.</strong>&nbsp;Большим изменением стал переход от алгоритма «Bag of points» к его интерпретации нейросетью для определения центра полосы.&nbsp;</p><p>Раньше мы все это делали на «Си». Сейчас архитектура нейросети очень сложна, там много слоев. Какие-то слои удаляются, какие-то добавляются. Мы уже столько раз меняли архитектуру.”</p><p><a href="https://habr.com/ru/post/edit/1053732/" rel="noopener noreferrer nofollow">Доступно на Ютьюб</a></p><p><em>Кстати, программисты Спецлаб тоже, в основном, всё разрабатывают на “C++”. И тоже предпочитают использование видеокамер для объяснения компьютеру окружающего мира.</em></p><p><em>Даниил Гришанин</em><br><em>=Спецлаб=</em></p> <a href="https://habr.com/ru/posts/1053732/?utm_campaign=1053732&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 30 Jun 2026 06:52:22 GMT</pubDate>
    <dc:creator><![CDATA[Dan-Spec (Спецлаб)]]></dc:creator>
      
      <category><![CDATA[нейронные сети]]></category><category><![CDATA[лидары]]></category><category><![CDATA[лидар]]></category><category><![CDATA[нейросеть]]></category><category><![CDATA[умная видеокамера]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @eoanermine — Программирование (+1) — 29.06.2026 20:10]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1053592/</guid>
    <link>https://habr.com/ru/posts/1053592/?utm_campaign=1053592&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Листая на&nbsp;C++ Reference <a href="https://cppreference.com/cpp/29" rel="noopener noreferrer nofollow">список</a> принятых в&nbsp;C++29&nbsp;фичей, увидел в&nbsp;нем пропозал с&nbsp;знакомым названием, <a href="https://wg21.link/P2019" rel="noopener noreferrer nofollow">«Thread attributes» (P2019R9)</a>. И, оказалось, действительно, я <a href="https://t.me/stateofub_shorts/22" rel="noopener noreferrer nofollow">уже читал</a> этот пропозал 4&nbsp;года назад, но&nbsp;не&nbsp;в 9-й его редакции, а&nbsp;в&nbsp;самой первой. 4&nbsp;года понадобилось комитету по&nbsp;стандартизации, чтобы принять пустячный пропозал, позволяющий задать имя и размер стека потока при&nbsp;его создании&nbsp;— востребованную фичу, реализованную в&nbsp;куче библиотек C++.</p><pre><code class="cpp">void f();
int main() {
  // Такой вид задания атрибутов предлагался в первой ревизии
  std::jthread P2019R1(
    f, std::thread_name("Worker"),
    std::thread_stack_size(512*1024));
  // А такой приняли 8 ревизий спустя
  std::jthread P2019R9(
    std::thread::name_hint("Worker"),
    std::thread::stack_size_hint(512*1024), f);
}</code></pre><p>Не безумие ли это? И сколько действительно правильных пропозалов не вошло в C++ лишь по той причине, что их автор не был готов 4 года подряд защищать свое предложение, отвечая на все мелкие придирки различных подкомитетов?</p> <a href="https://habr.com/ru/posts/1053592/?utm_campaign=1053592&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 29 Jun 2026 17:10:16 GMT</pubDate>
    <dc:creator><![CDATA[eoanermine]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[c++29]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AI-CMO — Java (+2) — 16.06.2026 15:24]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1048194/</guid>
    <link>https://habr.com/ru/posts/1048194/?utm_campaign=1048194&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Риски ИИ- генерируемого кода - качество, производительность, “УСПЕВАЮ ЛИ Я ЗА ТЕМПОМ”&nbsp;</strong></p><p>ИИ генерирует код быстрее, чем мы успеваем ловить его реальные проблемы.<br>В JPA/Hibernate это особенно больно: код компилируется, тесты зелёные — а внутри N+1 и лишние запросы. Veai проверяет такие гипотезы на фактах проекта прямо в IDE: семантические usages, реальные прогоны тестов, coverage, debugger, доступ к исходникам Hibernate.</p><p>Не “этот код, возможно, тормозит”, а проверка через запуск. Скорость растёт — контроль над качеством остаётся. Большой разбор продукта <a href="https://habr.com/ru/companies/veai/articles/1043752/" rel="noopener noreferrer nofollow">сделан в статье </a></p> <a href="https://habr.com/ru/posts/1048194/?utm_campaign=1048194&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 16 Jun 2026 12:24:28 GMT</pubDate>
    <dc:creator><![CDATA[AI-CMO]]></dc:creator>
      
      <category><![CDATA[программирование]]></category><category><![CDATA[программирование для начинающих]]></category><category><![CDATA[ide]]></category><category><![CDATA[idea]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dugalb — C (+2) — 12.06.2026 17:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1046906/</guid>
    <link>https://habr.com/ru/posts/1046906/?utm_campaign=1046906&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>graphics.h в 2026 году: зачем и как запустить</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e60/96d/99f/e6096d99fb18aa79173335c4d842f03e.png" width="1071" height="628"></figure><p><code>graphics.h</code> — это часть библиотеки BGI (Borland Graphics Interface) родом из 1990-х. В современных IDE её нет: она несовместима с 64-битными системами и не является частью стандарта C++. Тем не менее в учебных задачах она до сих пор встречается — особенно там, где нужно быстро визуализировать алгоритм или сдать лабораторную.</p><p><strong>Когда это оправдано</strong></p><ul><li><p>изучение основ C/C++ и хочется видеть результат за пределами консоли</p></li><li><p>разбор алгоритмов компьютерной графики</p></li><li><p>подготовка к экзамену по предмету, где преподаватель требует именно <code>graphics.h</code></p></li></ul><p>Для production-кода и серьёзных учебных проектов лучше сразу смотреть в сторону актуальных библиотек: <strong>SDL2</strong> (2D, кроссплатформенная), <strong>SFML</strong> (ООП-подход, проще в освоении) или <strong>OpenGL/GLFW</strong> (если нужна 3D-графика и аппаратное ускорение).</p><p><strong>О библиотеке</strong></p><p>Адаптация для современных Windows называется <strong>WinBGIm</strong> — её разработал и поддерживает <a href="https://home.cs.colorado.edu/~main/" rel="noopener noreferrer nofollow">Майкл Мэйн</a>, профессор Колорадского университета в Боулдере. Библиотека открыта для использования и модификации. Скачать можно на официальном сайте: <a href="http://winbgim.codecutter.org" rel="noopener noreferrer nofollow">winbgim.codecutter.org</a>.</p><p>Если хочется сначала почитать вводный разбор — на Хабре есть <a href="https://habr.com/ru/articles/455056/" rel="noopener noreferrer nofollow">статья с обзором WinBGIm</a>, здесь же показан небольшой практический пример-скриншот: инженерная утилита с графическим выводом, которая впоследствии была переписана с использованием современного UI на C++.</p><p><strong>Как запустить: общий принцип</strong></p><p>Для работы используется адаптация WinBGIm — три файла: <code>graphics.h</code>, <code>winbgim.h</code> и <code>libbgi.a</code>.</p><p>Линкер-флаги одинаковы для всех сред:</p><pre><code>-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32</code></pre><p>Известный баг: в оригинальном <code>graphics.h</code> на строке 302 встречается <code>int right=0</code> — это вызывает ошибку компиляции. Исправляется заменой на <code>int txtright=0</code>.</p><p><strong>Dev-C++</strong></p><ol><li><p>Скопировать <code>graphics.h</code> и <code>winbgim.h</code> в <code>MinGW64\x86_64-w64-mingw32\include</code></p></li><li><p>Скопировать <code>libbgi.a</code> в <code>...\lib</code></p></li><li><p><code>Tools → Compiler Options → Parameters → Linker</code> — вставить флаги</p></li><li><p>Переключить профиль компилятора на <strong>32-bit Release</strong></p></li></ol><p><strong>Code::Blocks</strong></p><ol><li><p>Файлы — в соответствующие папки <code>include</code> и <code>lib</code> компилятора MinGW</p></li><li><p><code>Settings → Compiler → Linker settings → Other linker options</code> — вставить флаги</p></li></ol><p><strong>VS Code</strong></p><p>Файлы хранятся внутри проекта. Структура:</p><pre><code>project/
  include/  ← graphics.h, winbgim.h
  lib/      ← libbgi.a</code></pre><p>В <code>.vscode/tasks.json</code> в массив <code>args</code> добавить:</p><pre><code class="json">"-I${workspaceFolder}/include",
"-L${workspaceFolder}/lib",
"-l"-I${workspaceFolder}/include",
"-L${workspaceFolder}/lib",
"-lbgi", "-lgdi32", "-lcomdlg32", "-luuid", "-loleaut32", "-lole32"
bgi", "-lgdi32", "-lcomdlg32", "-luuid", "-loleaut32", "-lole32"</code></pre><p>Компилятор MinGW (<code>g++</code>) должен быть прописан в <code>PATH</code>.</p><p>По материалам видео-инструкции CodeWar</p><p><strong>Тест</strong></p><pre><code class="cpp">#include &lt;graphics.h&gt;
#include &lt;conio.h&gt;

int main() {
    int gd = DETECT, gm;
    initgraph(&amp;gd, &amp;gm, (char*)"");
    circle(250, 250, 100);
    getch();
    closegraph();
    return 0;
}</code></pre><p> Должно открыться окно с белым кругом на чёрном фоне. Если компиляция падает с ошибкой <code>cannot find -lbgi</code> — проверьте путь до <code>libbgi.a</code>. Ошибка <code>undefined reference</code> обычно означает, что флаги линкера не подхватились.  </p> <a href="https://habr.com/ru/posts/1046906/?utm_campaign=1046906&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 12 Jun 2026 14:06:19 GMT</pubDate>
    <dc:creator><![CDATA[dugalb]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[cpp]]></category><category><![CDATA[программирование]]></category><category><![CDATA[graphics]]></category><category><![CDATA[graphics2d]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+1) — 05.06.2026 09:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1043882/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1043882/?utm_campaign=1043882&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Наш архитектор C++ анализатора, Юрий Минаев, выступил в прошлом году на C++ Russia с докладом "<strong>Семантика C++ изнутри компилятора</strong>". </p><p><strong>О чём рассказал Юра:</strong>  </p><ul><li><p>о семантике C++ с точки зрения статического анализатора или фронтенда компилятора;</p></li><li><p>как устроена таблица символов и как происходит поиск имен, а также как семантика влияет на парсинг;</p></li><li><p>о том, как происходит выбор перегрузок и каким образом компилятор находит функции, которые даже не видны в текущей точке программы; </p></li><li><p>о шаблонах и их инстанцировании. </p></li></ul><iframe id="6a226bab6b85845d00f4d02c" src="https://embedd.srv.habr.com/iframe/6a226bab6b85845d00f4d02c" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Посмотреть доклад можно ещё на этих площадках: </p><ul><li><p><a href="https://pvs-studio.ru/ru/blog/video/11740/" rel="noopener noreferrer nofollow">Наш сайт</a></p></li><li><p><a href="https://youtu.be/7P9GkZvnnzU" rel="noopener noreferrer nofollow">YouTube</a></p></li><li><p><a href="https://rutube.ru/video/9c356eeda4ec2efe056d4db6d699cc61/" rel="noopener noreferrer nofollow">Rutube</a></p></li></ul><p>Приятного просмотра! Ждём ваши комментарии!</p> <a href="https://habr.com/ru/posts/1043882/?utm_campaign=1043882&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 05 Jun 2026 06:27:40 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[доклад]]></category><category><![CDATA[семантика]]></category><category><![CDATA[c++]]></category><category><![CDATA[cpprussia]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[компиляторы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Andrey2008 — Блог компании PVS-Studio (+4) — 29.05.2026 11:36]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1041016/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1041016/?utm_campaign=1041016&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Дайте посмотреть на нормальный С++ проект, созданный вайб-кодингом</strong></p><p>Чтобы корректировать развитие PVS-Studio я заинтересован смотреть C++ проекты, созданные с использованием генеративного AI или, по-простому, вайб-кодинга. Но вот незадача: все кругом пишут про этот самый вайб-кодинг, но я не знаю, как и где искать такие открытые проекты.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e78/793/703/e78793703404baf35231193eb12da41a.png" width="1600" height="902"></figure><p>Мне попадается какая-то белиберда типа <a href="https://github.com/gravecan/enhance-client/tree/main" rel="noopener noreferrer nofollow">enhance-client</a>, сгенерированная за $15. Но это даже смотреть несерьёзно. По присутствию в репозитории <code>.obj</code>, <code>.iobj</code>, <code>.ipdb</code> файлов и прочего мусора видно, что автор не понимает, что он делает. Проект не компилируется по разным причинам, например, из-за того, что заложен какой-то огрызок файла <a href="https://github.com/gravecan/enhance-client/blob/642f90eafd954c076a34d60f811de77fdb9f705c/injector/bytes.hpp#L25744" rel="noopener noreferrer nofollow">bytes.hpp</a> (у массива нет конца).</p><p>Если немного поправить и проверить, что удалось собрать, то там лезут перлы вида:</p><pre><code class="cpp">void enhance::modules::autototem::run()
{
  ....
  auto env = enhance::instance-&gt;get_env();
  if (!env)
  {
    env-&gt;DeleteLocalRef(player);
    return;
  }
  ....
}</code></pre><p>Предупреждение PVS-Studio: <a href="https://pvs-studio.ru/ru/docs/warnings/v522/" rel="noopener noreferrer nofollow">V522</a> [CWE-476, CERT-EXP34-C, SEC-NULL] Dereferencing of the null pointer ‘env’ might take place. <a href="https://github.com/gravecan/enhance-client/blob/642f90eafd954c076a34d60f811de77fdb9f705c/enhance/modules/autototem/autototem.cpp#L757" rel="noopener noreferrer nofollow">autototem.cpp 757</a></p><p>Явное разыменование нулевого указателя.</p><p>Или бессмысленные сравнения значения типа <code>int</code> с константой <code>0.1f</code>:</p><pre><code class="cpp">int sdk::minecraft_client::get_attack_cooldown() { .... }

void enhance::modules::shield_breaker::run()
{
  ....
  if (sdk::instance-&gt;get_attack_cooldown() &gt; 0.1f)
  ....
}</code></pre><p>Предупреждение PVS-Studio: <a href="https://pvs-studio.ru/ru/docs/warnings/v674/" rel="noopener noreferrer nofollow">V674</a> [CWE-682, CERT-FLP36-C] The ‘0.1f’ literal of the ‘float’ type is compared to a value of the ‘int’ type. <a href="https://github.com/gravecan/enhance-client/blob/642f90eafd954c076a34d60f811de77fdb9f705c/enhance/modules/shield_breaker/shield_breaker.cpp#L628" rel="noopener noreferrer nofollow">shield_breaker.cpp 628</a></p><p>Такие ляпы нет смысла серьёзно разбирать и описывать.</p><p>Можно спросить: “А что ты хочешь от поделок за 15$?” Да, в общем-то, ничего, но вместо нормальных проектов попадаются они. Мне интересно изучить большие открытые проекты нормального качества, при написании которых активно используется GenAI. А то пока ощущение, что термин “вайб-кодинг” есть, а C++ проектов нет. Или за них стыдно? :)</p><p>Если вы знаете подобные большие проекты, то присылайте ссылки на них в комментарии. Заранее спасибо.</p><p>Предыдущие публикации по мелким проектам:</p><ol><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/1354/" rel="noopener noreferrer nofollow">Давайте заглянем в этот самый вайб-код</a>.</p></li><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/1366/" rel="noopener noreferrer nofollow">Ревью вайб-кода с гнильцой, который притворяется оптимизированным С++ кодом</a>.</p></li></ol> <a href="https://habr.com/ru/posts/1041016/?utm_campaign=1041016&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 29 May 2026 08:36:47 GMT</pubDate>
    <dc:creator><![CDATA[Andrey2008 (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[ии]]></category><category><![CDATA[genai]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[генеративный ии]]></category><category><![CDATA[c++]]></category><category><![CDATA[си++]]></category><category><![CDATA[открытый исходный код]]></category><category><![CDATA[вайб-кодинг]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vibecodingai — C++ (+2) — 19.05.2026 14:13]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1036878/</guid>
    <link>https://habr.com/ru/posts/1036878/?utm_campaign=1036878&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>🖥 <strong>Создатель C++ разнёс вайбкодинг: “сеньоры не хотят разгребать этот мусор”</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/957/933/46d/95793346d3354475a583aaaf44edba86.jpg" width="1241" height="1280"></figure><p>Бьёрн Страуструп, легендарный создатель C++, в новом двухчасовом интервью резко прошёлся по вайбкодингу.</p><p>Главная претензия простая: сгенерированный код пока слишком часто выглядит красиво только на демке. В реальном проекте он приносит баги, раздувает кодовую базу, плодит уязвимости и плохо поддаётся нормальной проверке.</p><p>Особенно больно это бьёт по опытным разработчикам. Им потом приходится не “магически ускоряться с ИИ”, а читать, чинить и переписывать слоп, который кто-то нагенерировал за пять минут.</p><p>Похожая история уже<a href="https://t.me/linuxacademiya/1109" rel="noopener noreferrer nofollow"> достала и Линуса Торвальдса.</a> Его буквально завалили кривыми AI-отчётами по ядру Linux: вроде бы люди “помогают”, а на практике создают шум, который мешает настоящей разработке.</p><p>Если человек не понимает архитектуру, безопасность, тесты и границы задачи, то вайбкодинг превращается не в ускорение, а в генератор технического долга.</p><p>Сеньоры не боятся ИИ.</p><p>Они просто не хотят провести остаток карьеры, разгребая чужой промптованный мусор.</p><p> Полное интервью нашел в тг тут: <a href="https://t.me/cpluspluc/1451" rel="noopener noreferrer nofollow">https://t.me/cpluspluc/1451</a></p> <a href="https://habr.com/ru/posts/1036878/?utm_campaign=1036878&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 19 May 2026 11:13:57 GMT</pubDate>
    <dc:creator><![CDATA[vibecodingai]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[страуструп]]></category><category><![CDATA[мнение]]></category><category><![CDATA[легенда]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vibecodingai — C++ (+2) — 14.05.2026 13:07]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1035112/</guid>
    <link>https://habr.com/ru/posts/1035112/?utm_campaign=1035112&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>В C код может выполниться ещё до <code>main()</code></strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/1e8/810/360/1e881036099cb6d3c0d4263bacd8c79f.jpg" width="905" height="825"></figure><p>В Linux и GCC есть constructor-функции - они запускаются автоматически до входа в main().</p><p>Выглядит почти как магия:</p><p>Такую функцию не нужно вызывать вручную. Компилятор сам пометит её как код, который должен выполниться при старте программы.</p><p>Где это используется:</p><p>- инициализация глобального состояния</p><p>- подготовка shared libraries</p><p>- регистрация плагинов</p><p>- настройка runtime-окружения</p><p>- выполнение служебного кода до основной логики</p><p>Именно поэтому в C-программе не всегда всё начинается с main().</p><p>Иногда до него уже кто-то успел поработать.</p><p>Подсмотрел в тг про С++ : <a href="https://t.me/cpluspluc/1449" rel="noopener noreferrer nofollow">https://t.me/cpluspluc/1449</a></p> <a href="https://habr.com/ru/posts/1035112/?utm_campaign=1035112&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 14 May 2026 10:07:36 GMT</pubDate>
    <dc:creator><![CDATA[vibecodingai]]></dc:creator>
      
      <category><![CDATA[c]]></category><category><![CDATA[cpp]]></category><category><![CDATA[linux]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @fascwind — C++ (+1) — 08.05.2026 11:59]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1032934/</guid>
    <link>https://habr.com/ru/posts/1032934/?utm_campaign=1032934&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Всем доброго времени суток. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/d6e/916/cd0/d6e916cd06cd57cf22e8d695f39a4b51.png" width="1280" height="720"></figure><p><br>Я С++ разработчик из Тюмени. Хочу представить вам свой проект : "Инструментарий Мастера Подземелья" <a href="https://mastertoolkit.ru/" rel="noopener noreferrer nofollow">https://mastertoolkit.ru/</a> (тут лежит рабочий прототип)</p><p>Исходный код выложен тут : <a href="https://gitlab.com/R1nk/dungeonmastertoolkit" rel="noopener noreferrer nofollow">https://gitlab.com/R1nk/dungeonmastertoolkit</a></p><p>В данный момент чувствую выгорание над проектом. Сайт выложен год назад, но не получал ни одного фидбэка. Прошлой осенью провел сессию по днд и выявил для себя пару ошибок и недоработок.</p><p>На текущий момент внесены изменения над кодом и функционалом и не завершен в рабочую сборку. </p><p>Инструментарий для мастеров подземелья. Есть 2 вида генерации событий:</p><ol><li><p>Абстрактная навигация (карты таро, описание мастей и значений. где масти можно описать как положительные так и негативные последствия, а значения можно более конкретизировать. Например отряд гоблинов как препятсвие или обвал).</p></li><li><p>Это события. можно описать дерево событий, из которых можно выбрать случайным способом. Например можно описать случайные квесты или встречи.</p></li><li><p>Журнал приключений (в режиме Сессия туда попадают все выпадающие события и абстрактная навигация)</p></li><li><p>Статистика так же работает в режиме сессии. Графики по выпавшим ситуациям.</p></li></ol> <a href="https://habr.com/ru/posts/1032934/?utm_campaign=1032934&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 08 May 2026 08:59:06 GMT</pubDate>
    <dc:creator><![CDATA[fascwind]]></dc:creator>
      
      <category><![CDATA[dungeons and dragons]]></category><category><![CDATA[tools]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DrMayDay — Rust (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1032036/</guid>
    <link>https://habr.com/ru/posts/1032036/?utm_campaign=1032036&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Rust + LLM: новая и сильная “ОПГ” против C++ и его друзей…</p><p>Есть такая штука с Borrow Checker - он ненавидит людей. Не потому, что он плохой, а потому, что требует держать в голове графы данных всего приложения всё время, пока пишешь. Люди устают, раздражаются, и в итоге - <code>unsafe</code>, чувство стыда перед собой и коллегами, и понеслась. А LLM на это просто… скажем, кхм, “не важно”. Ну, надо так надо. LLM итерирует. И самое забавное - ей можно запретить <code>unsafe</code> прямо в промпте, и она не будет искать обходные пути(ну, может, разок другой - Opus попробует, но это ловится простым поиском по файлам, даже PVS-Studio не нужен, хотя с ним было бы фееричнее). Скорее всего, LLM просто найдёт решение в рамках safe Rust. И это круто.</p><p>Про Python и JS - там ведь основная проблема не скорость даже(и синтаксически значимые пробелы у некоторых), а то, что деплоится не программа, а среда. Интерпретатор, зависимости, версии, “а на проде другой питон”… Сейчас с линковщиком от Zig можно прямо из Windows собрать бинарник под Linux - статически, без танцев(привет musl!), одним пинком. И это не какой-то хак, это просто работает. Получаешь один файл, который либо запустится, либо нет - без сюрпризов в середине.</p><p>C++ тут проигрывает не потому, что он сложный или плохой - он интересный, мощный, с огромной историей и экосистемой. Но именно эта мощность становится проблемой когда код - генерирует LLM(можно выстрелить себе в ногу из гранатомёта, и, самое страшное - не заметить этого). Модель получает слишком много способов сделать что-то, и часть из них - UB. Rust убивает целый класс таких подходов к реализации на уровне компилятора. Это не договорённость и не линтер - это просто не скомпилируется.</p><p>Мне кажется, уникальность этой связки тут в том, что задачи разделились очень чисто: LLM думает про логику, компилятор думает про корректность. И они не мешают друг другу. В C++ - см. выше. Именно то, что делает Rust тяжёлым для людей(кроме евангелистов и стримеров), делает его почти идеальным для этой связки.</p><p>Ну и если кто был травмирован неудачным опытом с “вайб-кодингом”, и сложилось впечатление, что вся эта пляска с LLM, это не серьёзно - попробуйте отложить китайщину(MiniMax, GLM, DeepSeek...), взять фронтир-модель типа “OpenAI Codex GPT-5.5 на XtraHigh” - и дать ей хотелку в виде описания какого-нибудь серверного приложения на Rust, и просто посмотреть что будет через 15-20 минут. Забейте на клоунов со “змейкой” и прочей мелочёвкой из бенчмарков на ютубе, попробуйте реальную задачку(многохопывый релей между серверами со своим протоколом КВН например и клиентами для Win/Linux). Оно сделает. Быстро. Качественно. Это довольно странное ощущение, честно говоря, видеть такое…</p><p>Просто мысли вслух, хотелось поделиться)</p><p>        -s. TekMetrics certified “Master C programmer”, July 1999</p> <a href="https://habr.com/ru/posts/1032036/?utm_campaign=1032036&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 06 May 2026 09:20:56 GMT</pubDate>
    <dc:creator><![CDATA[DrMayDay]]></dc:creator>
      
      <category><![CDATA[Rust]]></category><category><![CDATA[LLM]]></category><category><![CDATA[c++]]></category><category><![CDATA[borrow checker]]></category><category><![CDATA[rust is faster than go]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MeLiza_Beth — Блог компании PVS-Studio (+1) — 30.04.2026 14:33]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1030096/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1030096/?utm_campaign=1030096&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Тихий враг или молчаливый союзник? Коротко о выравнивании в C++. Часть 3 </strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/595/7c4/284/5957c4284de4c393cd96e36170d73858.png" width="1600" height="902"></figure><p>Мы уже разобрали базовое выравнивание полей и изучили, как наследование наслаивает данные друг на друга. Казалось бы, теперь-то всё — все ловушки изучены. Но не тут-то было! Есть у этой темы ещё одна, по-настоящему тёмная сторона, про которую не так часто говорят. </p><p>Одно короткое слово virtual полностью переписывает "геометрию" класса, внося в выравнивание свои коррективы, которые трудно игнорировать. Давайте разберёмся, что на самом деле происходит под капотом, когда выравнивание сталкивается <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1369/" rel="noopener noreferrer nofollow">с виртуальностью</a>.</p> <a href="https://habr.com/ru/posts/1030096/?utm_campaign=1030096&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 30 Apr 2026 11:33:07 GMT</pubDate>
    <dc:creator><![CDATA[MeLiza_Beth (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[alignment]]></category><category><![CDATA[virtual]]></category><category><![CDATA[padding]]></category><category><![CDATA[c++]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @YuriPanchul — C++ (+4) — 27.04.2026 18:59]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1028712/</guid>
    <link>https://habr.com/ru/posts/1028712/?utm_campaign=1028712&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Чернобыльское лето 1986 года, когда все киевские одноклассники разъехались по разным концам СССР подальше от радиации, было для меня супер-продуктивным в смысле изучения программирования. Я ходил в контору человека по фамилии Долина, бывшего полковника танковых войск из Донецка, который переквалифицировался в компьтеризатора украинского образования. Там я работал на компьютерах MSX Yamaha, выучил программирование на Си. Компилятор назывался ASCII C (сейчас в комментах появятся умники которые будут мне говорить, что ASCII это кодировка, а я им буду кидать ссылку что это еще и японская компания).</p><p>Долине мое увлечение Си не нравилось, он хотел чтобы я больше писал программ на Бейсике, которые он демонстрировал людям из украинских министерств и студии мультфильмов (некоторые программы были графические). Кроме графики я сделал еще например программу которая фиксировала в реальном времени действия футболистов во время матча, через нажатия клавиш наблюдателем. Контора Долины была у стадиона, оттуда доносились вопли болельщиков. Долина это показывал кому-то по спортивной линии.</p><p>В конце лета я полетел на Новосибирскую Летнюю Школу Юных Программистов, где выучил ассемблер Z80 и сделал поддержку параллельного выполнения нескольких Си функций с помощью переключения контекстов в обработчике прерывания по таймеру. С сохранением регистров в дексрипторе задачи в списке задач. За это я получил диплом первой степени. По-моему дипломы вручал академик Ершов, хотя может я путаю и мы встретились с ним в академгородке куда на тоже возили.</p><p>На школе было невероятное количество комаров, а также красивая девочка из Томска, которая мне нравилась, и ее подружка, которой нравился я. Из Украины еще был юный гений из Харькова, который постоянно спорил со мной, что персоналки фигня, а мейнфреймы - это круто. Так как я успел поработать и на мейнфреймах, споры были довольно развесистые.</p><p>Еще там я увидел первые советские программы западного качества - редактор tor(?), программу низкоуровневой работы с диском и оконный отладчик. Они были написаны на Си и ассемблере аккуратно, как примеры в западных книжках. Советский код который я видел до этого (и большинство после этого) был написан тяп-ляп. Писали эти программы местные аспиранты которые были также преподавателями школы.</p><p>Помимо этих программ я привез на флоппи-дисках со школы CP/M (хуже файловая система чем в MSX-DOS), среду Turbo Pascal, интерпретатор Lisp, компилятор Nevada Fortran, еще два компилятора Си (Aztec C и BDS C) и даже компилятор с подмножества языка Ada, который я знал теоретически, но никогда не использовал.</p><p>29 лет спустя, в 2017 году я приехал на ту же новосибирскую школу в качестве инструктора по Verilog и FPGA. Еще там был Борис Файфель который учил детей Лиспу или чему-то такому.</p> <a href="https://habr.com/ru/posts/1028712/?utm_campaign=1028712&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 27 Apr 2026 15:59:08 GMT</pubDate>
    <dc:creator><![CDATA[YuriPanchul]]></dc:creator>
      
      <category><![CDATA[Lisp]]></category><category><![CDATA[ADA]]></category><category><![CDATA[Z80]]></category><category><![CDATA[Летняя Школа Юных Программистов]]></category><category><![CDATA[ЛШЮП]]></category><category><![CDATA[Ершов]]></category><category><![CDATA[Новосибирск]]></category><category><![CDATA[Yamaha]]></category><category><![CDATA[Чернобыль]]></category><category><![CDATA[СССР]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @viordash — Искусственный интеллект (+3) — 25.04.2026 18:05]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1027882/</guid>
    <link>https://habr.com/ru/posts/1027882/?utm_campaign=1027882&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Оптимизация контекста для Claude Code на большом проекте (иногда и 50% экономия токенов)</strong></p><p>Работаю над большим C++ проектом - реализация сетевого протокола. Использую Claude Code как основной инструмент. Со временем заметил: каждый новый чат начинается с того, что агент долго читает README.md, который разросся до 1000+ строк и 60 КБ.</p><p><strong>Проблема</strong></p><p>В CLAUDE.md была прописана команда читать README.md в начале каждого диалога, агенту нужно дать контекст проекта. Пока проект был небольшим это работало нормально. Но README рос вместе с проектом и в итоге стал содержать всё: архитектуру, логику DTLS, настройки веб-интерфейса, описание протокола, инструкции по сборке.</p><p>И как результат:</p><ul><li><p>Агент тратит тысячи токенов на анализ файла до начала работы</p></li><li><p>Если задача касается только фронтенда, модель всё равно загружает детали реализации ядра протокола. Лишний контекст снижает точность ответов.</p></li></ul><p><strong>Решение</strong></p><p>Вместо одного большого файла использовать иерархию маленьких, в отдельной папке <code>claude-context/</code>:</p><pre><code>claude-context/
├── context-claude.md       # общая архитектура и навигация (~90 строк)
├── context-AC-claude.md    # Access Controller
├── context-WTP-claude.md   # WTP Agent
├── context-WEB-claude.md   # Web Interface
└── context-TESTS-claude.md # тесты
</code></pre><p>Главный файл <code>context-claude.md</code> содержит краткое описание проекта и таблицу-навигатор: какой файл читать для какой области. В дочерних файлах описана детализация по модулям, каждый 100-130 строк.</p><p>Инструкция в CLAUDE.md теперь выглядит так:</p><blockquote><p>“Start each new conversation by reading claude-context/context-claude.md. For deeper context on specific areas, read the relevant file from that directory.”</p></blockquote><p>Агент читает главный файл (90 строк), понимает область задачи, подгружает только нужный дочерний контекст.</p><p><strong>Замер</strong></p><p>Чтобы проверить эффект, я поставил Claude одну и ту же задачу в двух разных конфигурациях:</p><blockquote><p>“Добавь тесты для WtpConfigController и WtpRadioController, проверь что если WTP address не строка, то возникает исключение std::runtime_error”</p></blockquote><pre><code>| Параметр             | README.md (60 КБ) | Иерархический контекст | Разница  |
| :------------------- | :---------------- | :--------------------- | :------- |
| Токены на сообщения  | 36.8k             | 17.6k                  | -53%     |
| Всего токенов        | 56.7k             | 37.6k                  | -34%     |
| Рост usage за задачу | +11%              | +6%                    | В 2 раза |
| Скорость анализа     | Заметная пауза    | Почти мгновенный старт |          |
</code></pre><p><strong>Важный момент</strong></p><p>README.md остался нетронутым - это документация для людей. Файлы в <code>claude-context/</code> - отдельный артефакт, написанный под AI: плотно, без лирики, с ASCII-схемами и таблицами. Я старался не смешивать два разных назначения в одном файле.</p><p>При небольшом проекте в этом подходе смысла нет, накладные расходы на поддержку двух наборов документации не оправдаются.</p> <a href="https://habr.com/ru/posts/1027882/?utm_campaign=1027882&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Apr 2026 15:05:10 GMT</pubDate>
    <dc:creator><![CDATA[viordash]]></dc:creator>
      
      <category><![CDATA[claude code]]></category><category><![CDATA[llm]]></category><category><![CDATA[оптимизация]]></category><category><![CDATA[контекстное окно]]></category><category><![CDATA[документация]]></category><category><![CDATA[ai-агенты]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @andrey_chuyan — DevOps (+4) — 25.04.2026 13:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1027802/</guid>
    <link>https://habr.com/ru/posts/1027802/?utm_campaign=1027802&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<iframe id="69ec942542c0bc03ac2e960a" src="https://embedd.srv.habr.com/iframe/69ec942542c0bc03ac2e960a" class="embed_video embed__content" allowfullscreen="true"></iframe><p><strong>🌲 Открываем регистрацию на Дебаг Кемп</strong></p><p>Мы придумали формат, который давно хотели сами: выбираешься из города, два дня в сосновом лесу на Карельском перешейке — маршрут, костёр, мастер-классы по выживанию, нетворкинг без слайдов и питчей. Просто люди, с которыми интересно, и никакого Slack-а.</p><p><strong>📅 6–7 июня 2026 (выходные)</strong> <strong>👥 Всего 25 мест</strong> — маленький формат, это принципиально.</p><p>Цена растёт по мере приближения к дате. Оплатить можно частями через сплит → <a href="https://debug-skills.timepad.ru/event/3936231/#register" rel="noopener noreferrer nofollow">регистрация</a></p><p>Если вы <a href="https://vk.com/polnyistek?w=donut_payment-232485571&amp;levelId=2501" rel="noopener noreferrer nofollow">💎 практик сообщества</a> — скидка 15% применяется при регистрации автоматически. Ещё не практик, но думаете? Сейчас самый разумный момент.</p><p>👀 <a href="https://debugskills.ru/debug-camp/" rel="noopener noreferrer nofollow">Узнать больше</a> · 📝 <a href="https://debug-skills.timepad.ru/event/3936231/" rel="noopener noreferrer nofollow">Регистрация</a></p><p>Вопросы — в чат, мы там живём.</p> <a href="https://habr.com/ru/posts/1027802/?utm_campaign=1027802&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Apr 2026 10:18:16 GMT</pubDate>
    <dc:creator><![CDATA[andrey_chuyan]]></dc:creator>
      
      <category><![CDATA[нетворкинг]]></category><category><![CDATA[оффлайн-мероприятие]]></category><category><![CDATA[кемп]]></category><category><![CDATA[тимбилдинг]]></category><category><![CDATA[выживание]]></category><category><![CDATA[карелия]]></category><category><![CDATA[разработчики]]></category><category><![CDATA[it-сообщество]]></category><category><![CDATA[конференция]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+1) — 24.04.2026 11:24]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1027386/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1027386/?utm_campaign=1027386&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Тема неопределённого поведения (UB) в языке C++ освещается и обсуждается многие годы, но это не значит, что она исчерпала себя. Это плата, которую программисты отдают за эффективные оптимизации кода, такие как удаление ряда проверок.  </p><p>C++ - опасный инструмент, и не помешает лишний раз напомнить, как правильно держать его в руках. Причём с приходом инструментов вайб-кодинга ситуация, скорее всего, даже ухудшится, так как станет ещё сложнее удерживать неопределённое поведение под контролем. В докладе обсудили эту тему, заглянув в будущее. </p><iframe id="69eb28684b66d902aa913a13" src="https://embedd.srv.habr.com/iframe/69eb28684b66d902aa913a13" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Полезные ссылки из доклада:</p><ul><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/0374/" rel="noopener noreferrer nofollow">Undefined behavior ближе, чем вы думаете</a></p></li><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/1024/" rel="noopener noreferrer nofollow">Ложные представления программистов о неопределённом поведении</a></p></li><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/1298/" rel="noopener noreferrer nofollow">Подножка для AI в виде UTF-8</a></p></li><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/1215/" rel="noopener noreferrer nofollow">Путеводитель C++ программиста по неопределённому поведению</a></p></li></ul><p><em>Примечание. </em>Был задан вопрос про безопасные компиляторы (ГОСТ Р 71206—2024). Подробнее с этой темой можно познакомиться здесь:&nbsp;<a href="https://pvs-studio.ru/ru/webinar/rbpo/content/#Process12" rel="noopener noreferrer nofollow">Использование безопасной системы сборки программного обеспечения</a></p><p>Сделайте свой проект чистым с PVS-Studio. Месяц бесплатного использования по&nbsp;<a href="https://pvs-studio.ru/training_webinar" rel="noopener noreferrer nofollow">промокоду</a>.</p> <a href="https://habr.com/ru/posts/1027386/?utm_campaign=1027386&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 24 Apr 2026 08:24:56 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[undefined behavior]]></category><category><![CDATA[доклад]]></category><category><![CDATA[неопределённое поведение]]></category><category><![CDATA[вайбкодинг]]></category><category><![CDATA[cpp]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @JordanCpp — C (+4) — 20.04.2026 14:17]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1025592/</guid>
    <link>https://habr.com/ru/posts/1025592/?utm_campaign=1025592&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Переосмысление библиотеки <a href="https://github.com/JordanCpp/LDL" rel="noopener noreferrer nofollow">LDL</a>.</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/8eb/316/594/8eb3165940792d960cabf23cb81bb10c.jpg" width="802" height="632"></figure><p>Я полностью пересмотрел концепцию библиотеки LDL.</p><p><strong>Что такое LDL?</strong><br>Это графическая библиотека с единым API для всех систем как старых, так и новых.</p><p>Раньше я писал её на C++98, что давало хорошую портабельность. Но сейчас я пересмотрел многие тезисы, которые декларировал на GitHub, чтобы наконец добраться до первого релиза.</p><p>Новая стратегия</p><p>Я решил выпускать релизы&nbsp;<strong>без реализации полного функционала</strong>&nbsp;(графика, звук, шрифты и т.д.) постепенно, итеративно.</p><ul><li><p>Перешёл на&nbsp;<strong>C89</strong>&nbsp;для максимальной переносимости. Это не только DOS или Windows 3.x, но и старые системы вроде Solaris, PlayStation 1 и другие.</p></li><li><p>Для&nbsp;<strong>первого релиза</strong>&nbsp;реализую минимальный базовый функционал: графику (OpenGL, Vulkan), окна и события. По возможностям аналог GLFW.</p></li><li><p>С каждым следующим релизом буду добавлять: 2D-рендер, звук, шрифты и прочее.</p></li></ul><p>Лицензия и целевые платформы</p><ul><li><p>Лицензия меняется на&nbsp;<strong>LGPLv3</strong>.</p></li><li><p>На старте поддерживаются&nbsp;<strong>Windows и Linux</strong>.</p></li></ul><p>Качество и инструменты</p><p>При разработке использую:</p><ul><li><p>AddressSanitizer (ASan)</p></li><li><p>UndefinedBehaviorSanitizer (UBSan)</p></li><li><p>Различные анализаторы кода</p></li></ul><p>Я считаю, что такая стратегия полезнее, чем годами доводить библиотеку до версии 1.0 в офлайн-режиме.</p><p><strong>Примеры и бэкенды</strong></p><ul><li><p>Добавлю&nbsp;<strong>десятки примеров</strong>&nbsp;с OpenGL 1.x, OpenGL 3.x и Vulkan.</p></li><li><p>Буду добавлять&nbsp;<strong>бэкенды для LDL</strong>: не только под ОС, но и поверх других графических библиотек — SDL, SFML, GLFW и т.д.</p></li><li><p><strong>API остаётся единым</strong>&nbsp;для всех бэкендов.</p></li></ul><p>Это позволит сразу добавить поддержку звука и шрифтов (через бэкенды), а в нативных версиях реализовывать их позже.</p><p>&nbsp;<strong>2D-рендер без границ</strong></p><p>Одной из главных задач LDL я вижу создание&nbsp;<strong>единого 2D-интерфейса</strong>, который стирает различия между поколениями графики.</p><p>Вам не нужно думать о том, что находится в системе: современная видеокарта с&nbsp;<strong>Vulkan</strong>, старый ускоритель с&nbsp;<strong>OpenGL 1.2</strong>&nbsp;или вообще только центральный процессор (<strong>Software Rendering</strong>).</p><ul><li><p><strong>Единый интерфейс</strong>: Вы используете одни и те же команды для рисования пикселей, линий и спрайтов.</p></li><li><p><strong>Адаптивность</strong>: LDL сам выберет наиболее эффективный способ вывода изображения. На современной системе это будет аппаратное ускорение, а на «железе» без видеокарты оптимизированный программный растеризатор.</p></li><li><p><strong>Визуальная честность</strong>: Ваш визуальный стиль останется неизменным, на чем бы он ни запускался. Это дает возможность делать игры и приложения, которые выглядят и работают одинаково и на ретро-ноутбуке, и на современном мониторе.</p></li></ul><p><strong>Философия: Машина времени в вашем коде</strong></p><p>Зачем тратить силы на поддержку систем, которые многие считают «трупами»?</p><p><strong>1. Борьба с цифровым забвением</strong></p><p>Современный софт живет 3–5 лет. Мы выбрасываем железо не потому, что оно сломалось, а потому, что софт стал слишком тяжелым и ленивым. LDL — это протест против «запланированного устаревания». Я хочу, чтобы код, написанный сегодня, мог дышать в железе любой эпохи.</p><p><strong>2. Инженерный аскетизм</strong></p><p>Когда у тебя гигабайты памяти, ты перестаешь ценить каждый байт. Написание библиотеки под C89 для слабого железа — это духовная практика для программиста. Это возвращение к искусству находить изящные решения в условиях жестких ограничений. Каждый сэкономленный такт процессора — это дань уважения инженерам прошлого.</p><p><strong>3. Преемственность поколений</strong></p><p>Мы стоим на плечах гигантов, но часто забываем их имена. LDL сохраняет возможность для диалога между эпохами. Это инструмент, который позволяет современному разработчику почувствовать «металл» старых машин, не теряя связи с современными технологиями вроде Vulkan.</p><p><strong>Итог</strong></p><p>LDL — это&nbsp;<strong>Little Directmedia Layer</strong>. Он маленький не потому, что слабый, а потому, что в нем нет ничего лишнего. Это попытка создать код, который будет принадлежать не конкретной версии ОС, а истории программирования в целом.</p><p>Один API. Один код. Тридцать лет компьютерной истории.</p> <a href="https://habr.com/ru/posts/1025592/?utm_campaign=1025592&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 20 Apr 2026 11:17:08 GMT</pubDate>
    <dc:creator><![CDATA[JordanCpp]]></dc:creator>
      
      <category><![CDATA[c89]]></category><category><![CDATA[c++]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @A-G-B — Блог компании PVS-Studio (+4) — 30.03.2026 17:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1017014/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1017014/?utm_campaign=1017014&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Всё, что нужно знать для начала работы в PVS-Studio</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/a9a/ced/548/a9aced548cf807529f37c7f0f605f355.png" width="975" height="549"></figure><p>Статический анализатор PVS-Studio — это инструмент для поиска ошибок в коде на протяжении всего жизненного цикла проекта. <br>В новой статье разберём основные <a href="https://pvs-studio.ru/ru/blog/posts/1358/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">особенности анализатора PVS-Studio</a>, сценарии и варианты анализа, а также узнаем всё, что нужно знать для начала работы с инструментом.</p> <a href="https://habr.com/ru/posts/1017014/?utm_campaign=1017014&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 30 Mar 2026 14:19:03 GMT</pubDate>
    <dc:creator><![CDATA[A-G-B (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[с++]]></category><category><![CDATA[c#]]></category><category><![CDATA[java]]></category><category><![CDATA[рбпо]]></category><category><![CDATA[sast]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ilnurKh — C++ — 22.03.2026 23:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1013450/</guid>
    <link>https://habr.com/ru/posts/1013450/?utm_campaign=1013450&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Сравнивал разные методы сделать call-once (а точнее инициализацию синглтона) - далее небольшие заметки.</p><p>Итак, нам нужно создать какой-то объект, пусть даже что-то нетривиальное (для определённости можно представлять что мы хотим прочитать данные из файла/эмбеддет ресурсов и разложить эти данные в хеш-мапу для будущих чтений). Рассмотрим следующие варианты:</p><ol><li><p>статичный глобальный объект, вычисление вызывается в конструкторе</p></li><li><p>статичный глобальный объект + std::call_once</p></li><li><p>статичный локальный объект в функции, вычисление вызывается в конструкторе</p></li></ol><p>Чтобы в годболте видеть что и где вызывается - определяем тип имеющий только объявления методов (это заставит компилятор ставить явный <code>call</code>)</p><pre><code class="cpp">struct TSomeExternal {
    TSomeExternal(int);
    ~TSomeExternal();

    int DoCalc();
    char Data[60]; // просто чтобы было проще увидеть
};
</code></pre><p>Особенности <strong>первого варианта</strong>:</p><ul><li><p>вычисление "до main"</p></li><li><p>неконтролируемый порядок инициализации глобальных ответов =&gt; нельзя иметь зависимости между такими объектами</p></li><li><p>вычисление только в рамках 1 потока</p></li><li><p>уникальный плюс: нет проверок "на горячем цикле" - при обращении к объекту вызывающая функция может считать что данные уже готовы (но именно этот плюс стоит нам второго пункта)</p></li></ul><p>В <a href="https://godbolt.org/z/Pf4nvzbjh" rel="noopener noreferrer nofollow">годболте</a> можно посмотреть на func1 - видно что она скомпилилась просто в забор поинтера, и <code>call</code></p><pre><code class="cpp">TSomeExternal GlobalValue(7);
int func1() {
    int x = GlobalValue.DoCalc();
    return x + 14;
}
</code></pre><p>Также видно что были порождены - указание что нужно разместить объект</p><pre><code>GlobalValue:
        .zero   60
</code></pre><p>А также <code>_GLOBAL__sub_I_example.cpp</code> - там видно, что вызывается конструктор, и регистрируется указатель на деструктор в пост-колбеках (<code>__cxa_atexit</code>)</p><p><strong>Второй вариант</strong> (более правдоподобно было бы внести call_once внутрь глобального объекта, но для простоты сравнения сделал как ниже)</p><pre><code class="cpp">static std::once_flag flag;
static std::unique_ptr&lt;TSomeExternal&gt; ptr;
void init() {ptr = std::make_unique&lt;TSomeExternal&gt;(7);}

int func2() {
    std::call_once(flag, init);
    int x = ptr-&gt;DoCalc();
    return x + 14;
}
</code></pre><ul><li><p>настоящая инициализация случается только в момент первого использования (ленивая инициализация). Это может быть как плюс (позволяет не тратиться на инициализацию если данные не будут использоваться), так и минус (первые запросы/итерации будут медленными)</p></li><li><p>разные инициализаторы данных вполне могут работать одновременно из разных потоков</p></li><li><p>имхо - дорогой основной цикл (очень много инструкций до <code>TSomeExternal::DoCalc</code>) - это всё подготовка вызова <code>call pthread_once</code>, который будет выполнен каждый раз</p></li></ul><p><strong>Третий вариант</strong> <a href="https://godbolt.org/z/8Goav3o6v" rel="noopener noreferrer nofollow">годболт</a></p><pre><code class="cpp">int func3() {
    static TSomeExternal prepared = {7};
    int x = prepared.DoCalc();
    return x + 14;
}
</code></pre><ul><li><p>в рантайме есть проверка - но это проверка и так нужного нам указателя на null</p></li></ul><pre><code>push    rbx
movzx   eax, byte ptr [rip + guard variable for func3()::prepared]
test    al, al
je      .LBB0_1
</code></pre><ul><li><p>если указатель не нулевой, то переход не будет выполнен и мы сразу переходим к</p></li></ul><pre><code>        lea     rdi, [rip + func3()::prepared]
        call    TSomeExternal::DoCalc()@PLT
</code></pre><ul><li><p>в случае если указатель не готов, то подготовка случается под блокировкой (<code>__cxa_guard_acquire</code>)</p></li><li><p>конкретно в годболте не видно, но создаются слоты для <code>guard variable for func3()::prepared</code> и <code>func3()::prepared</code> (в этом смысле разницы со вторым вариантом мало)</p></li></ul><p>Итого: ленивое вычисление, также возможна многопоточная инициализация, а также дешёвый success-path</p><p>Я бы назвал относительным неудобством третьего варианта, что указатель оказывается скрыт внутри функции, и надо сделать ещё доп действие чтобы использовать объект из нескольких функций. Пример такой обёртки <a href="https://github.com/ytsaurus/ytsaurus/blob/70adf41209de55a50cd90685471c838782197360/util/generic/singleton.h#L115" rel="noopener noreferrer nofollow">Singleton</a>.</p> <a href="https://habr.com/ru/posts/1013450/?utm_campaign=1013450&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 22 Mar 2026 20:27:45 GMT</pubDate>
    <dc:creator><![CDATA[ilnurKh]]></dc:creator>
      
      <category><![CDATA[call_once]]></category><category><![CDATA[singleton]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @FaryaRos — Linux (+3) — 16.03.2026 19:22]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1010982/</guid>
    <link>https://habr.com/ru/posts/1010982/?utm_campaign=1010982&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>NixOS: идея, до&nbsp;которой индустрия доросла только сейчас.</strong></p><p>Кажется, NixOS наконец выходит из&nbsp;категории системы «для своих» и становится все заметнее в&nbsp;инженерной среде. Это закономерно: он очень точно попал в&nbsp;проблемы, с&nbsp;которыми команды массово столкнулись только в&nbsp;последние годы.</p><p>История началась в 2003&nbsp;году, когда исследователь Элко Долстра и его коллеги в&nbsp;Утрехтском университете запустили проект Nix. Это исследовательский проект, который включал пакетный менеджер и собственный декларативный язык. Идея&nbsp;была сделать так, чтобы пакеты и зависимости собирались предсказуемо, не&nbsp;конфликтовали между собой и не&nbsp;превращали систему в&nbsp;хаос после очередного обновления. Чуть позже из&nbsp;этой логики вырос NixOS, где тот&nbsp;же подход применили уже ко всей операционной системе.</p><p>В&nbsp;этом и&nbsp;был главный поворот. Nix с&nbsp;самого начала смотрел на&nbsp;систему не&nbsp;как&nbsp;на&nbsp;набор вручную настроенных файлов и команд, а&nbsp;как&nbsp;на&nbsp;то, что&nbsp;можно описать целиком. Пакеты хранятся изолированно, разные версии могут спокойно жить рядом, а&nbsp;состояние машины задается через конфиг. За&nbsp;счет этого обновления становятся атомарными.</p><p>Это особенно интересно на&nbsp;фоне обычных Linux‑дистрибутивов. Там текущее состояние системы часто является результатом длинной цепочки действий: что‑то поставили, что‑то удалили, где‑то поправили конфиг, где‑то забыли. В&nbsp;NixOS логика другая: ты описываешь&nbsp;желаемое состояние, а&nbsp;система приводит машину именно к&nbsp;нему. Если новая конфигурация не&nbsp;взлетела, предыдущее состояние никуда не&nbsp;исчезает.</p><p>😏 Почему NixOS набирает популярность именно сейчас? Потому что&nbsp;индустрия наконец доросла до&nbsp;его сильных сторон. Чем больше у&nbsp;команды окружений, CI/CD, инфраструктуры как&nbsp;кода и цены ошибки, тем важнее воспроизводимость и предсказуемость. То, что&nbsp;раньше выглядело как&nbsp;нишевая экзотика, сегодня все чаще выглядит как&nbsp;очень здравый инженерный выбор.</p><p><strong>Многие современные immutable‑системы по&nbsp;сути идут в&nbsp;ту&nbsp;же сторону, куда NixOS пошел еще много лет назад.</strong></p><p>А&nbsp;если хочется не&nbsp;просто прочитать про&nbsp;Nix, а&nbsp;разобраться, как&nbsp;он работает на&nbsp;практике, приходите на&nbsp;наш открытый воркшоп.</p><p>📹 Открытый воркшоп в&nbsp;рамках ИнженеркаТех Плюс, <strong>18&nbsp;марта в 19:00&nbsp;по&nbsp;МСК. </strong>Александр Сергеев из&nbsp;сообщества RULKC, Russian Linux Kernel Community, расскажет про&nbsp;Nix и функциональный подход к&nbsp;пакетам и сборке.</p><p>Если вы хотите получить полный контроль над окружением и наконец закрыть вопрос воспроизводимых сборок, этот воркшоп для&nbsp;вас. Разберем ключевые концепции Nix и наглядно покажем, чем он отличается от&nbsp;привычных систем управления пакетами.</p><p>Зарегистрироваться <a href="https://t.me/inz_infra_bot" rel="noopener noreferrer nofollow">тут</a></p> <a href="https://habr.com/ru/posts/1010982/?utm_campaign=1010982&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 16 Mar 2026 16:22:43 GMT</pubDate>
    <dc:creator><![CDATA[FaryaRos]]></dc:creator>
      
      <category><![CDATA[nix]]></category><category><![CDATA[nixos]]></category><category><![CDATA[linux]]></category><category><![CDATA[linux kernel]]></category><category><![CDATA[linux kernel development]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+3) — 05.03.2026 09:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1006710/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1006710/?utm_campaign=1006710&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>🚀 <strong>Бесплатный курс для разработчиков: создаём свой язык программирования!</strong>    </p><p>Приглашаем вас пройти наш курс и разобраться, как устроены языки программирования изнутри.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/6d1/859/4ed/6d18594edc8ab53337ad2da2c996d864.png" width="1920" height="1080"></figure><p>Изначально курс делали для прохождения внутри компании, но решили, что полезного материала так много, что хочется рассказать всему миру!</p><p>Этот курс подойдёт разработчикам, которые хотят выйти за рамки повседневной разработки и глубже понять фундаментальные принципы работы кода. Да, примеры будут на C++, но сам материал гораздо шире и будет полезен программистам с любым стеком. Независимо от того, пишете вы на C++, C#, Java или любом другом языке, понимание внутренней архитектуры языков сделает вас сильнее как инженера.</p><p>В рамках курса мы шаг за шагом разберём, как создаётся язык программирования:<br> — что такое лексер и парсер и какую роль они играют;<br> — как работает семантический анализ;<br> — как происходит вычисление и обработка кода;<br> — как все эти части объединяются в единую систему.</p><p>Вы увидите, как текст программы превращается в структуру, понятную машине, и поймёте, какие решения стоят за этим процессом.</p><p>Даже если вы не планируете создавать собственный язык программирования, курс поможет чуть глубже понять, как всё это устроено "под капотом", расширить технический кругозор и по-новому взглянуть на привычные инструменты. Это хороший способ систематизировать знания, освежить базовые концепции и просто обсудить интересные темы с коллегами.</p><p>Мы постарались сделать материал одновременно понятным и практико-ориентированным: минимум абстракции ради абстракции — максимум смысла.</p><p>Если вы хотите лучше понимать, что происходит "под капотом" программирования и прокачать инженерное мышление — этот курс для вас.</p><p>👉 Подробности и доступ <a href="https://pvs-studio.ru/ru/blog/training/courses/davajte-sozdadim-yazyk-programmirovaniya/?utm_source=habr&amp;utm_medium=pvsteam" rel="noopener noreferrer nofollow">к курсу по ссылке. </a></p><p>Присоединяйтесь и изучайте программирование глубже — бесплатно!</p> <a href="https://habr.com/ru/posts/1006710/?utm_campaign=1006710&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 05 Mar 2026 06:18:00 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[курс]]></category><category><![CDATA[cpp]]></category><category><![CDATA[создание языка программирования]]></category><category><![CDATA[лексер]]></category><category><![CDATA[java]]></category><category><![CDATA[c#]]></category><category><![CDATA[парсер]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sqooph — C++ (+4) — 27.02.2026 21:08]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1004734/</guid>
    <link>https://habr.com/ru/posts/1004734/?utm_campaign=1004734&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/444/f6d/355/444f6d355cc568553703d53aacb6bb1c.jpg" width="1000" height="563"></figure><p>Прошу помощи. Не могу найти документацию на плату. Купил когда-то на а**-э*****сс, но к ней не было в комплекте вообще ничего. За время поисков удалось найти только два фрагмента схемы. Мб есть у кого такая....</p> <a href="https://habr.com/ru/posts/1004734/?utm_campaign=1004734&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 27 Feb 2026 18:08:03 GMT</pubDate>
    <dc:creator><![CDATA[sqooph]]></dc:creator>
      
      <category><![CDATA[fpga altera]]></category><category><![CDATA[datasheet]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AleksandraUvarova — Блог компании PVS-Studio (+4) — 26.02.2026 10:31]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1003816/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1003816/?utm_campaign=1003816&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как далеко видит lookup в C++?</strong><br> </p><figure class=""><img src="https://habrastorage.org/getpro/habr//post_images/657/405/45f/65740545f75e05d3d56140167ae64f25.png"></figure><p> Хорошей практикой в C++ считается размещение функций рядом с типами, для которых они предназначены. Однако, чтобы такой подход работал корректно, важно понимать механизмы поиска имён и знать, где можно размещать функции, не нарушая правил языка. </p><p>Совсем недавно мы <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1321/" rel="noopener noreferrer nofollow">проверяли проект OpenCV</a> и нашли там довольно интересную ошибку. Рассмотрели её подробнее и написали новую статью специально для тех, кто хочет разобраться с <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1347/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">механизмом поиска имён в C++</a>, в частности с поиском имён по аргументам.</p> <a href="https://habr.com/ru/posts/1003816/?utm_campaign=1003816&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 26 Feb 2026 07:31:41 GMT</pubDate>
    <dc:creator><![CDATA[AleksandraUvarova (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[с++]]></category><category><![CDATA[программирование]]></category><category><![CDATA[с++23]]></category><category><![CDATA[opencv]]></category><category><![CDATA[opensourse]]></category><category><![CDATA[качество кода]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[lookup]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @JordanCpp — Старое железо (+4) — 21.02.2026 15:53]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1002196/</guid>
    <link>https://habr.com/ru/posts/1002196/?utm_campaign=1002196&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/882/908/6b0/8829086b0e7651718f99b67de3bb3433.png" width="594" height="789"></figure><p>Приветствую, Хабравчане!</p><p><strong>Задумывались ли вы, насколько высок современный налог на железо в разработке ПО?</strong></p><p>У меня в руках настоящий «старичок» из 2002-го: сокет 478, матплата GA-8IR2003, Celeron 1700 МГц (по силам как Pentium III на 1 ГГц, но с поддержкой SSE2), 2 Гб ОЗУ, GeForce 4 MX и верный HDD на 40 Гб.</p><p>Я хочу написать о нем статью, но не в стиле ностальгический обзор ретро-игр такого в сети полно. Моя цель вдохнуть в него жизнь и проверить, пригоден ли этот 23-летний дедушка для&nbsp;<strong>современной разработки</strong>.</p><p>На борт успешно встают Windows 7 и Debian 11, что открывает доступ к актуальному софту, IDE и библиотекам. Хочется понять: реально ли на таком непотребстве поднять бэкенд на C# или собрать что-то серьезное на C++?</p><p>Запасной вариант, если основному ПК не хватит инструкций.</p><p>В запасе ПК: Athlon x4 640, 8гб ОЗУ, ssd 256.</p><p>На нем, отключая ядра и понижая частоту можно добиться симуляции ПК начиная с 2000-ого по 2010 год. Думаю этот вариант будет предпочтительнее. Но начну конечно с celeron'а.</p><p><strong>Что планирую потестить:</strong></p><ol><li><p><strong>C# под Linux:</strong>&nbsp;Запустить бэкенд и посмотреть, не «умрет» ли система.</p></li><li><p><strong>Базы данных:</strong>&nbsp;Погонять PostgreSQL 9.4 (она еще дружит с 32-битными процессорами).</p></li><li><p><strong>C++:</strong>&nbsp;Сравнить скорость сборки проекта с модулями и без них.</p></li><li><p><strong>Безумный челлендж:</strong>&nbsp;Попробовать собрать&nbsp;<strong><em>userver</em></strong>. В чате разработчиков сказали "вряд ли взлетит", а мне тем более интересно проверить.</p></li><li><p><strong>IDE:</strong>&nbsp;Какая версия Visual Studio оживет и можно ли в ней работать без боли.</p></li></ol><p><strong>Прошу совета у сообщества:</strong>&nbsp;накидайте идей! Какие бенчмарки прогнать? Какой софт или специфические проекты попробовать собрать, чтобы нащупать предел возможностей?</p><p>Будет интересно сделать вывод: пригоден ли древний ПК хоть для какой-то разработки сегодня, или «налог на железо» стал неподъемным. Жду ваши предложения!</p><p>Update: Поправил текст, ошибки и очепятки.</p> <a href="https://habr.com/ru/posts/1002196/?utm_campaign=1002196&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 21 Feb 2026 12:53:26 GMT</pubDate>
    <dc:creator><![CDATA[JordanCpp]]></dc:creator>
      
      <category><![CDATA[бенчмарки]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MeLiza_Beth — Блог компании PVS-Studio (+2) — 02.02.2026 11:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/991732/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/991732/?utm_campaign=991732&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Тихий враг или молчаливый союзник: коротко о выравнивании в C++. Часть 2</strong>                 </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/6ff/734/c3a/6ff734c3a3e6e092705000fe60b942a6.png" width="974" height="549"></figure><p>Казалось бы, тайна выравнивания раскрыта. Вы победили невидимого врага — невыровненный доступ. Память под контролем, но производительность по-прежнему шепчет: "Есть ещё нюансы". Что? Нюансы? Какие? Пришло время посмотреть, что происходит, когда структуры начинают наследовать друг друга. Здесь всё становится... интереснее. Правила игры меняются.</p><p>Итак, путь ясен: мы погружаемся в мир наследования, чтобы услышать его диалог с памятью. Давайте сразу к делу. Приготовьтесь, правила только что усложнились. <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1340/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">В статье поговорим</a> о выравнивании, наследовании POD-структур и множественном наследовании.</p> <a href="https://habr.com/ru/posts/991732/?utm_campaign=991732&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Feb 2026 08:54:20 GMT</pubDate>
    <dc:creator><![CDATA[MeLiza_Beth (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[alignment]]></category><category><![CDATA[padding]]></category><category><![CDATA[c++]]></category><category><![CDATA[inheritance]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IBS_habrablog — Блог компании IBS (+1) — 30.01.2026 17:17]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ibs/posts/991082/</guid>
    <link>https://habr.com/ru/companies/ibs/posts/991082/?utm_campaign=991082&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/4ca/77b/f31/4ca77bf31ee9ba42d718a03bd6ec9cfc.jpg" width="1119" height="720"></figure><p>Исключения — самый коварный механизм C++. Код компилируется, тесты проходят, но в продакшне система падает из-за partially constructed object или утечки в деструкторе. Результат — часовой дебагг и нестабильность.</p><p>Основная ошибка: путаница между Basic и Strong guarantee. «Валидный» объект ≠ «корректный». Вы нарушаете инварианты, даже не подозревая об этом.</p><p><strong>На вебинаре «<a href="https://ibs-training.ru/training/seminar/156821/" rel="noopener noreferrer nofollow">Exception Safety в C++: как писать код, который не ломается</a>» развенчаем мифы об Exception Safety. Не теория, а разбор реальных антипаттернов из кодовых баз:</strong></p><p>➕ Исключения в деструкторах и как RAII решает это.</p><p>➕ Где noexcept ломает гарантии, а где — критически важен.</p><p>➕ Move-семантика и её скрытые опасности.</p><p><strong>‼️Вы получите</strong>: чёткую ментальную модель и чек-лист для код-ревью, который можно применять уже на следующий день.</p><p><strong>📅 Дата:</strong> 5 февраля</p><p><strong>⏰ Время: </strong>17:00-18:00 (Мск)</p><p>👨‍🎓 <strong>Спикер: </strong>Козырев Дмитрий — специалист в области разработки на C++.</p><p>➡️ <strong><a href="https://ibs-training.ru/training/seminar/156821/" rel="noopener noreferrer nofollow">Регистрация</a> </strong>⬅️</p> <a href="https://habr.com/ru/posts/991082/?utm_campaign=991082&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 30 Jan 2026 14:17:07 GMT</pubDate>
    <dc:creator><![CDATA[IBS_habrablog (IBS)]]></dc:creator>
      
      <category><![CDATA[вебинар]]></category><category><![CDATA[c++]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MeLiza_Beth — Блог компании PVS-Studio (+2) — 29.01.2026 16:20]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/990658/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/990658/?utm_campaign=990658&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Тихий враг или молчаливый союзник: коротко о выравнивании в C++</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/281/a41/53e/281a4153e47466e010238a6f1fe4fa76.png" width="1600" height="902"></figure><p>Представьте, ваша программа — образец чистого кода, прошедший ревью и покрытый тестами. Казалось бы, всё идеально. Но производительность не такая, на какую рассчитывали. Вы проверили всё, что знали. А что, если проблема в том, о чём вы могли не знать? Всё может упираться в выравнивание данных в памяти. Для многих этот механизм так и остаётся загадкой. </p><p>Предлагаю вам вместе попробовать разобраться в такой непростой теме <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1339/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">в этой статье</a>.</p> <a href="https://habr.com/ru/posts/990658/?utm_campaign=990658&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 29 Jan 2026 13:20:36 GMT</pubDate>
    <dc:creator><![CDATA[MeLiza_Beth (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[alignment]]></category><category><![CDATA[padding]]></category><category><![CDATA[c++]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @feeelin — Блог компании PVS-Studio (+4) — 26.01.2026 12:02]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/988992/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/988992/?utm_campaign=988992&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Что нового появилось в PVS-Studio в 2025 году</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/5b4/935/4ab/5b49354ab15ac5b7b4109709f6125dc7.png" width="1600" height="902"></figure><p>Новый 2026 год уже вовсю идёт, и мы решили оглянуться назад и вспомнить, что интересного появилось в PVS-Studio за богатый на изменения 2025 год:</p><ul><li><p>десятки новых диагностических правил, включая проверки, ориентированные на безопасность;</p></li><li><p>обновления интеграций в популярные IDE, CI/CD-системы, ASOC и сборочные системы;</p></li><li><p>улучшения анализа;</p></li><li><p>расширенная поддержка стандартов.</p></li></ul><p>Всё это и многое другое описано <a href="https://pvs-studio.ru/ru/blog/posts/1336/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore" rel="noopener noreferrer nofollow">в новой статье</a> в нашем блоге.</p> <a href="https://habr.com/ru/posts/988992/?utm_campaign=988992&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 26 Jan 2026 09:02:08 GMT</pubDate>
    <dc:creator><![CDATA[feeelin (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[PVS-Studio]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[C++]]></category><category><![CDATA[C#]]></category><category><![CDATA[Java]]></category><category><![CDATA[Security]]></category><category><![CDATA[SAST]]></category><category><![CDATA[Безопасность]]></category><category><![CDATA[РБПО]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @viordash — Текстовые редакторы и IDE (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/988414/</guid>
    <link>https://habr.com/ru/posts/988414/?utm_campaign=988414&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Надоело искать парные вкладки (.h/.cpp) в VS Code? Я <em>навайбкодил </em>расширение, которое их магнитит.  </strong></p><p>Привет! Меня всегда немного раздражала одна мелочь в VS Code.</p><p>Открываешь&nbsp;Source.cpp, хочешь посмотреть заголовок, а&nbsp;Source.h&nbsp;открыт где-то в конце списка вкладок или вообще затерялся среди десятка других файлов. Приходится глазами искать его или тянуться к дереву проекта.</p><p>Стандартные методы сортировки тут не помогают, поэтому я написал&nbsp;<strong>Tab Magnet</strong>.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/1e3/e94/ef7/1e3e94ef7ee5755fb2047b767e89fbd6.gif" alt="" title="" width="750" height="460"></figure><p><u>Как это работает</u><strong>:</strong><br>Вы просто кликаете на файл в Explorer-е. <strong>Tab Magnet </strong>проверяет, открыта ли его "пара" (например,&nbsp;.h&nbsp;для&nbsp;.c&nbsp;или&nbsp;.html&nbsp;для&nbsp;.component.ts), и если да -&nbsp;<strong>автоматически переносит её поближе</strong>, чтобы они стояли бок о бок.</p><p><u>Функционал</u><strong>:</strong></p><ul><li><p>Знает, что заголовки лучше держать справа, а тесты — рядом с кодом.</p></li><li><p>Поддерживает из коробки C/C++, C#, Web (JS/TS/HTML/CSS) и Angular.</p></li><li><p>Можно настроить свои правила (например, для Go тестов или специфичных структур папок).</p></li></ul><p>vscode marketplace: <a href="https://marketplace.visualstudio.com/items?itemName=viordash.tab-magnet" rel="noopener noreferrer nofollow">Tab Magnet</a></p><p>GitHub: <a href="https://github.com/viordash/tab-magnet" rel="noopener noreferrer nofollow">tab-magnet</a></p> <a href="https://habr.com/ru/posts/988414/?utm_campaign=988414&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 23 Jan 2026 18:57:11 GMT</pubDate>
    <dc:creator><![CDATA[viordash]]></dc:creator>
      
      <category><![CDATA[vscode]]></category><category><![CDATA[opensource]]></category><category><![CDATA[productivity]]></category><category><![CDATA[cpp]]></category><category><![CDATA[extensions]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tntnkn — Блог компании PVS-Studio (+1) — 19.01.2026 15:29]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/986644/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/986644/?utm_campaign=986644&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Я подумал, что было бы интересно сделать дотошное исследование кода, который обеспечивает функционирование исключений в С++, и написать статью об этом. Разные платформы могут реализовывать исключения по-разному, поэтому показалось логичным сконцентрироваться на мире Linux.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/90f/29a/8d4/90f29a8d4436efb17c00124b0ef3a34e.png" width="974" height="549"></figure><p>Хотя в интернете и так много материалов по исключениям, у меня сложилось впечатление, что они либо слишком кренят в сторону технических описаний, либо описывают самостоятельную имплементацию. Я попытался сделать именно что человеческое описание подкапотной работы исключений.</p><p>Всё рассмотрение строится на конкретном примере. Где возможно, опираюсь на библиотеку <code>libcxx</code> от LLVM, а в остальных случаях — на <code>libstdc++</code> от GCC.</p><p>Саму статью можно прочитать по <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1333/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore" rel="noopener noreferrer nofollow">этой ссылке</a>. Если у вас появились какие-то мысли или пожелания в результате прочтения, буду очень рад увидеть вас в комментариях!</p><p>&nbsp;</p> <a href="https://habr.com/ru/posts/986644/?utm_campaign=986644&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 19 Jan 2026 12:29:57 GMT</pubDate>
    <dc:creator><![CDATA[tntnkn (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[exception]]></category><category><![CDATA[exception handling]]></category><category><![CDATA[linux]]></category><category><![CDATA[gcc]]></category><category><![CDATA[clang]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Andrey2008 — Блог компании PVS-Studio (+3) — 15.01.2026 14:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/985518/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/985518/?utm_campaign=985518&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Мы иногда во внутреннем чате обмениваемся фрагментами кода с неочевидными ошибками, которые обнаруживаются с помощью PVS-Studio в каком-нибудь открытом проекте. Мол, кто быстро сообразит, что не так с кодом?</p><p>Вчера коллега поделился вот таким <a href="https://github.com/serenedb/serenedb/blob/249fcf21c327b8df19e1ab900b3a53dcd7229b3d/libs/app/options/parameters.h#L202" rel="noopener noreferrer nofollow">фрагментом</a> кода из проекта SereneDB:</p><pre><code class="cpp">template &lt;typename T&gt;
struct NumericParameter : public Parameter {
&nbsp; using ValueType = T;
&nbsp; ....
&nbsp; std::string name() const override {
&nbsp;&nbsp;&nbsp; if constexpr (std::is_same_v&lt;ValueType, int16_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "int16";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, uint16_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "uint16";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, int32_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "int32";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, uint32_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "uint32";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, int64_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "int64";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, uint64_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "uint64";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, size_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "size";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, double&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "double";
&nbsp;&nbsp;&nbsp; } else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static_assert("unsupported ValueType");
&nbsp;&nbsp;&nbsp; }
&nbsp; }
&nbsp; ....
};</code></pre><p>Признаюсь честно, я два раза прочитал этот фрагмент, но так и не увидел ошибку. И засчитал себе поражение. Раз так, думаю, это достойно публикации в канал, чтобы и вы могли испытать свою внимательность :)</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/123/8a8/c29/1238a8c2905e2a9b9e34046cfd58d52c.png" alt="Попробуйте найти сами" title="Попробуйте найти сами" width="580" height="500"><div><figcaption>Попробуйте найти сами</figcaption></div></figure><p><strong>Ответ:</strong></p><p>Анализатор PVS-Studio выдаёт предупреждение <a href="https://pvs-studio.ru/ru/docs/warnings/v591/" rel="noopener noreferrer nofollow">V591</a> Non-void function should return a value. parameters.h 222</p><p>На первый взгляд предупреждение странное и смахивает на ложное срабатывание, ведь не может быть, что функция закончила работу, не вернув значение с помощью оператора <code>return</code>. Если выбирается ветка <code>else</code>, то там <code>static_assert</code>, и код просто не должен скомпилироваться. Во всех остальных случаях есть <code>return "что-то";</code>.</p><p>Но есть нюанс!</p><p>Ещё раз посмотрите на эту строчку:</p><pre><code class="cpp">static_assert("unsupported ValueType");</code></pre><p><a href="https://en.cppreference.com/w/cpp/language/static_assert.html" rel="noopener noreferrer nofollow"><code>static_assert</code></a> используется неправильно: пропущен <code>bool-constexpr</code>. Вернее, строковый литерал неявно конвертируется в значение <code>true</code>, и <code>static_assert</code> никогда не прервёт компиляцию. В итоге else-ветка функции ничего не возвращает, и её поведение будет не определено для всех специализаций <code>NumericParameter</code>, кроме указанных ранее в цепочке <code>if constexpr</code>.</p><p>Правильный вариант:</p><pre><code class="cpp">static_assert(false, "unsupported ValueType");</code></pre> <a href="https://habr.com/ru/posts/985518/?utm_campaign=985518&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 15 Jan 2026 11:54:55 GMT</pubDate>
    <dc:creator><![CDATA[Andrey2008 (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[ошибки программистов]]></category><category><![CDATA[ошибки в коде]]></category><category><![CDATA[баги]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[SereneDB]]></category><category><![CDATA[open source]]></category><category><![CDATA[assert]]></category><category><![CDATA[c++]]></category><category><![CDATA[си++]]></category><category><![CDATA[опечатки]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @YuriPanchul — Rust (+4) — 28.12.2025 20:31]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/981360/</guid>
    <link>https://habr.com/ru/posts/981360/?utm_campaign=981360&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Слышу уже от второго человека, что язык Rust не дает нормально работать с указателями в связанных списках, деревьях и графах (в моей вселенной ЯП без этого - это как свадьба без невесты). Взял ChatGPT, задал промпт: "write a code to insert a node into a doubly linked list in rust". Оно сгенерило нечто с кучей дополнительных слов, которых не было ни в Си, ни в Паскале 40 лет назад: borrow, as_ref, and_then, upgrade, map, downgrade, Some, clone, borrow_mut. Это все реально нужно или они там совсем озверели?</p> <a href="https://habr.com/ru/posts/981360/?utm_campaign=981360&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 28 Dec 2025 17:31:25 GMT</pubDate>
    <dc:creator><![CDATA[YuriPanchul]]></dc:creator>
      
      <category><![CDATA[Rust]]></category><category><![CDATA[C]]></category><category><![CDATA[C++]]></category><category><![CDATA[Pascal]]></category><category><![CDATA[Linked list]]></category><category><![CDATA[pointers]]></category><category><![CDATA[указатели]]></category><category><![CDATA[списки]]></category><category><![CDATA[memory leaks]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Информационная безопасность (+4) — 27.12.2025 08:05]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/981072/</guid>
    <link>https://habr.com/ru/posts/981072/?utm_campaign=981072&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Состоялся первый мажорный <a href="https://github.com/ProfessorNavigator/stirlitz/releases" rel="noopener noreferrer nofollow">релиз</a> открытого проекта для&nbsp;шифрования текста и файлов Stirlitz. Программа написана на&nbsp;языке С++ и <a href="https://github.com/ProfessorNavigator/stirlitz/" rel="noopener noreferrer nofollow">распространяется</a> под&nbsp;лицензией GPLv3. Приложение адаптировано для&nbsp;работы в&nbsp;операционных системах семейства Linux, Windows и Android. Для&nbsp;пользователей Arch Linux в&nbsp;AUR <a href="https://aur.archlinux.org/packages/stirlitz" rel="noopener noreferrer nofollow">доступен</a> сценарий сборки пакета. Для&nbsp;пользователей Windows <a href="https://github.com/ProfessorNavigator/stirlitz/releases/download/v1.0/StirlitzWindowsInataller.zip" rel="noopener noreferrer nofollow">доступен</a> экспериментальный инсталлятор. Для&nbsp;пользователей Android <a href="https://github.com/ProfessorNavigator/stirlitz/releases/download/v1.0/android-build-Stirlitz-release-unsigned.apk" rel="noopener noreferrer nofollow">доступен</a> экспериментальный пакет в&nbsp;формате apk. </p><p>Основные возможности Stirlitz 1.0: </p><ul><li><p>Шифрование текста и файлов для&nbsp;передачи через любые каналы публичной связи (мессенджеры, e‑mail сообщения и тому подобное). Шифрование осуществляется на&nbsp;базе публичных ключей (алгоритм Ed25519) и алгоритма шифрования AES256. </p></li><li><p>Шифрование файлов для&nbsp;локального хранения. Шифрование осуществляется через задание имени пользователя и пароля с&nbsp;использованием алгоритма AES256. </p></li><li><p>Создание шифрованных профилей для&nbsp;хранения ключей, используемых для&nbsp;обмена сообщениями через публичные каналы связи. </p></li><li><p>Создание одноразовых профилей: ключи хранятся в&nbsp;защищённой памяти, выделяемой с&nbsp;помощью библиотеки <a href="https://www.gnupg.org/documentation/manuals/gcrypt/" rel="noopener noreferrer nofollow">libgcrypt</a>, и уничтожаются после выхода из&nbsp;профиля или&nbsp;закрытия программы. </p></li><li><p>Криптографические функции вынесены в&nbsp;отдельную библиотеку stirlitz, которая может&nbsp;быть собрана и использоваться полностью независимо. </p></li><li><p>Для&nbsp;библиотеки stirlitz доступна документация в&nbsp;формате html. </p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c90/568/644/c90568644dde9985c08638e86323ccf8.png" alt="" title="" width="576" height="699"></figure> <a href="https://habr.com/ru/posts/981072/?utm_campaign=981072&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 27 Dec 2025 05:05:14 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Stirlitz]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @myoffice_ru — Блог компании МойОфис (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ncloudtech/posts/980426/</guid>
    <link>https://habr.com/ru/companies/ncloudtech/posts/980426/?utm_campaign=980426&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Звёзды разработки и практикующие инженеры разбирают горячие темы — от FAIL до GOD. Встречайте tech-шоу «АйТир Лист» от МойОфис.</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/08c/b87/047/08cb870477a7db0cbae736a4a31d7ea6.png" width="1920" height="1080"></figure><p>В нашем шоу мы берём одну область в разработке, выбираем самые обсуждаемые технологии, практики и подходы — и раскладываем их по шкале от <strong>FAIL</strong> до <strong>GOD</strong>.<br>Формат простой: эксперты защищают свои позиции, спорят, соглашаются и не соглашаются. 14 табличек, 14 поводов для споров и честный экспертный рейтинг без попытки всем понравиться.</p><p><strong><a href="https://www.youtube.com/watch?v=u2roRMypx-M" rel="noopener noreferrer nofollow">Первый выпуск</a> — опенсорс для фронтенда</strong></p><p>Дебютный эпизод мы посвятили популярным опенсорс-решениям для фронтенда: от инструментов, которые давно пора отпускать, до стандартов индустрии.</p><p>В выпуске:</p><ul><li><p><strong>Александр Коротаев</strong> — эксперт по фронтенду и креативному кодингу</p></li></ul><ul><li><p><strong>Алексей Золотых</strong> — тимлид команды веб-редакторов <strong>МойОфис</strong></p></li></ul><ul><li><p>Ведущий — <strong>Эдгар Акопян</strong></p></li></ul><p>Обсуждаем инструменты, которые формируют повседневную фронтенд-разработку, и честно отвечаем на вопрос: что сегодня выглядит как GOD-tier, а что застряло на уровне MVP или FAIL.</p><p><strong>Смотрите выпуск:</strong> <a href="https://www.youtube.com/watch?v=u2roRMypx-M" rel="noopener noreferrer nofollow">YouTube</a> | <a href="https://rutube.ru/video/40caec8287d648b539fd22f609bed040/" rel="noopener noreferrer nofollow">RuTube</a> | <a href="https://vk.com/myofficeru?z=video-98070369_456239609%2Fvideos-98070369%2Fpl_-98070369_-2" rel="noopener noreferrer nofollow">VK</a></p><p><strong><a href="https://youtu.be/TW3zsx-onuM" rel="noopener noreferrer nofollow">Второй выпуск</a> — фичи и идиомы C++</strong></p><p>Во втором эпизоде «АйТир Листа» — уже не инструменты, а язык.<br>Мы устроили полноценную битву мнений вокруг фич и идиом C++: 14 табличек превращаются в 14 поводов для дебатов, где каждая возможность языка проходит через экспертную оценку.</p><p>В выпуске:</p><ul><li><p><strong>Данил Черепанов</strong> — архитектор редакторов <strong>МойОфис</strong></p></li></ul><ul><li><p><strong>Антон Полухин</strong> — эксперт-разработчик C++ техплатформы городских сервисов <strong>Яндекс</strong></p></li></ul><ul><li><p>Ведущий — <strong>Эдгар Акопян</strong></p></li></ul><p>Получилось много споров, неожиданных аргументов и ситуаций, где «привычно» не значит «хорошо».</p><p><strong>Смотрите и делитесь мнением:</strong> <a href="https://youtu.be/TW3zsx-onuM" rel="noopener noreferrer nofollow">YouTube</a> | <a href="https://rutube.ru/video/private/99943f363660abe6d5975c02fb352d0e/?p=AuLO7EIfMHT59wEK7EkeNw" rel="noopener noreferrer nofollow">RuTube</a> | <a href="https://vkvideo.ru/video-98070369_456239612" rel="noopener noreferrer nofollow">VK</a></p><p>В следующих выпусках продолжим разбирать технологии без скидок на хайп и «так исторически сложилось». Предлагайте темы, а если готовы к жарким спорам – становитесь участниками нашего шоу) А как стать? Пишите в комменты с какой темой бы хотели поспорить!</p><p><br></p> <a href="https://habr.com/ru/posts/980426/?utm_campaign=980426&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 25 Dec 2025 09:35:23 GMT</pubDate>
    <dc:creator><![CDATA[myoffice_ru (МойОфис)]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[open source]]></category><category><![CDATA[javascript]]></category><category><![CDATA[typescript]]></category><category><![CDATA[идиомы программирования]]></category><category><![CDATA[идиомы с++]]></category><category><![CDATA[фичи c++]]></category><category><![CDATA[фичи]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+1) — 17.12.2025 09:48]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/977568/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/977568/?utm_campaign=977568&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Попробуй найти ошибку! Ответ пиши в комментариях! </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/22d/51d/3f4/22d51d3f438d894e3f2accb8ba4b8736.jpg" width="1080" height="1080"></figure><p>Ошибка из проекта <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1183/?utm_source=habr&amp;utm_medium=pvsteam_post&amp;utm_campaign=article&amp;utm_content=1183" rel="noopener noreferrer nofollow">DPDK</a> </p> <a href="https://habr.com/ru/posts/977568/?utm_campaign=977568&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 17 Dec 2025 06:48:25 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[ошибка в коде]]></category><category><![CDATA[поиск ошибок]]></category><category><![CDATA[cpp]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
