Моделирование, чтобы избежать ложного срабатывания leaked_storage - PullRequest
0 голосов
/ 06 мая 2020

Я изо всех сил пытаюсь разрешить ложное срабатывание leaked_storage. В этом примере

struct string
{
  size_t len;
  data [1];
};

const char *string_new(const char *s, size_t n)
{
  struct string *st;

  st = malloc(offsetof(struct string, data) + n + 1);
  st->len = n;
  memcpy(st->data, s, len);
  st->data[len] = 0;
  return st->data;
}

void string_free(const char *s)
{
  struct string *st = (struct string *)(s - offsetof(struct string, data));
  free(st);
}

Coverity Scan сообщит об утечке ресурсов

(RESOURCE_LEAK) 5. leaked_storage: переменная st, выходящая за пределы области видимости, приводит к утечке хранилища, на которое она указывает.

В этом примере это прямое указание на то, что утечки нет. Что я могу сделать, чтобы заглушить ложные срабатывания?

Обновление от 7 мая 2020 г.

Моделирование - неправильная техника. Coverity Scan разрешает аннотации для решения этой конкретной c ситуации. В нашем случае

const char *string_new(const char *s, size_t n)
{
  struct string *st;

  st = malloc(offsetof(struct string, data) + n + 1);
  st->len = n;
  memcpy(st->data, s, len);
  st->data[len] = 0;
  /* coverity[leaked_storage] */
  return st->data;
}

отключит ложное срабатывание предупреждения.

Всем спасибо.

1 Ответ

0 голосов
/ 07 мая 2020

Моделирование - неправильная техника. Coverity Scan разрешает аннотации для решения этой конкретной c ситуации. В нашем случае

const char *string_new(const char *s, size_t n)
{
  struct string *st;

  st = malloc(offsetof(struct string, data) + n + 1);
  st->len = n;
  memcpy(st->data, s, len);
  st->data[len] = 0;
  /* coverity[leaked_storage] */
  return st->data;
}

отключит ложное срабатывание предупреждения.

Всем спасибо.

...