I have a code like this:
std::string getInfo(FILE *fp)
{
char buffer[30];
if (fread(buffer, 19, 1, fp) == 1)
buffer[19] = '\0';
else
buffer[0] = '\0';
return buffer;
}
I'm using cppcheck for static analysis and it spits a warning:
error: Resource leak: fp [resourceLeak]
return buffer;
^
The way I see it, since the return is by value, the data will be copied from "buffer" into std::string's storage, so there's no leak there.
Does this pose some real problem or is it a false positive?
error: Resource leak: fp [resourceLeak]
You are not leaking any resource from this function. So, if you're only analyzing this function, this is a bug in your cppcheck. However, as @Taekahn points out - maybe the leak is elsewhere in your program.
Also, since you're returning std::string
, you can use a constructor taking a pointer and a count, and not bother with the '\0' in the buffer:
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 {};
}
If you're using C++23, you might consider returning an std::expected
instead of the empty string, e.g. something like:
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};
}