exponenta event banner

MISRA C:2012 Правило 21.17

Использование функции обработки строк из <string.h> не должно приводить к доступу за пределы объектов, на которые ссылаются их параметры указателя

Описание

Определение правила

Использование функции обработки строк из <string.h> не должно приводить к доступу за пределы объектов, на которые ссылаются их параметры указателя.

Это правило основано на MISRA C ®: 2012 Поправка 1.

Объяснение

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

развернуть все

#include <stdio.h>
#include<string.h>

char string[] = "Short";
void f1(const char* str)
{
    (void) strcpy(string, "Too long to fit");      /* Non-compliant */
    if (strlen(str) < (sizeof(string) - 1u)) {
        (void) strcpy(string, str);      /* Compliant */
    }
}

size_t f2(void)
{
    char text[ 5 ] = "Token";
    return strlen(text);    /* Non-compliant */
}

В этом примере:

  • Первое использование strcpy является несоответствующим, поскольку пытается выполнить запись за пределами конечного аргумента string.

  • Второе использование strcpy совместим, поскольку пытается записать в целевой аргумент string только если исходный аргумент str подходит.

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

Проверить информацию

Группа: Стандартные библиотеки
Категория: Обязательно
Категория СМЖЛ: обязательная
Представлен в R2017a