c gcc编译器选项,用于指针算术警告

时间:2010-01-04 06:06:36

标签: c gcc compiler-construction

我使用以下标志,但仍然无法收到此警告: “算术中使用的'void *'类型的指针”

使用的标志: -O2 -Werror -Wall -Wno-main -Wno-format-zero-length -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -Wno-sign-compare -Wno -pointer-sign -Wno-attributes -fno-strict-aliasing

-Wpointer-arith应该捕获这种类型的警告,但是我无法得到这个警告。“算术中使用的'void *'类型的指针”

应该使用哪种特定的cflag来获取此警告?

=============================================== ===

我的错误,它是宏检查的一部分,没有定义。 :(通过定义该宏,我能够得到该错误。

2 个答案:

答案 0 :(得分:2)

在OS X上使用gcc 4.2.1,我收到此警告:

p.c:7: warning: wrong type argument to increment

以下程序:

#include <stdio.h>

int main(void)
{
    int i[] = { 42 };
    void *p = i;
    printf("%p\n", p++);
    return 0;
}

我正在将其编译为:

$ gcc -Wpointer-arith p.c

您可以发布您的程序,或发布上述编译结果吗?

答案 1 :(得分:2)

你是对的。 -Wpointer-arith应根据documentation向您发出警告。

我刚试过以下程序(故意错误):

~/code/samples$ cat foo.c
#include <stdio.h>
int main (int argc, char **argv)
{
  void * bar;
  void * foo;
  foo = bar + 1;
  return 0;
}

我只使用-Wpointer-arith选项以及上面列出的所有选项编译了程序。两次尝试都引发了预期的警告。我使用的是gcc版本4.3.4(Debian 4.3.4-6)。:

~/code/samples$ gcc -Wpointer-arith foo.c
foo.c: In function ‘main’:
foo.c:6: warning: pointer of type ‘void *’ used in arithmetic

~/code/samples$ gcc -O2 -Werror -Wall -Wno-main -Wno-format-zero-length -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -Wno-sign-compare -Wno-pointer-sign -Wno-attributes -fno-strict-aliasing foo.c
cc1: warnings being treated as errors
foo.c: In function ‘main’:
foo.c:6: error: pointer of type ‘void *’ used in arithmetic

如果你给它'正确'的代码,编译器会抛出警告。所以,我建议你检查 为什么 你期望这个警告。也许您正在编译的代码已经改变了?

我可以给你一个可能的线索:上面代码中的foo = bar + 1;会触发警告。但是foo = bar ++;不会(你得到一个不同的警告)。因此,如果您的代码在指针上使用递增(或递减)运算符,则可能不会触发警告。

我知道这不是直接的答案,但我希望这可以帮助您集中精力进行调查。