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 的存储中,因此不会发生泄漏。
这会带来一些真正的问题还是误报?
错误:资源泄漏: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)