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

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

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

Правило требует избегать использования языковых конструкций, объявленных устаревшими в пунктах [6\.11](https://open-std.org/JTC1/SC22/WG14/www/docs/n3220.pdf#page=203) и [7\.33](https://open-std.org/JTC1/SC22/WG14/www/docs/n3220.pdf#page=470) стандартах языка C\. Это связано с тем, что такие конструкции могут демонстрировать нежелательное поведение и обычно заменяются более безопасными и эффективными аналогами\.

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

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

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

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

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

```cpp
int static var;
```

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

```cpp
static int var;
```

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

```cpp
atomic_int guide = ATOMIC_VAR_INIT(42);
```

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

```cpp
_Atomic int guide = 42;
```

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