Dominique Pellé wrote:

> Hi
>
> I see code like this in an application to iterate over
> files in a directory with boost::filesystem (v1.70) without
> using exceptions:
>
>     boost::filesystem::path dir("somedir");
>     boost::system::error_code error;
>     boost::filesystem::directory_iterator node(dir, error), end;
>
>     if (error) {
>       return ...;
>     }
>     for (; node != end; node.increment(error)) {
>       const boost::filesystem::path& path = node->path();
>       // ...
>     }
>
> It appears to work... or mostly work since a crash
> was reported and the stack points to this area of the
> code. It's a rare crash that I could not reproduce myself.
>
> I suspect that there is a bug in the above code and it
> should instead be:
>
>     boost::filesystem::path dir("somedir");
>     boost::system::error_code error;
>     boost::filesystem::directory_iterator node(dir, error), end;
>
>     for (; !error && node != end; node.increment(error)) {
>       const boost::filesystem::path& path = node->path();
>       // ...
>     }
>
> In other words, I suspect that we need to check that
> node.increment(error) in the for loop did not give an error
> before checking the condition "node != end", or else we
> may enter the loop in case of error and then it may access
> node->path() with an invalid node iterator.
>
> I could not find in the doc at ...
>   https://www.boost.org/doc/libs/1_75_0/libs/filesystem/doc/reference.html
> ... what exactly happens when node.increment(error) gives
> an error. Perhaps the doc deserves clarification or an example
> illustrating how to reliably iterate over files without using
> exceptions would be welcome.

Replying to self: stumbling upon ticket
https://github.com/boostorg/filesystem/issues/112
the last comment there indicates that it's undefined
whether the iterator should progress or not in case
of error.  So I think my fix is correct.  I.e.

  for (; node != end; node.increment(error)) { ...}
... should be:
  for (; !error && node != end; node.increment(error)) { ...}

The documentation deserves clarification in my opinion.

Regards
Dominique
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
https://lists.boost.org/mailman/listinfo.cgi/boost-users

Reply via email to