当我调用一个需要指针的函数时,我传入一个值,我收到了这个警告,我喜欢这个。
但是当值恰好是字面值'0'时,我没有得到警告。我认为这是因为C认为它是空指针,而不是值。有没有办法继续得到0字面的警告,因为我已经有了一些错误。
答案 0 :(得分:5)
GCC支持nonnull
attribute on function parameters可以执行您想要的操作(只要启用了-Wnonnull
警告选项):
void* foo( int* cannot_be_null) __attribute((nonnull (1))) ;
int main(int argc, char *argv[])
{
int x;
foo(&x);
foo(0); // line 13 - generates a -Wnonnull warning
return 0;
}
使用gcc -c -Wnonnull test.c
编译时,我得到:
test.c: In function 'main':
test.c:13:5: warning: null argument where non-null required (argument 1) [-Wnonnull]
您可以使用-Werror=nonnull
强制执行此操作。
请注意,仅当使用空指针文字(0
的另一个名称)时才会抛出此警告 - 以下代码不会触发警告:
int* p = NULL;
foo(p);
答案 1 :(得分:1)
遗憾的是,没有使用原始C编译器。你应该尝试使用lint工具作为夹板,这可能对你有所帮助(不过我不确定)。
答案 2 :(得分:0)
有没有办法继续获得0-literals的警告
我不知道一个,无论如何你不想要那个。分配给指针时,常量数值0被隐式视为NULL
,而不将其转换为指针类型。
答案 3 :(得分:0)
我认为转换为null可能对编译器来说是相当固有的 - 然而,应该很容易静态地检查这些情况,因为它们是相当独特的。
如果您希望传递null而不是(int)0,请使用显式NULL枚举或定义,然后匹配模式YourFunction(0); (允许空格)绝对无效。如果你想要低技术,Grep可以很容易地使用。 Fabien建议,各种lint工具都可以做到这一点。
我总是试着记住编码时,如果可以的话,让错误的东西看起来尽可能错误,这样你就可以更容易地发现它们。
答案 4 :(得分:0)
这个问题类似于问题。 Should I use symbolic names like TRUE and FALSE for Boolean constants, or plain 1 and 0?
C程序员必须明白NULL和0在指针上下文中是可互换的,并且uncast 0是完全可以接受的。任何使用NULL(而不是0)都应该被认为是一个涉及指针的温和提示;程序员不应该依赖它(无论是为了他们自己的理解还是编译器)来区分指针0和整数0。
只有在指针上下文中,NULL和0才是等价的。当需要另一种类型0时,不应该使用NULL,即使它可能有效,因为这样做会发送错误的样式消息。 (此外,ANSI允许NULL的定义为((void *)0),这在非指针上下文中根本不起作用。)特别是,当需要ASCII空字符(NUL)时,不要使用NULL。提供您自己的定义
#define NUL '\0'
如果必须的话。
此信息来自此link