Conversation
flatten_iterator::operator++ increments to the next non-empty inner range and unconditionally dereferences the outer iterator to do so (even when the outer iterator is past its end). Correctness-wise, this never uses the result of the dereference, so it is usually fine. However, this actually causes a segfault when the dereferenced memory address is not mapped, which I found occurs in PBBS backForwardBFS. The fix is to give flatten_iterator the end of its outer range and stop there. Both construction sites (flatten, and block_delayed_sequence's whole-sequence iterator) have that end available, and flatten_iterator is used nowhere else. After the last element the iterator now parks at the outer end, which the enclosing forward_delayed_sequence never dereferences because its count has reached zero.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
flatten_iterator::operator++increments to the next non-empty inner range and unconditionally dereferences the outer iterator to do so (even when the outer iterator is past its end). Correctness-wise, this never uses the result of the dereference, so it is usually fine. However, this actually causes a segfault when the dereferenced memory address is not mapped, which I found occurs in PBBS backForwardBFS.The fix is to give
flatten_iteratorthe end of its outer range and stop there. Both construction sites (flatten, andblock_delayed_sequence's whole-sequence iterator) have that end available. After the last element the iterator now stops at the outer end, which the enclosingforward_delayed_sequencenever dereferences because its count has reached zero.