我想知道__attribute__((nonnull))
是标准C还是特定于编译器。如果它是特定于编译器的那么,是否有任何替代方法可以与标准C相同。
这里我试图阻止静态分析器可能的空指针取消引用警告。但我不想让我的代码编译器依赖。
答案 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个元素:
将参数声明为''''''应调整为 ''限定指向类型'',其中类型限定符(如果有)是 在数组类型派生的[和]内指定的那些。如果 关键字static也出现在数组类型的[和]中 派生,然后对每个函数的调用,值的 相应的实际参数应提供对第一个的访问权限 数组的元素,其元素至少与指定的元素一样多 大小表达。
但是,如果编译器能够看到承诺被破坏,则生成警告是明智的。
答案 1 :(得分:1)
__attribute__(...)
从来都不是标准C。
没有C标准定义__attribute__
甚至不存在。