test: instantiate the reference specializations in the hardened build - #82
Open
steve-downey wants to merge 1 commit into
Open
test: instantiate the reference specializations in the hardened build#82steve-downey wants to merge 1 commit into
steve-downey wants to merge 1 commit into
Conversation
expected_hardened.test.cpp only ever used expected<T, E> and expected<void, E> with a value E. Consequently the precondition checks in the expected<T&, E> specialization were never compiled at all, and neither the primary nor the void specialization was ever instantiated with a reference E. Of the 21 BEMAN_EXPECTED_TRAP() sites in the header, only 15 were reachable by any translation unit in the hardened build; the six in expected<T&, E> were dead as far as the test suite was concerned. Adds happy-path coverage for expected<T&, E>, expected<T, E&>, expected<T&, E&> and expected<void, E&>, in the same style as the existing sections. All 21 trap sites are now compiled. The checks are the same `if (!has_val_) TRAP` shape throughout, so this is mostly about compiling them at all. What it does verify beyond that is that the guarded bodies still return the right thing once T or E is a reference -- the shallow-const observers in particular, where a const expected still hands out a mutable T* / T& / E&, and where `const E&` with E = int& collapses back to int&. Happy paths only, matching the rest of the file: a violated precondition traps, and that cannot be observed from inside the process.
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.
Follow-up to an incidental finding from #80.
expected_hardened.test.cpponly ever usedexpected<T, E>andexpected<void, E>with a valueE. Consequently the precondition checks in theexpected<T&, E>specialization were never compiled at all, and neither the primary nor the void specialization was ever instantiated with a referenceE. Of the 21BEMAN_EXPECTED_TRAP()sites in the header, only 15 were reachable by any translation unit in the hardened build — the six inexpected<T&, E>were dead as far as the test suite was concerned.Adds happy-path coverage for
expected<T&, E>,expected<T, E&>,expected<T&, E&>andexpected<void, E&>, in the same style as the existing sections.What this does and doesn't buy
The checks are the same
if (!has_val_) TRAPshape throughout, so this is mostly about compiling them at all — it is fairly boring, and arguably shouldn't be load-bearing. What it does verify beyond mere instantiation is that the guarded bodies still return the right thing onceTorEis a reference: the shallow-const observers in particular, where aconst expectedstill hands out a mutableT*/T&/E&, and whereconst E&withE = int&collapses back toint&. Those are asserted withstatic_assertalongside the runtime checks.Happy paths only, matching the rest of the file: a violated precondition traps, and that cannot be observed from inside the process —
__builtin_trap()kills it with SIGILL before anything can report.Verification
Trap sites present in the gcov data for the hardened TU, before and after:
Hardened target goes from 5 test cases to 13; full suite 1089/1089 green;
clang-formatclean.Independent of #80 — no file overlap. Worth noting for whoever merges second: #80 excludes
BEMAN_EXPECTED_TRAP()lines from the gcovr report by pattern, and that pattern already matches all 21 sites, so the two compose without adjustment.🤖 Generated with Claude Code