﻿# V2645\. MISRA\. The language features specified in Annex K should not be used\.

Диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Это правило актуально только для C\.

Стандарт языка C \(C11\) содержит [Приложение K](https://open-std.org/JTC1/SC22/WG14/www/docs/n3301.pdf#page=655) – "Bounds\-checking interfaces" которое описывает библиотеку альтернативных функций \([пункт K\.3](https://open-std.org/JTC1/SC22/WG14/www/docs/n3301.pdf#page=655)\) для более безопасного и надёжного программирования\.

Например, функция `strcpy` не выполняет проверку границ буфера, что может привести к переполнению\. В качестве безопасной альтернативы предоставляется `strcpy_s`, которая проверяет буфер и может вернуть индикатор ошибки, если размера буфера недостаточно\.

Использование таких функций без определения макроса `__STDC_WANT_LIB_EXT1__` не будет ошибкой, так как они являются частью стандарта\. То есть эти функции не относятся к Приложению K, поэтому их использование допускается\.

Если макрос `__STDC_WANT_LIB_EXT1__` определён, то функции используются как расширение из Приложения K\.

Использование этих расширенных функций может привести к непредсказуемым результатам, так как для некоторых из них стандарт не определяет поведение, оставляя его на усмотрение разработчиков стандартной библиотеки\.

Согласно MISRA, функции, определения и макросы из Приложения K не могут быть использованы, если макрос `__STDC_WANT_LIB_EXT1__` раскрывается в `1`\.

Рассмотрим пример:

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