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

This diagnostic rule is based on the [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) software development guidelines\.

This diagnostic rule is relevant only for C\.

The diagnostic rule requires avoiding the use of language constructs declared obsolete in Sections [6\.11](https://open-std.org/JTC1/SC22/WG14/www/docs/n3220.pdf#page=203) and [7\.33](https://open-std.org/JTC1/SC22/WG14/www/docs/n3220.pdf#page=470) of the C language standards because such designs may result in unintended behavior and are usually replaced by safer and more effective alternatives\.

The following table lists the obsolete features for which the diagnostic rule is issued:

|N|Obsolete language features|Diagnostic rule|Language standard|
|---|---|---|---|
|1|A function or object declared once with an internal linkage type also have an internal linkage when redeclared or redefined\\\. Therefore, the \`static\` specifier should be explicitly specified in each declaration and definition\\\.|\[V2608\]\(https://pvs\-studio\.com/en/docs/warnings/v2608/\)|C99, C11, C18|
|2|Storage\\\-class specifiers \\\(\`extern\`, \`static\`, etc\\\.\\\) are not placed at the beginning of the declaration and definition\\\.|V2657|C99, C11, C18|
|3|Declaring a function using empty parentheses\\\.|\[V2601\]\(https://pvs\-studio\.com/en/docs/warnings/v2601/\)|C99, C11, C18|
|4|Using K&R\\\-style function declarations and unnamed function parameters\\\.|\[V2601\]\(https://pvs\-studio\.com/en/docs/warnings/v2601/\)|C99, C11, C18|
|5|Using the \`ATOMIC\_VAR\_INIT\` macro defined in \`stdatomic\.h\`\\\.|V2657|C18|
|6|Overriding the \`bool\`, \`true\`, and \`false\` macros defined in \`stdbool\.h\`\\\.|\[V2573\]\(https://pvs\-studio\.com/en/docs/warnings/v2573/\)|C99, C11, C18|
|7|Using the \`gets\(\)\` function defined in \`stdio\.h\`\\\.|\[V2600\]\(https://pvs\-studio\.com/en/docs/warnings/v2600/\)|C99|
|8|Using the \`ungetc\(\)\` function on a binary stream where the file position identifier is zero\\\.|\[V2600\]\(https://pvs\-studio\.com/en/docs/warnings/v2600/\)|C99, C11, C18|
|9|Using the \`realloc\(\)\` function defined in \`stdlib\.h\` with the \`size\` argument equal to zero\\\.|\[V2511\]\(https://pvs\-studio\.com/en/docs/warnings/v2511/\)|C18|

The V2657 diagnostic rule operates in conjunction with diagnostic rules listed in the second column of the table to provide comprehensive analysis\.

Look at two examples that are covered by this rule but not covered by others\.

**Example N1\.** The specifier is not placed at the beginning of the variable declaration:

```cpp
int static var;
```

The fixed code:

```cpp
static int var;
```

**Example N2\.** Using `ATOMIC_VAR_INIT`:

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

The fixed code:

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

More examples can be found in the documentation for the corresponding diagnostic rules listed in the table\.