TGViewer
Бестиарий программирования Бестиарий программирования @programming_tales · 1.13K subscribers
Post #734 325
Пример, как идеология педантичности стандарта MISRA C защищает от ошибок

В C литерал 0 можно присваивать как численным типам, так и указателю (вместо NULL). Правило MISRA C 2012/2023 11.9, которое говорит, что нужно использовать именно NULL, может казаться избыточным. Например, здесь:
typedef struct  FT_Outline_
{
    short n_contours;        /* number of contours in glyph        */
    short n_points;          /* number of points in the glyph      */
 
    FT_Vector*  points;      /* the outline's points               */
    char*       tags;        /* the points flags                   */
    short*      contours;    /* the contour end points             */
 
    int flags;               /* outline masks                      */
} FT_Outline;
....
static const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 };

V2648 Use NULL macro instead of literal zero for pointers.

Если заменить некоторые 0 на NULL никому лучше не станет.
static const FT_Outline null_outline = { 0, 0, NULL, NULL, NULL, 0 };

Правило, кажется, просто украшательством стиля написания кода. Лишнее ограничение при написании кода... Какой практический прок? Давайте посмотрим, как такое предупреждение помогает выявить реальную ошибку.
typedef char FAR * FAR * png_charpp;
....
png_size_t
png_check_keyword(...., png_charpp new_key)
{
  ....
  if (key_len > 79)
  {
     png_warning(....);
     new_key[79] = '\0'; // <= V2648
     key_len = 79;
  }
  ....
}

Обратите внимание на тип переменной new_key – это указатель на указатель. Из-за опечатки, терминальный ноль обнуляет указатель, а не записывается в строку. Правильный вариант кода:
(*new_key)[79] = '\0';

Благодаря осмотрительной педантичности найдена реальная ошибка.

На самом деле, PVS-Studio и раньше эту ошибку находил с помощью другой диагностики – V527 It is odd that the '\0' value is assigned to 'char' type pointer. Но здесь именно хотелось продемонстрировать, как работают и помогают MISRA правила. Вообще ситуация, что один и тот-же баг выявляется разными детекторами, вполне частая ситуация и удивляться этому не стоит.
 
Почему я про MISRA вспомнил?

Во-первых, мои коллеги сейчас занимаются подготовкой квалификационного пакета PVS-Studio согласно ГОСТ Р МЭК 61508 и ГОСТ Р ИСО 26262 по поддержке MISRA C:2012 и MISRA C:2023.

Во-вторых, 23 сентября я буду с докладом "Анализатор PVS-Studio как средство достижения целей верификации ГОСТ Р ИСО 26262-6" на форуме "Безопасность транспортных средств". Приглашаю посетить мероприятие и мой доклад.
  • 👏 5
More from @programming_tales
  1. Sep 29, 2026Сегодня коллега демонстрирует, как визуально проявляют себя баги в Java коде: Нашёл ошибки…
  2. Sep 29, 2026photo post
  3. Sep 28, 2026На днях выступал с докладом на форуме "Безопасность транспортных средств", организованном…
  4. Sep 28, 2026photo post
  5. Sep 28, 2026Кажется, я ментально синхронизировался с миром РБПО. Сегодня на РБПО.рф опубликовали карту…
  6. Sep 22, 2026"Лаборатория Касперского" разрабатывает микроядерную операционную систему KasperskyOS в со…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →