V2645. MISRA. The language features specified in Annex K should not be used.
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для C.
Стандарт языка C (C11) содержит Приложение K – "Bounds-checking interfaces" которое описывает библиотеку альтернативных функций (пункт K.3) для более безопасного и надёжного программирования.
Например, функция strcpy не выполняет проверку границ буфера, что может привести к переполнению. В качестве безопасной альтернативы предоставляется strcpy_s, которая проверяет буфер и может вернуть индикатор ошибки, если размера буфера недостаточно.
Использование таких функций без определения макроса __STDC_WANT_LIB_EXT1__ не будет ошибкой, так как они являются частью стандарта. То есть эти функции не относятся к Приложению K, поэтому их использование допускается.
Если макрос __STDC_WANT_LIB_EXT1__ определён, то функции используются как расширение из Приложения K.
Использование этих расширенных функций может привести к непредсказуемым результатам, так как для некоторых из них стандарт не определяет поведение, оставляя его на усмотрение разработчиков стандартной библиотеки.
Согласно MISRA, функции, определения и макросы из Приложения K не могут быть использованы, если макрос __STDC_WANT_LIB_EXT1__ раскрывается в 1.
Рассмотрим пример:
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
void foo ()
{
const char* src = "Hello";
char dst[30];
int res = strcpy_s(dst, sizeof(dst), src);
}
Функция strcpy_s используется для безопасного копирования строки src в буфер dst с проверкой границ, чтобы предотвратить его переполнение. В приведённом примере анализатор выдаст срабатывание, так как обнаружит, что макрос __STDC_WANT_LIB_EXT1__ определён, поэтому функция strcpy_s относится к библиотеке альтернативных функций из Приложения К.
Данная диагностика классифицируется как:
|