[英]How to make gcc 4.7 warn about use of the infamous gets() function?
我看到了另一個關於C的問題,代碼在哪里使用了gets()
,並且用通常的警告來評論關於永遠不要使用gets()
除非您想演示如何破壞安全性。
這次,我決定檢查編譯器是否發出有關使用gets()
的警告。 我當然希望如此。 一定要吧? 即使您未指定任何警告?
想象一下,我的驚訝,當我發現,不僅編譯器默認情況下不發出警告,但我甚至不能弄清楚如何使它警告!
有問題的編譯器是Debian上的gcc 4.7.2,這是我使用的代碼:
#include <stdio.h>
int main(void)
{
char s[10];
gets(s);
puts(s);
return 0;
}
嘗試gcc gc
。 編譯時無警告。 運行。 如果輸入太多文本,則會出現段錯誤。
試過我通常放在makefile中的所有標准警告:
gcc -W -Wall -Wno-long-long -Wshadow -Wlarger-than-1000 \
-Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align \
-Wconversion -Waggregate-return -Wmissing-prototypes \
-Wmissing-declarations -Wpadded -Wredundant-decls -Wnested-externs g.c
結果相同。
嘗試使用-std=c11
。 考慮gets()
在C11中甚至不存在,即使這樣也沒有生成警告,這很奇怪。 也嘗試過c99
。 沒有警告。
那么這是怎么回事? 當我在整個C語言中使用最不贊成使用的函數時,為什么這個使用非常廣泛的編譯器沒有警告我?
編輯 :根據下面的Keith Thompson的建議,我在stdio.h
檢查了棄用屬性。 它不在那里。 然后,我復制了頭文件並進行了試驗。 將這兩個字符串(我在其他標頭中找到)添加到聲明的末尾確實會產生警告:
__attribute_deprecated__
__attribute__ ((__deprecated__))
警告:
‘gets’ is deprecated (declared at /usr/include/stdiotz.h:632) [-Wdeprecated-declarations]
總結到目前為止我所看到的響應,看來我系統上的libc版本不包含警告,該警告在更高版本中確實存在。 這很奇怪,因為警告至少自1996年以來就以某種形式存在。我隱約記得libc已被分叉至少一次,因此警告可能在一個分支中的出現時間比在其他分支中要晚得多。
我想我會在Debian郵件列表中詢問有關此問題的信息,並且可能會根據我所學的內容將其報告為錯誤。
編輯2 :我看了一些源代碼。 glibc至少從2007年起就在libio/iogets.c
發出警告。 我擁有的eglibc 2.13具有完全相同的警告代碼:
#ifdef _LIBC
link_warning (gets, "the `gets' function is dangerous and should not be used.")
#endif
我想在編譯庫時未定義_LIBC
。 為什么,我不知道。 我不確定_LIBC
的用途是什么。
因此,答案似乎可以歸結為“這是庫,無論出於何種原因,以他們的智慧,負責它的Debian開發人員都以這種方式對其進行了編譯。”我們可能永遠都不知道為什么。
由於我使用的是oldstable,因此不會將其報告為錯誤。 如果在我的下一次升級后仍然如此,可以將其啟動。
謝謝大家,您的信息豐富!
包含此警告消息的不是GCC,而是GLIBC。
您不太可能使用的是舊版本的GLIBC:警告至少自1996年以來一直存在。請參見GitHub上此GLIBC代碼的第67行以獲取示例(請注意日期: 1996年12月15日 ):
link_warning (gets, "the `gets' function is dangerous and should not be used.")
您很可能正在使用其他C庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.