☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

不应将数组作为函数的形式参数

6.5.2 ID_invalidParamArraySize
目录 › next › previous

被声明为数组的形式参数等同于指针,第一个维度的大小声明对传入的实际参数起不到限制作用。

示例:

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++ 代码中不建议使用这种方式。

相关

ID_inconsistentArraySize ID_forbidCArray ID_sizeof_arrayParameter

依据

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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.