Fix UB in dcalc tests: remove fake Pin* pointers from LoadPinIndexMap#346
Open
gonsolo wants to merge 1 commit intoThe-OpenROAD-Project:masterfrom
Open
Fix UB in dcalc tests: remove fake Pin* pointers from LoadPinIndexMap#346gonsolo wants to merge 1 commit intoThe-OpenROAD-Project:masterfrom
gonsolo wants to merge 1 commit intoThe-OpenROAD-Project:masterfrom
Conversation
LoadPinIndexMap uses PinIdLess as its comparator, which calls network_->id(pin) and dereferences the Pin pointer. Three tests created fake Pin* via reinterpret_cast<const Pin*>(&int_var) and inserted them into LoadPinIndexMap, causing undefined behavior. With GCC 15.2.0's hardened std::vector::operator[] bounds checking, this UB manifests as an assertion failure: vector::operator[]: Assertion '__n < this->size()' failed Fix by using empty LoadPinIndexMap for gateDelay/gateDelays/ inputPortDelay calls (the comparator is never invoked on an empty map) and testing wire delay/load slew accessors via ArcDcalcResult::setLoadCount() directly.
jhkim-pii
reviewed
Apr 16, 2026
| // Note: LoadPinIndexMap uses PinIdLess which calls network_->id(pin), | ||
| // so we cannot use fake Pin* pointers. Test with an empty map | ||
| // (load sizing is already covered by ArcDcalcResultTest). | ||
| TEST_F(StaDcalcTest, UnitDelayCalcGateDelayWithLoads) { |
Contributor
There was a problem hiding this comment.
Creating a non-empty load_pin_index_map does not look trivial.
I think removing this TEST_F (and the others below) is better because there is a similar UnitDelayCalcGateDelay test w/ empty load_pin_index_map.
Author
There was a problem hiding this comment.
As long as my package still works, I'm happy:
NixOS/nixpkgs@63a954c
jhkim-pii
approved these changes
Apr 17, 2026
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.
LoadPinIndexMap uses PinIdLess as its comparator, which calls network_->id(pin) and dereferences the Pin pointer. Three tests created fake Pin* via reinterpret_cast<const Pin*>(&int_var) and inserted them into LoadPinIndexMap, causing undefined behavior.
With GCC 15.2.0's hardened std::vector::operator[] bounds checking, this UB manifests as an assertion failure:
vector::operator[]: Assertion '__n < this->size()' failed
Fix by using empty LoadPinIndexMap for gateDelay/gateDelays/ inputPortDelay calls (the comparator is never invoked on an empty map) and testing wire delay/load slew accessors via ArcDcalcResult::setLoadCount() directly.