通过头文件在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 
+0

感谢尼尔...与fgets工作正常。非常感谢。 – 2009-07-31 20:19:17

+3

在现实生活中,您可能会想要使用sizeof buff而不是重复缓冲区大小。 – 2009-07-31 21:39:21

+3

在现实生活中,您将需要通过常量(例如BUFFSIZE)调整缓冲区的大小,并在fgets()调用中使用它。 – 2009-07-31 21:42:37

我会留意警告并更换gets。这对我来说很清楚:

BUGS

不要使用gets()函数。因为不知道 中的数据会不知道get()将读取多少个字符,并且由于gets()将继续存储缓冲区末尾的 个字符,因此使用它非常危险。它有用于破坏计算机安全的 。使用fgets()代替。

用fgets()代替gets()函数

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

的获得()函数不检查缓冲区的长度,可以写过去的结束和改变栈。这是你所听到的“缓冲区溢出”。

根本不应该使用gets函数,该手册中说使用fgets来代替。

GCC不提供GCC使用编译指示禁用警告的功能。相反,您必须使用各种warning options作为标志。

确实没有理由使用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.