簡體   English   中英

如何使gcc 4.7警告使用臭名昭著的gets()函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM