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

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

Описание

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

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

Объяснение

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

Обменивайтесь сообщениями в отчете

Использование функции обработки строки от <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: обязательный
Язык: C90, C99

Введенный в R2017a