-
Notifications
You must be signed in to change notification settings - Fork 30
Description
Description
When constructing a parser a std::istream referenced is used and stored. However, the lifecycle of the std::istream can be shorter than the parser, leaving it with a stale reference.
This won't affect small files (<= INPUTBUF_CAP), since those will be buffered on construction. However, with larger files it will continuously attempt to read from the stream. If the reference has become stale at that point it will result in an error.
This can for example happen when a Parser is constructed and stored as a class member with a locally scoped std::ifstream.
Sample Code
struct Test {
std::unique_ptr<aria::csv::Parser> parser;
Test(std::string path) {
std::ifstream stream(path, std::ios::in);
parser = std::make_unique<area::csv::Parser>(stream);
}
};Solutions/Workarounds
The problem can be avoided by making sure the std::istream doesn't go out of scope before the parser, making this error mostly a user error.
However, I think for a future revision it might be worthwhile to have the parser take possession of the passed stream, for example in form of a smart pointer.
Until then this issue might serve as help for the next poor fellow who falls into that trap. ;)