【发布时间】:2015-05-19 09:17:09
【问题描述】:
C99 在函数参数中添加了static(只在函数定义中有意义,在声明中没有意义):
void func( int a[static 10] )
{
if ( a == NULL )
{ /* this branch can be optimized out */ }
printf("%d", a[-1]); /* causes UB */
}
但是,它的含义在 C11 6.7.6.3/7 中定义为 语义,而不是 约束,这意味着如果函数调用不正确。事实上,编译器不得中止编译,除非它能够证明UB是在所有分支中引起的。例如:
int main()
{
func(NULL); // UB
int b[9];
func(b); // UB
}
为什么标准没有将此作为约束(因此需要诊断)?
第二个问题:为什么static 在原型 (6.7.6.3/13) 中被忽略,而不是作为函数签名的一部分?允许原型包含它但函数体不包含它似乎具有误导性,反之亦然。
【问题讨论】:
-
int *p = create_array(); func(p);你如何诊断这个? -
对于 q2,数组声明符中的
static不是存储类说明符,因此 6.7.6.3/13 不适用。参照。 6.7.6.3/2 - “唯一应该出现在参数声明中的存储类说明符是register。” -
@TC 重新。 q2:好的,这是否意味着它在原型中实际上很重要?
标签: c arrays language-lawyer c99