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

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

Канал-дублёр в MAX: https://max.ru/join/3VWTp9apkQvTMSRQ__LGiTQ5NGVBj8p_tOpwlQO6vS8
Download Telegram
Создал канал-дублёр в MAX: Бестиарий программирования
😐11🤨4👍3🤯3😢2
Ещё на тему разбухшего vibe-кода. Смотрю проект Vib-OS. Потом про него статья будет. Это очень маленький проект, если убрать сторонние сущности и различные ресурсы, хранящиеся в виде массивов в коде. По делу там около 35 тысяч строк кода в 110 файлах.

Так вот, на эти 110 файлов я насчитал как минимум 4 одинаковые функции копирования строк.
static void str_copy(char *dst, const char *src, int max) {
int i = 0;
while (src[i] && i < max - 1) {
dst[i] = src[i];
i++;
}
dst[i] = '\0';
}

static void str_cpy(char *dst, const char *src, int max) {
int i = 0;
while (src[i] && i < max - 1) {
dst[i] = src[i];
i++;
}
dst[i] = '\0';
}

static void strcpy_safe(char *dst, const char *src, size_t max) {
size_t i = 0;
while (src[i] && i < max - 1) {
dst[i] = src[i];
i++;
}
dst[i] = '\0';
}

static inline char *strncpy_safe(char *dst, const char *src, size_t n) {
size_t i;
for (i = 0; i < n - 1 && src[i]; i++) {
dst[i] = src[i];
}
dst[i] = '\0';
return dst;
}

Видимо у ИИ который это делал, любимый напев – I Like to Move It, Move It :) Частое (местами совершенно бестолковое) копирование массивов. Причём реализованное циклами, а не через memcpy.
😁13
В комментариях к предыдущему посту написали, что memcpy не проверяет завершающий ноль, поэтому плохо подходит для копирования строк. Это так, но я имел в виду, что в рассматриваемом проекте вообще очень много копирования данных "вручную", не являющихся строками. Постоянно встречается код вида:
uint8_t *src = buf + offset_in_block;
uint8_t *dst = (uint8_t *)inode;
for (size_t i = 0; i < sizeof(struct ext4_inode); i++) {
dst[i] = src[i];
}

uint8_t *src = sb_buf;
uint8_t *dst = (uint8_t *)&fs->sb;
for (size_t i = 0; i < sizeof(struct ext4_superblock); i++) {
dst[i] = src[i];
}

uint8_t *src = (uint8_t *)ptr;
uint8_t *dst = (uint8_t *)new_ptr;
for (size_t i = 0; i < old_size; i++) {
dst[i] = src[i];
}

Все эти четверостишия могут быть заменены на один вызов memcpy.
👍5
Ещё пример. Функция bt_set_local_name просто перекладывает строку в буфер размером 248 байт и передаёт её в hci_send_cmd.
int bt_set_local_name(const char *name)
{
uint8_t params[248] = {0};
int len = 0;

while (name[len] && len < 247) {
params[len] = name[len];
len++;
}

return hci_send_cmd(HCI_OP_WRITE_LOCAL_NAME, params, 248);
}

Посмотрим, что происходит со строкой дальше:
static int hci_send_cmd(uint16_t opcode, void *params, uint8_t plen)
{
uint8_t buf[256];

buf[0] = HCI_COMMAND_PKT;

struct hci_command_hdr *hdr = (struct hci_command_hdr *)&buf[1];
hdr->opcode = opcode;
hdr->plen = plen;

if (plen > 0 && params) {
for (int i = 0; i < plen; i++) {
buf[4 + i] = ((uint8_t *)params)[i];
}
}

/* TODO: Send via USB bulk endpoint */
printk(KERN_DEBUG "BT: Send cmd opcode=0x%04x len=%d\n", opcode, plen);

return 0;
}

Формируется новый буфер из специального заголовка и переданной строки. Дальше этот буфер пока не используется, но суть не в этом. Непонятно, зачем вообще был нужен промежуточный буфер в bt_set_local_name. Код можно сократить, попутно ускорив его, убрав одно копирование.
😁3
Механизмы в SAST-решениях для выявления дефектов из OWASP Top Ten

На вебинаре вместе с Лукой Сафоновым, лидером российского отделения консорциума OWASP, разобрали OWASP Top Ten. Поговорили о том, почему так важно проверять исходный код на наличие потенциальных уязвимостей и как с этой задачей помогают справляться SAST-инструменты. А также рассмотрели механизмы, которые позволяют выявлять потенциальные уязвимости и дефекты безопасности.

P.S. В процессе презентации речь зашла о Евгении Кокуйкине. Вот его TG канал - Евгений Кокуйкин - Raft, где он пишет про OWASP Top 10 for Agentic Applications, OWASP Top 10 for LLM Applications и т.д.
🔥5👍2👌1
Продолжаем изучать возможности статического анализатора в рамках серии вебинаров ❤️

В новой части:
- Запуск анализатора из командной строки (CLI).
- Использование PVS-Studio в Docker-контейнерах.
- Интеграция в процессы CI/CD.
- Обзор утилит Plog Converter и Blame Notifier.

🗓26 марта в 14:00

Регистрация по ссылке 🔗
Присоединяйтесь! Будет интересно!

P.s. если не сможете подключиться в этот день - не беда! Всем зарегистрировавшимся мы отправим запись

#вебинар #PVS_Studio
Please open Telegram to view this post
VIEW IN TELEGRAM
Друзья, мы обновили нашу книгу по ГОСТ Р 71207!

Теперь там рассматривается не только этот ГОСТ, а также ГОСТ Р 56939, приказ ФСТЭК №117.

Что полезного можно найти:
- требования к инструментам статического анализа;
- какие ошибки они должны находить;
- понятие критической ошибки;
- какие технологии должны реализовывать анализаторы;
- процесс регулярного использования;
- взаимосвязи c ГОСТ Р 56939—2024 и приказом ФСТЭК №117;
- испытания статических анализаторов в 2025 году;
и многое другое.

Получить книгу можно по этой ссылке 👈🏻

#гост #фстэк #PVS_Studio #книга
👍2
Смотрю ещё один вайб проект, про который потом напишу статью. Что-бы быть в ней максимально точным, прошу помочь читателей.

По мнению ИИ вот этот код с вложенным циклом является SIMD-friendly. Предполагается, что потенциально он может быть лучше оптимизирован, так как компилятор увидит, что обработка идёт цепочками по 8 байт и как-то воспользуется этим.

Моё мнение – это фигня какая-то. Моя нейросеть (интуиция) подсказывает, что этот код для компилятора ничем не лучше, чем его простейшая реализация с одним циклом:
bool IsSpanBlank_simple(const char* data, size_t len) {
for (size_t i = 0; i < len; ++i) {
unsigned char c = static_cast<unsigned char>(data[i]);
if (c != ' ' && c != '\t' && c != '\n' && c != '\r') {
return false;
}
}
return true;
}

Хочу убедиться в своей правоте. Мне кажется, нет компилятора и ключей оптимизации, при которых будет построен особенно эффективный код (например, с использованием SSE) для версии с вложенным циклом, но при этом тоже самое не будет сделано для короткой версии.

На своих замерах я пока вообще получаю, что "оптимизированная" версия с вложенным циклами работает медленнее, чем с 1 циклом. Есть более быстрые варианты, основанные на сдвигах и явных интристиках, но они сейчас не интересны. Речь именно на предложенную "оптимизацию" с вложенным циклом.

Призываю экспертов оптимизации. Кто прав, а кто нет?
3
Друзья, мы создали канал "PVS-Studio для бизнеса".

Что вы там найдете:

- как внедрение статического анализатора (SAST) сокращает технический долг и почему исправление ошибки на этапе написания кода в несколько раз дешевле, чем после релиза;
- как защитить свой продукт от уязвимостей и соответствовать стандартам;
- реальные истории компаний, которые внедрили PVS-Studio, и как это отразилось на качестве продукта.

Приглашаем подписаться!

А еще, на всякий случай, у нас появился канал в MAX.
❤‍🔥5
Главным направлением развития ИИ в 2026 году становится внедрение ИИ-агентов.

Главным направлением развития ИИ в 2026 году становится окончательная порча Хабра такими текстами 😩
😢4😁1
Решил поделиться парой картинок для класса героя, которого можно получить во вчерашнем квизе. Уж очень они хороши. Я думал, что у меня будет мультикласс, а получил варвара :)
🔥5💯21
Поучаствовал в подкасте от компании EvApps.
IT ToLк by EvApps. Андрей Карпов про чистый код без вредных советов.
Вариант на Яндекс Музыка: только звук.
Предстоящие вебинары

15 апреля 14:00. Тимлид: ожидания, реальность и внутренние вопросы. Регистрация.
Быть тимлидом — это не только про процессы и задачи, но и про людей, ожидания и собственные сомнения.

Инна Пристягина (руководитель отдела развития, PVS-Studio) разберёт, кто такой менеджер в IT и зачем он вообще нужен: как выстраивать взаимодействие с командой, какие стили управления работают и как не наломать дров на старте.

Ольга Ладошкина (коуч IT-руководителей и топ-команд, бизнес-тренер, основатель проекта «Лидерская кухня»; наставник в Яндекс Практикуме) поговорит о внутренней стороне лидерства: почему этот путь пугает, с какими ловушками сталкиваются новые лидеры и как не потерять себя. Разберёт реальные кейсы и простые инструменты, которые помогут справляться и с командой, и с собой.

Вебинар подойдёт тем, кто уже тимлид или только собирается им стать и хочет понять: «Это моё?»


15 апреля 16:00. Зачем тестировщику нужна безопасность? Регистрация.
Безопасная разработка из опции превращается в обязательное требование: стандарты (российские и международные) все сильнее влияют на процессы разработки и тестирования.

На вебинаре разберем, как тестировщику начать работать с безопасностью без узкой специализации в ИБ: какие базовые навыки нужны, как находить уязвимости на практике, что делать с найденными проблемами, как повысить свою ценность на рынке.

На вебинаре вас ждут два практических доклада от экспертов:

Безопасность для чаQAников (Семен Ремезов, Senior QA, АО "Гринатом")
Вы уже тестируете по ГОСТу (Глеб Асламов, Developer Advocate, PVS-Studio)


17 апреля 14:00. PVS-Studio в SAST: от стандартов безопасности к DevSecOps. Регистрация.
В этот раз рассмотрим использование PVS-Studio в роли SAST-инструмента для автоматического поиска ошибок и потенциальных уязвимостей в исходном коде. Покажем, какие типы проблем способен выявлять статический анализатор и как он помогает повысить качество и надёжность программного обеспечения.

Кратко разберём сценарии интеграции PVS-Studio в процесс разработки и CI/CD, а также практические преимущества его применения на ранних этапах жизненного цикла разработки.
🔥3