资源泄漏或误报

Mil*_*kov 1 c++ static-analysis filehandle file-pointer cppcheck

我有这样的代码:

std::string getInfo(FILE *fp)
{
    char buffer[30];
    if (fread(buffer, 19, 1, fp) == 1)
        buffer[19] = '\0';
    else
        buffer[0] = '\0';

    return buffer;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 cppcheck 进行静态分析,它会发出警告:

error: Resource leak: fp [resourceLeak]
 return buffer;
 ^
Run Code Online (Sandbox Code Playgroud)

在我看来,由于返回是按值计算的,因此数据将从“缓冲区”复制到 std::string 的存储中,因此不会发生泄漏。

这会带来一些真正的问题还是误报?

ein*_*ica 9

错误:资源泄漏:fp [resourceLeak]

您不会从此函数中泄漏任何资源。所以,如果您只分析这个函数,那么这是您的 cppcheck 中的一个错误。然而,正如 @Taekahn 指出的那样 - 也许泄漏是在你的程序的其他地方。

另外,由于您要返回std::string,您可以使用带有指针和 count 的构造函数,而不必担心缓冲区中的 '\0' :

std::string getInfo(FILE *fp)
{
    static constexpr const std::size_t info_length { 19 };
    char buffer[info_length];
    if (fread(buffer, info_length, 1, fp) == 1)
        return {buffer, info_length};
    else
        return {};
}
Run Code Online (Sandbox Code Playgroud)

如果您使用 C++23,您可能会考虑返回 anstd::expected而不是空字符串,例如:

std::expected<std::string, errc> getInfo(FILE *fp)
{
    static constexpr const std::size_t info_length { 19 };
    char buffer[info_length];
    if (fread(buffer, info_length, 1, fp) == 1)
        return std::string{buffer, info_length};
    else
        return std::unexpected{errno};
}
Run Code Online (Sandbox Code Playgroud)

  • 不是答案,只是猜测。也许 OP 调用 `getInfo(fopen(path));` 并且不会在 [mcve] 中显示它。 (2认同)