Fix undefined behavior in extents::insert #319
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.
The extents::insert may dereference the end iterator, which is undefined behavior. This occurs when there is no element that is greater than the specified key. In which case, iter will point to the element before the end pointer. The loop body will then increment the iter (causing it to point to the end pointer) and dereference it, unless there is an overlap.
The "borders" test case from
test_extents.cc
triggers this behavior and causes test failures on some architectures. You can single-step through it with GDB to confirm this, Specifically, this was encountered on the Alpine Linux Edge armhf/x86 builders.If I understand the semantics correctly, then if we ran into the end iterator at this point we don't need to update
ignore_due_to_total_overlap
and can leave it as-is.