glibc: fgets 使用规范;如果不规范,CPU吃满的一个例子

最近看emanate/snmpd 的代码;这个代码好长时间没有更新;其中在做配置文件初始化的一个函数里有用到fgets,是这么用的:

fgets(formatString + strlen(formatString),
      FORMATSTRING_BUFSIZ - strlen(formatString),
      stdin);
end = strrchr(formatString,'\n');

看到这个代码,基本可以判断,代码逻辑不缜密,有缺陷;
因为对fgets的返回值没有做判断。

更严重的是后续的代码里:

    while ((bb < 1)) {
    
    
        printf("The following");
        fgets(formatString, 33, stdin);
        end = strrchr(formatString,'\n');
        if (end != NULL) {
    
    
           *end = '\0';
        }
        sscanf(formatString, "%d", &bb);
    }

这个代码没有判断fgets的值,如果formatString一直取不到值,就会导致无限循环,将CPU吃满。

这个可能产生无限循环的情况:参见:
https://mzhan017.blog.csdn.net/article/details/124812425#C99_specifies_that_the_EOF_condition_on_a_file_is_sticky_27

猜你喜欢

转载自blog.csdn.net/qq_36428903/article/details/126236811