我使用以下标志,但仍然无法收到此警告: “算术中使用的'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来获取此警告?
=============================================== ===
答案 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 ++;
不会(你得到一个不同的警告)。因此,如果您的代码在指针上使用递增(或递减)运算符,则可能不会触发警告。
我知道这不是直接的答案,但我希望这可以帮助您集中精力进行调查。