2014-09-22 27 views
2

我的代码是这样的:GCC没有警告路过常数时为size_t *参数

#define ZERO_CONSTANT 0 
foo(size_t * p_size); 

foo(ZERO_CONSTANT); //Doesn't warn 

哪个GCC标志将拨打电话foo(ZERO_CONSTANT)警告?

+3

不幸的是,你被允许将'0'传递给'NULL',所以我不认为你可以对此做很多事情。 – 2014-09-22 15:11:50

+0

正如Paul所说[0是一个指针文字](http://stackoverflow.com/q/24212792/1708801)。 – 2014-09-22 15:16:18

+0

我的第一个问题是,你为什么认为这应该被警告?你会试图抓住什么错误?当你的函数被任何'0'调用时,你是否想要被警告? – 2014-09-22 15:26:51

回答

5

没有编译标志可能可以帮助你在这里。 C标准定义了文字0以代表任何类型的空指针值。通常你会看到0,NULL(void*)0

(注意清楚,这确实意味着存储器地址是0。因为它是未定义的行为一般分配的积分值到任何指针类型,0被用作占位符文字为空指针)。

+0

“不可能”位不是真的。编译器可以完全自由地警告任何事情,包括100%符合法律标准的事情(通常是这样)。 – 2014-09-22 15:29:38

+0

@ n.m。没错,但我想我会保留我的主张。我正在考虑在我的“未定义行为鼻子恶魔”编译器中允许编译标志。 – Bathsheba 2014-09-22 15:33:50

3

有一个新的选项(自[可能] GCC 4.7.x后可用) - -Wzero-as-null-pointer-constant。它符合你的期望,但只对C++有效......在C中,你提供的代码是完全合法的,因为NULL通常只是“0”。

+0

'stddef.h'头文件的很多实现都将'NULL'定义为'(void *)0',C标准(ISO 9899:2011)允许'(void *)0'和'0'。 – fuz 2014-09-22 17:01:27

1

如前所述,通过0作为指针是完全有效的。

#define ZERO_CONSTANT ((int)0) 

这就产生铿锵一个警告:但如果你愿意改变ZERO_CONSTANT的定义可以生成一些编译器警告

warning: expression which evaluates to zero treated as a null pointer constant of type 'size_t *' (aka 'unsigned long *') [-Wnon-literal-null-conversion] 
expanded from macro 'ZERO_CONSTANT' 
#define ZERO_CONSTANT ((int)0) 

不幸的是,它看起来像GCC(4.8)在这种情况下仍然不会生成警告,即使是-Wextra,虽然可能还有另外一个-W开关可能启用此功能。

+0

无法在gcc中启用-Wnon-literal-null-conversion标志,也无法在Google上找到关于它的任何内容。你能提供参考吗? – 2014-09-22 15:32:03

+0

对不起 - 这是一个警告警告 - 我没有检查gcc,只是假设它会有类似的东西。我会更新答案。 – 2014-09-22 16:15:59

相关问题