我使用的功能gets()
在我的C代码。 我的代码工作正常,但我收到一条警告消息
(.text+0xe6): warning: the `gets' function is dangerous and should not be used.
我希望此警告消息不弹出。 有什么办法?
我想知道,有可能通过创建禁用一些警告头文件是这样的可能性。 或者是有编制,可以为我的目的,在任何选项? 或者可能是有使用的一种特殊的方式gets()
此警告不弹出?
我使用的功能gets()
在我的C代码。 我的代码工作正常,但我收到一条警告消息
(.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”这样(这将是太容易了,不会吧......),你必须做个别警告选项-Wall它能够通过手(至少来说,发生冲突的)。
文档: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas
编辑:但似乎不被警告工作...我想在我的电脑。
我会听从警告并更换gets
。 这对我来说很清楚:
BUGS
不要使用gets()函数。 因为它是不可能告诉不知道提前多少字符如何获取数据()将读取,而且由于得到()将继续存储字符了缓冲区的结束,这是非常危险的使用。 它已被用于破坏计算机的安全性。 用fgets()代替。
用fgets()代替gets()函数
char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);
的获取()函数不检查缓冲区的长度,并且可以写过去的结束和改变堆栈。 这就是“缓冲区溢出”你听说过。
实在没有什么理由使用gets()
。 即使是C标准说,这是过时! 使用fgets()
代替。
[编辑]
它看起来像警告来自链接器。 难道你得到编译时警告-c
? (即禁用链接。)
你不应该用gets
的功能在所有的手册页说,使用fgets
来代替。
GCC不提供GCC不会禁用使用编译指示警告的功能。 您必须使用不同的警告选项为标志编译器来代替。
推荐一种安全的替代品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网站说:
-fsyntax-only
Check the code for syntax errors, but don't do anything beyond that.
-fno-stack-protector
是一个选项,允许在gets()
尽管它是多么不安全使用功能。
-Wno-deprecated-declarations
关闭弃用警告
下面是用汇编的一个例子gets()
gcc myprogram.c -o myprogram -fno-stack-protector -Wno-deprecated-declarations
我同意大家谁说,这是完全不安全,因为它允许程序的缓冲区溢出。 这是非常危险的,因此它有利于与fgets的被弃用的原因。
但是,如果你正在做一个介绍安全当然,能写一个小的测试程序与缓冲区溢出和堆栈溢出是非常有帮助的概念发挥。
流行的观点相反,不是所有的程序员都同样不留神他们在写什么。 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");
}