2009-07-31 35 views
6

我在我的C代碼中使用函數gets()。 我的代碼工作正常,但我得到一個警告消息通過頭文件在GCC中禁用警告消息?

(.text+0xe6): warning: the `gets' function is dangerous and should not be used. 

我想這個警告信息不彈出。有什麼辦法嗎?

我想知道可能有這樣的可能性通過創建一個頭文件來禁用一些警告。或者在編譯過程中有什麼選擇可以滿足我的目的?或者可能有一種特殊的方式使用gets()這個警告不會彈出?

回答

27

顯而易見的答案是要學習編譯器試圖告訴你什麼 - 你永遠不應該使用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

10

我會留意警告並更換gets。這對我來說很清楚:

BUGS

不要使用gets()函數。因爲不知道 中的數據會不知道get()將讀取多少個字符,並且由於gets()將繼續存儲緩衝區末尾的 個字符,因此使用它非常危險。它有用於破壞計算機安全的 。使用fgets()代替。

8

用fgets()代替gets()函數

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

的獲得()函數不檢查緩衝區的長度,可以寫過去的結束和改變棧。這是你所聽到的「緩衝區溢出」。

5

根本不應該使用gets函數,該手冊中說使用fgets來代替。

GCC不提供GCC使用編譯指示禁用警告的功能。相反,您必須使用各種warning options作爲標誌。

6

確實沒有理由使用gets()。甚至連C標準都說它已經過時了!改爲使用fgets()

[編輯]

它看起來像警告來自鏈接器。編譯-c時會發出警告嗎? (其中禁用鏈接。)

24

如果你真的想使用它。

下面是回答: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

編輯: 但它似乎不是被警告工作...我想在我的電腦。

-2

與流行觀點相反,並不是所有的程序員都對他們寫的內容同樣漠不關心。 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"); 
} 
1

建議替代品爲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; 
} 
0

如果你真的想用它,請嘗試標記-fsyntax-only

gcc website手冊上說:

-fsyntax-only

Check the code for syntax errors, but don't do anything beyond that.