簡體   English   中英

嘗試運行優化的 c 文件時收到 fgets 警告

[英]Getting fgets warning when trying to run optimized c file

這是一個更大文件的一部分,但這是唯一有問題的 function。 這就是問題所在,如果我在未優化的 gcc 中編譯它,我將毫無問題地得到我想要的一切。 但是,如果我嘗試將其編譯為 gcc -c -pg -02 main.c,我會收到以下錯誤消息

與其他任何輸入的 function 一樣, fgets可能由於各種原因而失敗。 從其文檔中可以找到,如果發生這種情況,它將返回NULL 但是,由於您不查看它的返回值,因此您永遠不會知道。 這就是編譯器試圖警告您的內容。 如果失敗,數組line不包含有效輸入,並且可能包含垃圾,如果您嘗試處理它會導致您的程序行為不端。

(在很多情況下,只有在優化時才會出現一些警告;這是因為編譯器會在優化過程中對代碼進行更詳細的分析,這使得它更有可能檢測到此類問題。但這很好事情;這不是優化的問題,也不是不使用它的理由。)

如果fgets失敗,您的程序沒有明顯的恢復方法,因此最簡單的方法是讓它退出並顯示錯誤消息。 perror function 是一種方便的方法; 它打印一條人類可讀的消息,對應於fgets應該設置的errno變量中的錯誤代碼。

因此,這里的錯誤檢查的基本形式是將您的fgets行替換為:

if (fgets(line,MAX_LINE ,stdin) == NULL) {
    perror("Failed to read input");
    exit(1);
}

您以后可以改進的一些事情:

  • fgets返回 NULL 的一個可能原因是文件結束:如果根本沒有輸入:用戶在他們的終端上點擊文件結束鍵(通常是 Unix 上的 Ctrl-D,Windows 上的 Ctrl-Z)或從空文件重定向輸入。 這並不完全是一個錯誤,它不會導致errno中的錯誤代碼,因此在這種情況下perror可能會打印出誤導性消息。 嘗試並修復此錯誤。 您可以使用ferror function 區分這兩種情況。

  • 如果一行被成功讀取但無法解析為數字, strtol將失敗。 您目前也不檢查。 查看它如何指示此故障並相應地處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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