Бестиарий программирования
1.13K subscribers
379 photos
5 videos
5 files
473 links
Наблюдения за жизнью ошибок в коде.
Андрей Карпов.

ГОСТ Р 71207-2024, ГОСТ Р 56939-2024, РБПО, Статический анализ кода

Канал-дублёр в MAX: https://max.ru/join/3VWTp9apkQvTMSRQ__LGiTQ5NGVBj8p_tOpwlQO6vS8
Download Telegram
Пометка в блокноте – Не забывать писать, сколько лет PVS-Studio на рынке

Услышал на Бизнес-Фест в докладе Игоря Манна мысль, что не стоит забывать упоминать в разных местах, как давно вы на рынке. Это автоматически добавляет пару очков доверия. И действительно! "PVS-Studio — более 18 лет на рынке РФ" звучит солидно!

В числах:

Компания ООО "ПВС" (ранее "СиПроВер", переименована в "ПВС" в 2020 году) зарегистрирована 21 марта 2008 года. В этом году отметили совершеннолетие – 18 лет!

Нашему продукту, который изначально назывался Viva64, тоже более 18 лет. Уже под названием PVS-Studio он был зарегистрирован 30 октября 2009 года.

P.S. Кто угадал отсылку на картинке? Великий герой — Коэн-варвар из книг о Плоском Мире.
5
PVS-Studio теперь в GitVerse🔥

Мы добавили готовые шаблоны для статического анализа в GitVerse Starter Workflow (российский аналог GitHub/GitLab от «СберТеха»).

Что это дает?
Больше не нужно писать пайплайны с нуля. Теперь внедрить автоматическую проверку кода в CI/CD можно за пару минут.

Как это работает:
- При настройке workflow в GitVerse выбираете шаблон PVS-Studio под свой язык: C++, C# или Java.
- В шаблоне уже прописаны базовые этапы сборки и анализа.
- Слегка адаптируете настройки под свой проект — и готово!

"Каждый шаблон уже включает основные этапы сборки и статического анализа. После небольшой адаптации под особенности конкретного проекта пайплайн готов к использованию и может быть встроен в процесс CI/CD", — отмечает Валерий Филатов, Developer Advocate PVS-Studio.


Отличный способ сэкономить время на настройке инфраструктуры и повысить надежность кода 👍

Для пользователей GitVerse сделали специальный промокод. Пользуйтесь PVS-Studio 30 дней без ограничений: https://pvs-studio.ru/gitverse

#PVS_Studio #GitVerse
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Запись вебинара "Практическая интеграция PVS-Studio и SourceCraft" 🔥

В том числе будет про то, как ИИ помогает работать с предупреждениями анализатора. Получилась интересно, рекомендую познакомится с записью.

Посмотреть можно тут:
- VK Video
- Rutube
- YouTube
- Наш сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Я сижу со взглядом на две тысячи ярдов после прочтения статьи "Манифест программиста, использующего AI-кодинг-агента". Как говорится, то ли смеяться, то ли плакать. Ну на смех в паре мест меня пробило.

К самой статье претензий нет: я потрясён тем, что вообще у кого-то возникла потребность в написании этого манифеста. Как быстро где-то в индустрии уровень разработки прошёл путь от обсуждения книг про написание качественного кода до режима "голова для того, чтобы туда кушать".

Я пока сомневаюсь, что настолько всё плохо. Надеюсь, автор преувеличивает и иронизирует. А если нет? О, мой Дейкстра!
Появился тикет. Программист копирует ссылку, передает ее AI-кодинг-агенту и через какое-то время получает готовый Pull Request.
...
Перед изменением кода программист должен воспроизвести баг, понять условия его появления и увидеть фактический результат.

Скажите, что я сплю. Если вайб-программист просто впихивает задачу, не воспроизводя баг, не разбираясь в сути и не проверяя результат правок... это вообще что?
Если программист не запустил продукт и не проверил результат, задача не закончена. Если программист просто передал тикет AI, а потом передал его код ревьюеру и тестировщику, он не выполнил свою работу. Он просто переложил ее на следующих людей.

База. Но ведь автор это всё написал зачем-то, а в комментариях всерьёз идёт обсуждение. Прошу прочитать эту статью, она небольшая. Интересно услышать ваши впечатления, мнения и комментарии. Хочется вынести из всего этого происходящего сюрреализма какие-то полезные выводы.
👍8😁1
Forwarded from СВД ВС
Современная разработка начинается с правильных инструментов.

Завершился курс «Инструментальные средства ЗОСРВ «Нейтрино».

Слушатели познакомились с инструментами разработки, отладки, анализа и верификации ПО для Нейтрино. Особое внимание было уделено работе с комплектом разработчика, его интеграции со статического анализатора PVS-Studio, системой сборки, а также инструментами анализа системных событий.

Это позволило участникам познакомиться с современными подходами к повышению качества и надёжности программного обеспечения.

Все участники успешно прошли тестирование и получили удостоверения о повышении квалификации.

Обучение продолжается. Следите за анонсами новых наборов и выбирайте курс, который поможет решить ваши профессиональные задачи.

#Курсы
👍41
Кажется я превратился в тролля. Но автор заслужил :)

Мой комментарий к статье "Операционная Система на C без знаний C".

Я так понимаю, речь идёт об этом проекте OS. Мдя. Ну что же, автору предстоит узнать ещё много о языке С. Например, что такое выход за границу буфера.
void terminal_write_hex(uint64_t hex_num) {
    uint64_t index_buffer = 0;
    char buffer[sizeof(uint64_t)];
    if (hex_num == 0x0) {
        terminal_write("0x0");
        return;
    }
    terminal_write("0x");
    while (hex_num > 0) {
        uint64_t digit = hex_num % 16;
        if (digit >= 10) {
            digit = digit - 10;
            buffer[index_buffer] = 'A'+digit;
        }else {
            buffer[index_buffer] = '0' + digit;
        }
        hex_num = hex_num / 16;
        index_buffer++;
    }

Какой милый баг. Посмотрите на размер буфера: не учитывается, что один байт превращается в два символа. Интересные времена "безопасного ПО" настают. Простите за едкость комментария, но не удержался, увидев проект автора:
Safe Life System

Наш проект — это платформа для обеспечения и сохранения безопасности информации в цифровой среде, а также для развития независимой IT-экосистемы.

Мы создаём комплекс программного обеспечения, ориентированный на защиту данных, открытость технологий и поддержку русскоязычного IT-сообщества.
🤣9🔥3😢1
kstrncmp
uint64_t kstrncmp(char *str1, char *str2, uint64_t len){
uint64_t index_str = 0;
uint64_t different_char = 0;
while (index_str < len) {
if (str1[index_str] != str2[index_str]) {
different_char++;
}
index_str++;
}
return different_char;
}
😭5👨‍💻1
Хорошая новость для разработчиков на Unreal Engine: мы сделали PVS-Studio доступнее, и теперь анализ UE-проектов в PVS-Studio доступен в лицензии Team, а не только в Enterprise. Подробности.

Если вы работаете с Unreal Engine и давно присматривались к PVS-Studio, то сейчас самое время попробовать анализатор на своём проекте. А если возникнут вопросы по интеграции или настройке, наша команда поддержки всегда поможет вам разобраться.
👍3
Ошибка, которую никто никогда не совершал. Ведь так, да?
Уже с первого курса университета — или даже раньше — вы могли догадаться, что писать arr[len(arr)] — плохая затея. И вряд ли так кто-то может ошибиться, правда? Мы тоже так думали, пока не проверили 1000 проектов.


Прогрев Go анализатора :)
🤓4🔥3
Статический анализатор — мощный, но не всегда простой инструмент.

Поэтому мы подготовили для вас курс "Статический анализатор PVS-Studio на практике"!

Что вас ждет:
- Вы узнаете возможности анализатора, актуальные требования ГОСТ и как устроено лицензирование PVS-Studio.
- Познакомитесь с локальной работой с PVS-Studio в плагине для IDE.
- Поймёте, как встроить PVS-Studio в рабочий процесс разработки и минимизировать ручную работу.
- Узнаете про использование PVS-Studio в роли SAST-инструмента для автоматического поиска ошибок и потенциальных уязвимостей в исходном коде.
- Разберётесь с системой мониторинга компиляции и разметкой предупреждений по стандартам MISRA на практике.

Подробнее о курсе по этой ссылке 🔗

P.s. курс абсолютно бесплатный 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7
В этот чудесный летний день мы предлагаем вам сделать коллаборацию! 🔥

А какие варианты взаимодействия есть и куда писать — можно узнать по ссылке 🔗

#PVS_Studio #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
Кто сразу видит ошибку в реализации паттерна double-checked locking в Java коде? :)
public class KubernetesDevUIProcessor {
static volatile List<Manifest> manifests;
public List<Manifest> getManifests() throws BootstrapException {
if (manifests == null) {
synchronized (Holder.class) {
if (manifests == null) {
manifests = new ArrayList<>();
....
try (CuratedApplication bootstrap = quarkusBootstrap.bootstrap()) {
....
for (var entry : context.entrySet()) {
manifests.add(
new Manifest(entry.getKey(),
new String(entry.getValue()))
);
}
}
}
}
}
return manifests;
}
}

Заглядывайте в публикацию, мы и других багов принесли - Проверяем Quarkus 🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Когда ИИ платят за строки кода :)
static int ksys_read(int fd, char *buf, u32 len) {
u32 i;
char c;
int pid = (int)ring3_current_pid;
int slot;

if (fd != 0 || !buf) {
if (fd != 0 || !buf) {
if (fd == 0) {
return ERR_FAULT;
}
}
}
....
}


Проверка эквивалентна
if (!buf && fd == 0)
return ERR_FAULT;

и выглядит подозрительно. Но мне сейчас лень изучать код дальше. Просто поделился тем, что улыбнуло :)
😁12
OWASP выпустил новую версию Top 10 for LLM Applications 2026.

1. Prompt Injection
2. Sensitive Information Disclosure
3. Excessive Agency
4. Supply Chain
5. Data and Model Poisoning
6. Unbounded Consumption
7. Misinformation
8. Hidden Context Exposure
9. Vector and Embedding Weaknesses
10. Improper Output Handling

Как и другие гайды проекта, этот список формировался силами сообщества. Участники предлагали новые категории и варианты переименования, после чего голосовали за значимость рисков. Подробнее о кандидатах релиза я писал пару месяцев назад. Как можно заметить, изменений немного: все знакомые категории остались в списке. Новые сценарии атак решили распределить между существующими рисками, чтобы не дробить классификацию.

Excessive Agency поднялся на третье место, а в приложении появился подробный маппинг этого риска на OWASP Top 10 for Agentic Applications. Unbounded Consumption тоже переместили выше, на шестое место, на фоне распространения reasoning-моделей, длинных контекстов и роста вычислительных затрат. Наконец, убрали противоречивый System Prompt Leakage. Его переименовали в Hidden Context Exposure, расширив риск до раскрытия developer instructions, tool schemas, правил доступа и другой внутренней логики приложения.

В гайде есть большой appendix с маппингами на другие фреймворки и интересная диаграмма движения атаки от внешнего контура к последствиям. На входе находятся три основных вектора: Prompt Injection, Supply Chain и Data and Model Poisoning. Дальше атака может усиливаться за счет раскрытия скрытого контекста или избыточных полномочий агента. В центре схемы находятся три основных последствия: утечка чувствительной информации, распространение недостоверной информации и неконтролируемое потребление ресурсов.
👍2
О механизмах запуска PVS-Studio при работе с embedded-проектами на C и C++.
🔥4
Элегантность кода благодаря C++23

Продолжим разбирать приёмы рефакторинга и посмотрим, как std::ranges::views::enumerate помогает сделать код более элегантным.

В заметке я рассматривал рефакторинг и оптимизацию кода за счёт объединения циклов. В итоге я остановился на следующем варианте кода:
static TensorImpl make_contiguous_tensor(const std::vector<int64_t>& sizes)
{
  auto q = sizes.size();
  std::vector<int64_t> strides(q);
  int64_t acc = 1;
  int64_t ne = 1;
  for (auto sz : std::ranges::views::reverse(sizes))
  {
    strides[--q] = acc;
    acc *= (sz == 0 ? 1 : sz);
    ne *= sz;
  }
  //....
}

Его недостаток в том, что всё равно необходимо использовать переменную q для работы с контейнером strides. Как можно написать ещё лаконичнее, я не сообразил, но такой способ есть!

После публикации мне подсказали про enumerate. Эта штука появилась в C++23, и я как-то её пропустил. Сложно уследить за всеми нововведениями C++.

С помощью enumerate можно сразу перебирать и элементы, и их индексы:
constexpr static auto v = {'A', 'B', 'C', 'D'};
for (auto const [index, letter] : std::views::enumerate(v))
    std::cout << '(' << index << ':' << letter << ") ";

Будет напечатано: (0:A) (1:B) (2:C) (3:D).

Но нам нужен обратный порядок, и такой вариант не подходит:
for (auto const [i, sz] :
  std::views::enumerate(
    std::ranges::views::reverse(sizes)))

Этот цикл будет перебирать элементы с конца, а индексы — по возрастанию от 0. Можно сделать, чтобы значения i также шли в обратном порядке? Можно. Это делается с помощью std::views::enumerate(sizes) | std::views::reverse.

В итоге можно сократить код ещё на одну строчку:
static TensorImpl make_contiguous_tensor(const std::vector<int64_t>& sizes)
{
  std::vector<int64_t> strides(sizes.size());
  int64_t acc = 1;
  int64_t ne = 1;
  for (auto const [i, sz] : std::views::enumerate(sizes) | std::views::reverse)
  {
    strides[i] = acc;
    acc *= (sz == 0 ? 1 : sz);
    ne *= sz;
  }
  //....
}

Нельзя назвать это большим достижением, но зато на практике применили одну из новых возможностей C++23.

Что со скоростью кода? Замер показал, что в рамках погрешности его скорость не изменилось. Т.е. этот вариант работает так же, как вариант №2 — "Мой вариант одним циклом" (см. замер скорости работы). Это не удивительно, так как по сути код идентичен предыдущему.
👍6
У нас еще одна крутая новость! Мы запускаем новый цикл вебинаров "Надёжность, качество, безопасность ПО: методология и инструменты" ⚡️

В предыдущем цикле вебинаров "Вокруг РБПО" мы рассмотрели 25 процессов из ГОСТ Р 56939—2024, направленных на создание безопасных программных решений. Теперь поговорим не только о безопасности, но и в целом о создании качественного и надёжного ПО.

Вместе с экспертами из разных компаний мы поговорим про развитие DevSecOps практик, подходы к написанию качественного кода, вопросы регуляторики, ИИ, функциональную безопасность встраиваемого ПО, а также про инструменты композиционного, статического, динамического анализа.

Первый вебинар "Методы защиты и обеспечения безопасности ПО" пройдет 12 августа в 15:00 🗓

- Александра Уварова (Developer Advocate, PVS-Studio) в своем докладе "Автоматизация процессов обеспечения безопасности" расскажет, как одновременно с ускорением разработки и поставки программного обеспечения должна развиваться безопасность. В рамках вебинара рассмотрим методы эффективной интеграции SAST-инструмента в DevSecOps-пайплайн, чтобы выявлять уязвимости на ранних этапах, снижать риски и повышать эффективность безопасной разработки.

- Дьяков Алексей (Эксперт по монетизации и защите ПО, Guardant) в своем докладе "Защита ПО: от анализа угроз до выбора стратегии" расскажет, почему защита ПО — необходимость, а не опция. Рассмотрим модели угроз, способы защиты и оценим, что компания может сделать самостоятельно. Главное — честно сравним, когда выгоднее строить свое решение, а когда покупать готовое.

Регистрация доступна по ссылке 🔗

📲Мы в MAX
#вебинар
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7