没有强制转换的整数指针

时间:2013-01-30 17:56:30

标签: c pointers gcc casting c99

当我调用一个需要指针的函数时,我传入一个值,我收到了这个警告,我喜欢这个。

但是当值恰好是字面值'0'时,我没有得到警告。我认为这是因为C认为它是空指针,而不是值。有没有办法继续得到0字面的警告,因为我已经有了一些错误。

5 个答案:

答案 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