繁体   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