Bis*_*Das 6 c gcc warnings gets header
我gets()
在我的C代码中使用该函数.我的代码工作正常,但我收到一条警告信息
(.text+0xe6): warning: the `gets' function is dangerous and should not be used.
Run Code Online (Sandbox Code Playgroud)
我希望不会弹出此警告消息.有什么办法吗?
我想知道通过创建一个用于禁用某些警告的头文件可能存在这种可能性.或者在编译期间有任何选项可以满足我的目的吗?或者可能有一种特殊的方法gets()
用于此警告不要弹出?
小智 27
显而易见的答案是从编译器试图告诉你的内容中学习 - 你永远不应该使用gets(),因为它完全不安全.使用fgets()代替,这可以防止可能的缓冲区溢出.
#define BUFFER_SIZE 100
char buff[BUFFER_SIZE];
gets( buff); // unsafe!
fgets( buff, sizeof(buff), stdin ); // safe
Run Code Online (Sandbox Code Playgroud)
Sam*_*iao 24
如果你真的想要使用它.
以下是答案来自:http://www.gamedev.net/community/forums/topic.asp?topic_id = 523641
如果您使用相当新版本的gcc,您可以使用:
#pragma GCC diagnostic ignored "your option here"
Run Code Online (Sandbox Code Playgroud)
例如,如果这些标头产生"浮点比较是不安全的"错误,您将使用:
#pragma GCC diagnostic ignored "-Wfloat-equal".
Run Code Online (Sandbox Code Playgroud)
不幸的是,你不能以这种方式禁用"-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);
Run Code Online (Sandbox Code Playgroud)
gets()函数不检查缓冲区的长度,可以写入结束并更改堆栈.这是你听到的"缓冲区溢出".