# V518. The 'malloc' function allocates suspicious amount of memory calculated by 'strlen(expr)'. Perhaps the correct expression is strlen(expr) + 1.

Анализатор обнаружил потенциально возможную ошибку, связанную с выделением недостаточного количества памяти. В коде подсчитывается длина строки и выделяется буфер памяти данного размера, но не учитывается наличие терминального '\0'.

Рассмотрим пример:

    char *p = (char *)malloc(strlen(src));
    strcpy(p, src);

В данном случае просто забыто про +1. Правильный код:

    char *p = (char *)malloc(strlen(src) + 1);
    strcpy(p, src);

Приведем другой пример некорректного кода, обнаруженный анализатором в одном из приложений:

    if((t=(char *)realloc(next->name, strlen(name+1))))
    {
      next->name=t;
      strcpy(next->name,name);
    }

Здесь по невнимательности неправильно поставлена правая скобочка ')'. В результате мы выделим на 2 байта меньше памяти, чем необходимо. Исправленный вариант:

    if((t=(char *)realloc(next->name, strlen(name)+1)))

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти).

Данная диагностика классифицируется как:

CWE-131 CERT-STR31-C

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V518.