不应将数组作为函数的形式参数
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++ 代码中采用数组引用或模板的方式:
void foo(int (&a)[5]); // Compliant
template <size_t n>
void foo(int (&a)[n]) { // Compliant
....
}
这样数组大小不一致便无法通过编译。
例外:
int foo(int a[], int n); // Let it go
用空的方括号声明数组,并用另一个参数表示数组大小的情况可不受本规则限制。
相关
依据
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