我在我的C代碼中使用函數gets()
。 我的代碼工作正常,但我得到一個警告消息通過頭文件在GCC中禁用警告消息?
(.text+0xe6): warning: the `gets' function is dangerous and should not be used.
我想這個警告信息不彈出。有什麼辦法嗎?
我想知道可能有這樣的可能性通過創建一個頭文件來禁用一些警告。或者在編譯過程中有什麼選擇可以滿足我的目的?或者可能有一種特殊的方式使用gets()
這個警告不會彈出?
我在我的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
我會留意警告並更換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.
感謝尼爾...與fgets工作正常。非常感謝。 – 2009-07-31 20:19:17
在現實生活中,您可能會想要使用sizeof buff而不是重複緩衝區大小。 – 2009-07-31 21:39:21
在現實生活中,您將需要通過常量(例如BUFFSIZE)調整緩衝區的大小,並在fgets()調用中使用它。 – 2009-07-31 21:42:37