MISRA C:2012 Rule 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 вычисляет длину строки до null terminator. Область символьного массива text не имеет нулевого терминатора строки.

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

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