声明数组参数的大小时禁用 static 关键字
6.5.8 ID_forbidStaticArrSize
C 语言规定数组作为形式参数时,可用 static 关键字限定大小,要求对应的实际参数必须是数组第一个元素的地址,且数组的大小不能小于 static 关键字限定的值,否则会导致标准未定义的行为,这种特性有助于编译器优化代码,但也增加了误用风险。
并非所有处理器都可以利用这种特性提高效率,而且应在效率和风险之间合理取舍,不建议在有高可靠性要求的代码中使用这种特性。
示例:
int foo(int a[static 5], int n) { // Non-compliant
int i;
int s = 0;
for (i = 0; i < n; i++) {
s += a[i];
}
return s;
}
int main() {
int a[3] = {1, 2, 3};
return foo(a, 3); // Undefined behavior
}
例中 foo 函数要求传入的数组至少有 5 个元素,但实际传入的数组只有 3 个元素,导致未定义的行为。
依据
ISO/IEC 9899:1999 6.7.5.3(7)
ISO/IEC 9899:2011 6.7.6.3(7)
参考
MISRA C 2012 17.6