__attribute __((nonnull))是标准C

时间:2017-07-21 12:01:07

标签: c compiler-errors

我想知道__attribute__((nonnull))是标准C还是特定于编译器。如果它是特定于编译器的那么,是否有任何替代方法可以与标准C相同。

这里我试图阻止静态分析器可能的空指针取消引用警告。但我不想让我的代码编译器依赖。

2 个答案:

答案 0 :(得分:4)

它是特定于编译器的。 C11 standard中的任何地方都没有提及属性和 nonnull

在C11中,您可以使用type ParameterName[static 1]语法,但只有 clang zapcc (来自 gcc < = 7.1和 clang > = 3.1, zapcc icc )如果您使用它传递NULL参数,则会生成警告。 (不幸的是,它不能与 void 指针一起使用)。

__attribute__((__nonnull__)) /*nonstandard*/
void pass_nonnull0(char *X)
{
}

void pass_nonnull1(char X[static 1]) /*standard*/
{ /*the "static 1" means the pointed-to "array" must have at least 1 element*/
}

int main()
{
    pass_nonnull0(0); /* both clang & gcc warn with nonnull attributes */
    pass_nonnull1(0); /* only clang and zapcc warn with type ArgName [static 1] */
}

D[ static type-qualifier-listopt assignment-expression ]语法的语义并不能确保警告。语法仅表示对编译器的承诺,即指向的对象将至少具有N个元素:

6.7.6.3p7

  

将参数声明为''''''应调整为   ''限定指向类型'',其中类型限定符(如果有)是   在数组类型派生的[和]内指定的那些。如果   关键字static也出现在数组类型的[和]中   派生,然后对每个函数的调用,值的   相应的实际参数应提供对第一个的访问权限   数组的元素,其元素至少与指定的元素一样多   大小表达。

但是,如果编译器能够看到承诺被破坏,则生成警告是明智的。

答案 1 :(得分:1)

__attribute__(...)从来都不是标准C。
没有C标准定义__attribute__甚至不存在。