MISRA C:2012 Rule 21.17

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

Описание

Управляйте определением

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

Объяснение

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

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

#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 не имеет никакого пустого терминатора строки.

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

Группа: Стандартные библиотеки
Категория: обязательный
Категория AGC: обязательный
Введенный в R2017a