# V2657. MISRA. Obsolescent language features should not be used.

Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Правило актуально только для языка C.

Правило требует избегать использования языковых конструкций, объявленных устаревшими в пунктах 6.11 и 7.33 стандартах языка C. Это связано с тем, что такие конструкции могут демонстрировать нежелательное поведение и обычно заменяются более безопасными и эффективными аналогами.

В следующей таблице приведён список устаревших возможностей, на которые срабатывает данное диагностическое правило:

N | Устаревшие возможности языка | Диагностическое правило | Стандарт языка
--- | --- | --- | ---
1 | Функция или объект, объявленный однажды с внутренним типом связывания, при повторном объявлении или определении будет также иметь внутреннее связывание. Поэтому следует явно указывать спецификатор `static` в каждом объявлении и определении. | V2608 | С99, C11, C18
2 | Спецификаторы классов хранения (`extern`, `static` и т.д.) указаны не в начале объявления и определения. | V2657 | С99, C11, C18
3 | Объявление функции с использованием пустых скобок. | V2601 | С99, C11, C18
4 | Использование объявлений функций в стиле K&R, а также неименованных параметров функций. | V2601 | С99, C11, C18
5 | Использование макроса `ATOMIC_VAR_INIT`, определённого в `stdatomic.h`. | V2657 | C18
6 | Переопределение макросов `bool`, `true` и `false`, определённых в `stdbool.h`. | V2573 | С99, C11, C18
7 | Использование функции `gets()`, определённой в `stdio.h`. | V2600 | С99
8 | Использование функции `ungetc()` в двоичном потоке, где идентификатор положения файла равен нулю. | V2600 | С99, C11, C18
9 | Использование функции `realloc()`, определённая в `stdlib.h` с аргументом `size`, равным нулю. | V2511 | C18

Таким образом, правило V2657 работает совместно с другими диагностическими правилами, указанными во втором столбце таблицы, обеспечивая комплексную проверку.

Рассмотрим два примера, которые покрываются этим правилом, но не покрываются другими.

Пример N1. Спецификатор указан не в начале объявлении переменной:

    int static var;

Исправленный пример:

    static int var;

Пример N2. Использование `ATOMIC_VAR_INIT`:

    atomic_int guide = ATOMIC_VAR_INIT(42);

Исправленный код:

    _Atomic int guide = 42;

Больше примеров можно посмотреть в соответствующих документациях к диагностикам в таблице.

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

MISRA-C-2023-1.5