首页 > 解决方案 > 如何删除未检查的返回值警告?

问题描述

我有一个代码,其中我收到未检查返回值的警告-

bool check() {
    FILE* fptr = fopen(fi.txt, "r");

    if(fptr != NULL) {
        while(!feof(fptr)) {
            fscanf(fptr, "%s", var1);

            if(strcmp(fptr, var2) == 0) {
                fclose(fptr);
                return true;
            }
        }

        fclose(fptr);
    }

    return false;
}

当我收到这样的警告时,我找到了一种重写此代码的方法

   Calling fscanf(fptr, "%s", var1) without checking return value. This library function may fail and return an error code.

这是另一种方式,这种方式是否正确-

if(fptr != NULL) {
    while(fscanf(fptr, "%s", var1) == 0) {
        if(strcmp(var1, var2) == 0) {
            fclose(fptr);
            return true;
        }
        fclose(fptr);
    }
    return false;
}

标签: cstatic-analysis

解决方案


不要使用while(feof). 相反,只需检查读取实际数据是否成功。

不:

    while(!feof(fptr)) {
        fscanf(fptr, "%s", var1);

做就是了:

    while(fscanf(fptr, "%s", var1) == 1) {

我不喜欢嵌套if的错误处理。我很可能更喜欢带有单个返回点的简短错误处理语句,因为我受到内核样式的影响:

bool check() {
    FILE* fptr = fopen(fi.txt, "r");
    if (fptr == NULL) goto fopen_failed;   // short error handling with goto-s

    bool ret = false;
    while(fscanf(fptr, "%s", var1) == 1) {
        if(strcmp(fptr, var2) == 0) {
           ret = true;
           break;
        }
    }
    fclose(fptr);

fopen_failed:
    return ret;    // single return point
}

推荐阅读