不应将数组作为函数的形式参数
6.5.2 ID_invalidParamArraySize
被声明为数组的形式参数等同于指针,第一个维度的大小声明对传入的实际参数起不到限制作用。
示例:
int foo(int a[5]); // Non-compliant, same as ‘foo(int* a)’
int bar(int a[5][10]); // Non-compliant, same as ‘bar(int (*a)[10])’
int main() {
int a[3] = {};
return foo(a); // It can be compiled
}
例中 foo 函数声明的数组参数有 5 个元素,传入的实际参数只有 3 个元素,往往意味着错误,但可以通过编译。
在 C++ 代码中可以采用数组引用或模板的方式,建议使用 std::array 代替 C 数组:
void foo(int(&a)[5]); // Compliant
template <size_t n>
void foo(int(&a)[n]); // Compliant
void foo(array<int, 5>& a); // Good
这样数组大小不一致便无法通过编译。
例外:
int foo(int a[], int n); // Let it go
用空的方括号声明数组,并用另一个参数表示数组大小的情况可不受本规则限制,但在 C++ 代码中不建议使用这种方式。
相关
依据
ISO/IEC 9899:1999 6.7.5.3(7)
ISO/IEC 9899:2011 6.7.6.3(7)
ISO/IEC 14882:2003 13.1(3)
ISO/IEC 14882:2011 13.1(3)
参考
C++ Core Guidelines I.13
C++ Core Guidelines R.14
MISRA C++ 2008 5-2-12