我在我的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 /诊断-Pragmas.html#诊断 - 编译指示

修改 但似乎无法获得警告......我在我的电脑上试过了。

我会注意警告并替换 gets 。这对我来说已经足够清楚了:

  

BUGS

     

永远不要使用gets()。因为在不知道数据的情况下无法分辨   提前读取多少个字符(),因为gets()将继续存储   超过缓冲区末尾的字符,使用起来非常危险。它有   曾被用来打破计算机安全。改为使用fgets()。

使用fgets()代替gets()

char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);

gets()函数不检查缓冲区的长度,可以写入结束并更改堆栈。这是“缓冲区溢出”。你听说过。

没有充分的理由使用 gets()。即使是C标准也说它已经过时了!改为使用 fgets()

[编辑]

看起来警告来自链接器。使用 -c 进行编译时会收到警告吗? (这会禁用链接。)

你根本不应该使用 gets 函数,该联机帮助页说使用 fgets

GCC不提供GCC使用编译指示禁用警告的功能。您必须使用各种警告选项作为标志而不是编译器。

建议安全替代 gets()

在现有代码中,要替换 gets(),可能不希望使用 fgets(),因为该函数需要额外的 char 保存两个函数都使用的'\ n',但 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仅

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");
 }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top