AUTOSAR C++14 Rule A18-1-1
C-style arrays shall not be used
Description
Rule Definition
C-style arrays shall not be used.
Rationale
A C-style array is an array that is not wrapped in a class such as
std::array
when the array is declared. You can lose information about
the size of a C-style array. For instance, an array that you pass to a function decays to a
pointer to the first element of the array. This can lead to unsafe and difficult to maintain
code.
The AUTOSAR standard allows declarations of static constexpr
data
members of a C-style array type. For example, this declaration is compliant.
class A { public: static constexpr std::uint8_t array[] {0, 1, 2}; // Compliant by exception };
Polyspace Implementation
The rule checker does not flag C-style array arguments in function declarations because
the rule violation still exists if you fix the function declaration and not the definition.
A function might be declared in your code and defined in a library that you cannot access.
The checker flags C-style array arguments in function definitions. For instance, in this
code snippet, the checker flags the argument of foo
but not the argument
of bar
.
extern void bar(char arg[]); //Declaration, checker raises no rule violation int foo(char arg[]) // Definition, checker raises a rule violation { return sizeof(arg); //Returns size of pointer, not size of array } void baz() { char value[10]; //C-style array, checker raises a rule violation assert(sizeof(value) == foo(value)); }
arg
in the definition of
foo
even when there is no explicit C-style array definition for the
argument. For example, declaring char* value;
instead of char
value[10];
in baz()
would still result in a rule violation on
the argument of foo
.Troubleshooting
If you expect a rule violation but Polyspace® does not report it, see Diagnose Why Coding Standard Violations Do Not Appear as Expected.
Examples
Check Information
Group: 18 Language Support Library |
Category: Required, Automated |
Version History
Introduced in R2019b