通过头文件在GCC中禁用警告消息?
我在我的C代码中使用函数gets()
。 我的代码工作正常,但我得到一个警告消息通过头文件在GCC中禁用警告消息?
(.text+0xe6): warning: the `gets' function is dangerous and should not be used.
我想这个警告信息不弹出。有什么办法吗?
我想知道可能有这样的可能性通过创建一个头文件来禁用一些警告。或者在编译过程中有什么选择可以满足我的目的?或者可能有一种特殊的方式使用gets()
这个警告不会弹出?
显而易见的答案是要学习编译器试图告诉你什么 - 你永远不应该使用gets(),因为它是完全不安全的。改为使用fgets(),这样可以防止可能的缓冲区溢出。
#define BUFFER_SIZE 100
char buff[BUFFER_SIZE];
gets(buff); // unsafe!
fgets(buff, sizeof(buff), stdin); // safe
我会留意警告并更换gets
。这对我来说很清楚:
BUGS
不要使用gets()函数。因为不知道 中的数据会不知道get()将读取多少个字符,并且由于gets()将继续存储缓冲区末尾的 个字符,因此使用它非常危险。它有用于破坏计算机安全的 。使用fgets()代替。
用fgets()代替gets()函数
char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);
的获得()函数不检查缓冲区的长度,可以写过去的结束和改变栈。这是你所听到的“缓冲区溢出”。
确实没有理由使用gets()
。甚至连C标准都说它已经过时了!改为使用fgets()
。
[编辑]
它看起来像警告来自链接器。编译-c
时会发出警告吗? (其中禁用链接。)
如果你真的想使用它。
下面是回答:http://www.gamedev.net/community/forums/topic.asp?topic_id=523641
如果您使用的是比较新的gcc版本,你可以使用:
#pragma GCC diagnostic ignored "your option here"
例如,如果这些头产生“浮点比较不安全”错误,你可以使用:
#pragma GCC diagnostic ignored "-Wfloat-equal".
不幸,你不能禁用“-Wall”这样(这将是太容易了,不会吧......),你必须做个别战争选项哪些 - 手动启用(至少,冲突的)。
文档:http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas
编辑: 但它似乎不是被警告工作...我想在我的电脑。
与流行观点相反,并不是所有的程序员都对他们写的内容同样漠不关心。 gets()
将永远是C90的标准配置,并且因为几个很好的理由而被放入库中。如果使用得当,比如在程序示例,文档,单元测试脚手架,家庭作业等
更重要的是它比其他任何字符串函数没有更多的“危险”,gets()
增强可读性的方式,fgets()
永远不会。并且从来不必打断他人的思路去查找以什么顺序来陈述其论点。
以下解决方法使用我的其他收藏夹功能删除换行符。 :)
#define gets GET_LOST
#include "stdio.h"
#undef gets
#include "limits.h"
char *gets(char *s)
{
return strtok(fgets(s, INT_MAX, stdin), "\n");
}
建议替代品为gets()
。
在现有的代码,来代替gets()
,可能不期望使用fgets()
作为功能需要额外char
保存其中两个功能消耗'\n'
,但gets()
不保存。以下是不需要较大缓冲区大小的替代品。
每个gets(dest)
是替换:
如果dest
是一个数组,使用gets_sz(dest, sizeof dest)
如果dest
是一个指向char
数组大小n
的,使用gets_sz(dest, n)
char *gets_sz(char *dest, size_t size) {
if (size <= 1) {
if (size <= 0 || feof(stdin)) {
return NULL;
}
}
size--;
size_t i;
for (i = 0; i < size; i++) {
int ch = getchar();
if (ch == EOF) {
if (i == 0)
return NULL;
break;
}
if (ch == '\n')
break;
dest[i] = (char) ch;
}
dest[i] = 0;
return dest;
}
如果你真的想用它,请尝试标记-fsyntax-only
。
在gcc website手册上说:
-fsyntax-only
Check the code for syntax errors, but don't do anything beyond that.
感谢尼尔...与fgets工作正常。非常感谢。 – 2009-07-31 20:19:17
在现实生活中,您可能会想要使用sizeof buff而不是重复缓冲区大小。 – 2009-07-31 21:39:21
在现实生活中,您将需要通过常量(例如BUFFSIZE)调整缓冲区的大小,并在fgets()调用中使用它。 – 2009-07-31 21:42:37