Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам

Вебинар: Парсим С++ - 25.10

>
>
>
Межмодульный анализ

Межмодульный анализ

05 Сен 2024

Продвинутые статические анализаторы учитывают данные, которые передаются между процедурами/функциями, чтобы выявить большее количество ошибок и дефектов безопасности. Это важно при выявлении таких ошибок, как выход за границу буфера, утечка конфиденциальных данных (анализ помеченных данных), разыменование нулевых указателей и т.д. Связано это с тем, что создание некого ресурса, его использование и освобождение часто разнесены по разным функциям.

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

Рассмотрим пример ошибки, найденной с помощью межмодульного анализа инструментом PVS-Studio в коде проекта Midnight Commander (язык C).

Начнём с функции widget_destroy в файле widget-common.c:

void widget_destroy (Widget * w)
{
  send_message (w, NULL, MSG_DESTROY, 0, NULL);
  g_free (w);
}

Для нас важно, что функция освобождает буфер памяти, адрес которого она получает через аргумент w.

Теперь посмотрим на код в файле editcmd.c:

gboolean edit_close_cmd (WEdit * edit)
{
  Widget *w = WIDGET (edit);
  ....
  widget_destroy (w);     // <= Здесь освободили память
  if (....) .... else
  {
    edit = find_editor (DIALOG (g));
    if (edit != NULL)
      widget_select (w);  // <= Сейчас заглянем внутрь
  }
}

Обратите внимание, что в начале адрес структуры Widget передаётся в функцию widget_destroy, где происходит освобождение буфера памяти. Далее этот указатель передаётся в функцию widget_select, приведённую ниже:

void widget_select (Widget * w)
{
  WGroup *g;
  if (!widget_get_options (w, WOP_SELECTABLE))
    return;
  ....
}

Она просто передаёт указатель дальше в функцию widget_get_options:

static inline gboolean
widget_get_options (const Widget * w, widget_options_t options)
{
  return ((w->options & options) == options);
}

Здесь мы добрались до места, где возникает неопределённое поведение, связанное с использованием данных в уже освобождённом буфере памяти. Анализатор PVS-Studio сигнализирует об этом предупреждением:

V774 The 'w' pointer was used after the memory was released.

Это относительно простой случай, где было задействованы только два файла: widget-common.c и editcmd.c. Ошибки могут быть выявлены и в более длинных цепочках вызова процедур, расположенных в трёх и более файлах. Однако на практике у статических анализаторов есть ограничения на глубину анализа вызовов. Они связаны как с теоретическими сложностями (проблема остановки), так и практическими (большая вычислительная сложность). Поэтому статический анализ кода полезно дополнять динамическим.

ГОСТ Р 71207-2024 — Статический анализ программного обеспечения. В разделе терминов дано следующее определение межмодульного анализа:

Статический анализ, при котором выполняется совместный анализ программы или нескольких программ, состоящих из нескольких программных модулей, и выявляемые свойства программы затрагивают процедуры или переменные из различных модулей.

Дополнительные ссылки

Популярные статьи по теме


Комментарии (0)

Следующие комментарии next comments
close comment form