Fix out-of-bounds read in MC/DC coverage eval_expr#8862
Fix out-of-bounds read in MC/DC coverage eval_expr#8862tautschnig merged 1 commit intodiffblue:developfrom
Conversation
The eval_expr function in cover_instrument_mcdc.cpp dereferences the result of std::map::find() without checking for end(). This happens when values_of_atomic_exprs skips inconsistent expressions (where signs.size() != 1), leaving them absent from the map. When eval_expr later encounters such an expression, find() returns end() and the dereference is undefined behavior (stack-buffer-overflow detected by AddressSanitizer). Fix by checking the iterator before dereferencing. Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR fixes an undefined behavior (out-of-bounds read / stack-buffer-overflow) in the MC/DC coverage instrumentation. The eval_expr function dereferences the result of std::map::find() without checking whether the key was found. This can happen when values_of_atomic_exprs skips inconsistent expressions (where signs.size() != 1), leaving them absent from the map.
Changes:
- Added an iterator validity check (
it != atomic_exprs.end()) before dereferencing thefind()result ineval_expr, treating missing entries asfalse.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #8862 +/- ##
===========================================
- Coverage 80.01% 80.00% -0.01%
===========================================
Files 1703 1703
Lines 188396 188397 +1
Branches 73 73
===========================================
- Hits 150738 150736 -2
- Misses 37658 37661 +3 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
The eval_expr function in cover_instrument_mcdc.cpp dereferences the result of std::map::find() without checking for end(). This happens when values_of_atomic_exprs skips inconsistent expressions (where signs.size() != 1), leaving them absent from the map. When eval_expr later encounters such an expression, find() returns end() and the dereference is undefined behavior (stack-buffer-overflow detected by AddressSanitizer).
Fix by checking the iterator before dereferencing.