Skip to content

Fix separator not backtracked when complex-typed array element fails - #1716

Open
olabusayoT wants to merge 2 commits into
apache:mainfrom
olabusayoT:daf-3094-absentrep-backtrack
Open

Fix separator not backtracked when complex-typed array element fails#1716
olabusayoT wants to merge 2 commits into
apache:mainfrom
olabusayoT:daf-3094-absentrep-backtrack

Conversation

@olabusayoT

Copy link
Copy Markdown
Contributor

For a maxOccurs-bounded occursCountKind="implicit" array whose element type is complex with no possible zero-length representation (e.g. every branch of a choice requires a distinct non-empty initiator), the speculative attempt at an occurrence beyond the real data would parse its preceding separator successfully, then fail the content entirely with zero bits consumed. anyTypeElementFailedParseAttemptStatus classified this as AbsentRep, whose contract is to retain the bit position (keep the separator consumed); that is correct for a genuinely empty representation, but wrong here since there is no occurrence at all. This let the separator leak into whatever sequence child comes next, causing spurious "separator not found" / "terminator not found" errors.

Gate the AbsentRep classification on isEmptyRepZeroLength for complex types, so a structurally-impossible zero-length failure returns MissingItem instead, which forces the caller to fully backtrack the point of uncertainty including the separator.

DAFFODIL-3094

@jadams-tresys jadams-tresys left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

@stevedlawrence stevedlawrence left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

@olabusayoT
olabusayoT force-pushed the daf-3094-absentrep-backtrack branch from 6f67018 to 8ae8dbb Compare September 3, 2026 18:05
For a maxOccurs-bounded occursCountKind="implicit" array whose element type
is complex with no possible zero-length representation (e.g. every branch
of a choice requires a distinct non-empty initiator), the speculative
attempt at an occurrence beyond the real data would parse its preceding
separator successfully, then fail the content entirely with zero bits
consumed. anyTypeElementFailedParseAttemptStatus classified this as
AbsentRep, whose contract is to retain the bit position (keep the
separator consumed); that is correct for a genuinely empty representation,
but wrong here since there is no occurrence at all. This let the separator
leak into whatever sequence child comes next, causing spurious "separator
not found" / "terminator not found" errors.

Gate the AbsentRep classification on isEmptyRepZeroLength for complex
types, so a structurally-impossible zero-length failure returns
MissingItem instead, which forces the caller to fully backtrack the point
of uncertainty including the separator.

Added tests to exercise.

DAFFODIL-3094
@olabusayoT
olabusayoT force-pushed the daf-3094-absentrep-backtrack branch from 8ae8dbb to 1848c10 Compare September 4, 2026 19:16
…backtracking

The prior fix gated AbsentRep vs MissingItem on the static isEmptyRepZeroLength
flag, but that only describes whether some successful parse of the type could
be zero-length, not whether this particular failed attempt was genuinely
empty. A choice whose real branch matches part of its content then fails nets
zero bits once backed out, indistinguishable from a genuine empty match by
bit position alone.

Track this via pointOfUncertaintyResetCount, which counts resets that
actually undo bit position movement, and a mark stack letting a sequence
child's attempt check, via hadPointOfUncertaintyResetSinceMark, whether such
a reset happened during it. Added tests for both cases.

DAFFODIL-3094
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants