首页 > 解决方案 > Bogus '可能在未初始化的情况下使用

问题描述

我在下面的代码中收到了一个统一的警告,我很难找出原因。我看不到未初始化使用它的代码路径。有人可以帮忙吗?此外,如果我的 goto 没有很好地使用或者是否有更清洁的方法,我可以使用一些建议。

 In function ‘handle_comp_enc’:
fs/compress.c:101:8: warning: ‘write_cdata’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   kfree(write_cdata);

代码:

#define ENC  (1UL << 1)
#define ZIP  (1UL << 2)
#define ENC_ZIP_ENABLED(cmp_enc_flags) ((cmp_enc_flags) & (ENC | ZIP)) == (ENC | ZIP)


int handle_comp_enc(unsigned long comp_enc_flags, unsigned char *read_data,
                        size_t read_len, unsigned char *write_data, size_t *write_len2) {
        unsigned char *write_cdata, *rd_enc_data;
        size_t write_clen, enc_src_len;
        int err;
        if (ENC_ZIP_ENABLED(comp_enc_flags)){
                write_cdata = kmalloc(get_compress_fsize(PAGE_SIZE), GFP_KERNEL);
                if (!write_cdata) {
                        err  = -ENOMEM;
                        goto zip_only;
                }
        }
        else if(!(comp_enc_flags & ENC))
                write_cdata = write_data;
        else{
                rd_enc_data = read_data;
                enc_src_len = read_len;
                goto enc_only;
        }
        err = do_compress(read_data, read_len, write_cdata, &write_clen);
        if (err < 0) {
                goto out_enc_zip;
        }
        if (!(comp_enc_flags & ENC)) {
                *write_len2 = write_clen;
                goto zip_only;
        }
        rd_enc_data = write_cdata;
        enc_src_len = write_clen;
enc_only:
        err = do_skcipher_encrypt(rd_enc_data, enc_src_len, write_data, write_len2);
        if (err < 0) {
        }
out_enc_zip:
        if (ENC_ZIP_ENABLED(comp_enc_flags))
                kfree(write_cdata);
zip_only:
        return err;
}

标签: c

解决方案


编译器尝试最好产生警告,因为消息说“可能”,编译器不知道ENC_ZIP_ENABLED(comp_enc_flags)标签处会是假的out_enc_zip。您的代码不使用未初始化的值。

也就是说,我非常不同意你的用例goto,你的代码不可读,我花了很多时间来了解代码的去向。

您的代码可以简化很多,我不确定 100% 的代码是否具有与我所说的代码难以阅读的行为相同的行为:

#define ENC  (1UL << 1)
#define ZIP  (1UL << 2)

int handle_comp_enc(unsigned long comp_enc_flags, unsigned char *read_data,
                    size_t read_len, unsigned char *write_data, size_t *write_len2) {
        if ((comp_enc_flags & (ENC | ZIP)) == (ENC | ZIP)) {
            unsigned char *tmp = kmalloc(get_compress_fsize(PAGE_SIZE), GFP_KERNEL);
            if (!tmp) {
                    return -ENOMEM;
            }
            size_t size;
            int err = do_compress(read_data, read_len, tmp, &size);
            if (!(err < 0)) {
                err = do_skcipher_encrypt(tmp, size, write_data, write_len2);
            }
            kfree(tmp);
            return err;
        }
        else if (!(comp_enc_flags & ENC)) {
              return do_compress(read_data, read_len, write_data, write_len2);
        }
        else {
            return do_skcipher_encrypt(read_data, read_len, write_data, write_len2);
        }
}

推荐阅读