# 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` относится к библиотеке альтернативных функций из Приложения К.

Данная диагностика классифицируется как:

MISRA-C-2023-1.4