通过头文件在GCC中禁用警告消息?
我在我的C代码中使用函数gets()
。 我的代码工作正常,但我收到一条警告信息
(.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
如果你真的想要使用它。
这里是答案来自: 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
。 这对我来说足够清楚了:
BUGS
永远不要使用gets()。 因为如果事先不知道数据就不可能分辨出get()会读取多少个字符,并且因为gets()将继续存储超过缓冲区末尾的字符,所以使用它是非常危险的。 它已被用来打破计算机安全。 请改用fgets()。
使用fgets()而不是gets()
char buffer[BUFSIZ]; /* gets(buffer); */ fgets(buffer,sizeof(buffer), stdin);
gets()函数不检查缓冲区的长度,可以写入结束并更改堆栈。 这是你听到的“缓冲区溢出”。
没有充分的理由使用gets()
。 即使是C标准也说它已经过时了! 请改用fgets()
。
[编辑]
看起来警告来自链接器。 用-c
编译时会收到警告吗? (这会禁用链接。)
你根本不应该使用gets
函数,manpage说使用fgets
代替。
GCC不提供GCC使用编译指示禁用警告的function。 您必须使用各种警告选项作为编译器的标志。
建议安全替代gets()
。
在现有代码中,要替换gets()
,可能不希望使用fgets()
因为该函数需要额外的char
来保存两个函数消耗的'\n'
,但gets()
不保存。 以下是不需要更大缓冲区大小的替代品。
每个gets(dest)
替换为:
如果dest
是一个数组,请使用gets_sz(dest, sizeof dest)
如果dest
是指向大小为n
的char
数组的指针,请使用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网站上的手册说:
-fsyntax-only
Check the code for syntax errors, but don't do anything beyond that.
与流行的观点相反,并非所有程序员都对他们所写的内容同样不注意。 gets()
将始终是C90中的标准,并且它被放入库中有几个很好的理由。 在适当使用时,它不会比任何其他字符串函数更“危险”,例如在程序示例,文档,unit testing脚手架,家庭作业等中。
更重要的是, 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"); }