6

使用gcc5.2.0,我注意到这段代码不会产生警告:

#include <stddef.h>

int function(void)
{
    return NULL;
}

void procedure(void)
{
    return NULL;
}

我使用了标志-Wall -Wextra -std=c99 -pedantic并且正在运行archlinux。我不确定为什么这段代码可以正常工作gcc,特别是因为clang3.7.0 确实会生成警告。

我还尝试过使用gcc4.9 或 4.7 等旧版本,它们都会生成警告。

警告是:

warning: return makes integer from pointer without a cast

warning: ‘return’ with a value, in function returning void

我应该提到我尝试在 Debian 上编译 gcc 5.2,结果是一样的。所以archlinux似乎不是问题。

理由是什么?我似乎在其他任何地方都找不到与此相关的任何东西。

谢谢!

4

3 回答 3

3

这似乎是 gcc 5.2.0 中的回归——据我所知,这是一个奇怪的回归。

使用 gcc 4.4.5 和 4.8.4,程序(在添加 required 之后#include <stddef.h>)会在两个语句上产生警告return NULL;,即使没有任何额外的命令行选项。

使用 gcc 5.2.0,即使使用gcc -c -Wall -Wextra -std=c99 -pedantic. 对于从void函数返回值的第二个,必须进行诊断。

现在这是奇怪的部分。

$ gcc --version | head -n 1
gcc (GCC) 5.2.0
$ cat c.c
#include <stddef.h>

int function(void) {
#ifdef USE_NULL
   return NULL;
#else
    return ((void*)0);
#endif
}

void procedure(void) {
#ifdef USE_NULL
   return NULL;
#else
    return ((void*)0);
#endif
}
$ gcc -c c.c
c.c: In function ‘function’:
c.c:7:12: warning: return makes integer from pointer without a cast [-Wint-conversion]
     return ((void*)0);
            ^
c.c: In function ‘procedure’:
c.c:15:12: warning: ‘return’ with a value, in function returning void
     return ((void*)0);
            ^
$ gcc -c -DUSE_NULL c.c
$ 

USE_NULL定义时,不会产生警告。编译gcc -E -DUSE_NULL(将预处理器的输出打印到标准输出)确认NULL定义为((void*)0). 但是当我用 替换NULL((void*)0),会产生警告(应该如此)。

我不知道发生了什么事。扩展宏NULL后,它应该与 没有区别((void*)0),但是编译器的行为会根据使用的宏而改变。

于 2015-09-23T19:45:58.893 回答
1

第一个函数的有效性取决于如何NULL定义。NULL如果定义为,第一个函数没有问题0。但是如果它恰好被定义为(void *) 0(在 C 代码中通常是这种情况),那么第一个函数将变得无效。GCC 通常对隐式指针到整数的转换非常宽容。

第二个功能完全无效。语言规范明确规定“带有表达式的返回语句不得出现在返回类型为 void 的函数中”。如果它编译,它一定是 GCC 对某事过于宽容的另一个例子。

-pedantic如果您希望其诊断输出与标准 C 语言相关,则需要在模式下运行 GCC 。在默认模式下,它不是一个可靠的 C 编译器(至少在其诊断输出方面),而且它“不发出警告”这一事实绝对没有任何意义。

-std=然而,在我的实验中,即使使用和-pedantic开关,我也无法让 GCC 抱怨第二个功能。它看起来像编译器中的错误。

于 2015-09-23T06:22:39.433 回答
1

我在这里填写了一个错误报告:https ://gcc.gnu.org/bugzilla/show_bug.cgi?id=67730

它已被确认并已修复为 5.3 似乎!

谢谢你的帮助。

于 2015-09-30T18:21:41.750 回答