Skip to content

Commit

Permalink
[pseudo] Fix an out-of-bound error in LRTable::find.
Browse files Browse the repository at this point in the history
The linear scan should not escape the TargetedStates range.

Differential Revision: https://reviews.llvm.org/D120723
  • Loading branch information
hokein committed Mar 2, 2022
1 parent 6ec18aa commit 28efb1c
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 13 deletions.
11 changes: 5 additions & 6 deletions clang/lib/Tooling/Syntax/Pseudo/LRTable.cpp
Expand Up @@ -110,14 +110,13 @@ llvm::ArrayRef<LRTable::Action> LRTable::find(StateID Src, SymbolID ID) const {

assert(llvm::is_sorted(TargetedStates) &&
"subrange of the StateIdx should be sorted!");
const LRTable::StateID *It = llvm::partition_point(
const LRTable::StateID *Start = llvm::partition_point(
TargetedStates, [&Src](LRTable::StateID S) { return S < Src; });
if (It == TargetedStates.end())
return {};
size_t Start = It - States.data(), End = Start;
while (End < States.size() && States[End] == Src)
const LRTable::StateID *End = Start;
while (End != TargetedStates.end() && *End == Src)
++End;
return llvm::makeArrayRef(&Actions[Start], End - Start);
return llvm::makeArrayRef(&Actions[Start - States.data()],
/*length=*/End - Start);
}

} // namespace pseudo
Expand Down
19 changes: 12 additions & 7 deletions clang/test/Syntax/lr-build-basic.test
@@ -1,24 +1,29 @@
_ := expr
expr := IDENTIFIER
expr := id
id := IDENTIFIER

# RUN: clang-pseudo -grammar %s -print-graph | FileCheck %s --check-prefix=GRAPH
# GRAPH: States:
# GRPAH-NEXT: State 0
# GRPAH-NEXT: _ := • expr
# GRPAH-NEXT: expr := • IDENTIFIER
# GRPAH-NEXT: expr := • id
# GRPAH-NEXT: id := • IDENTIFIER
# GRPAH-NEXT: State 1
# GRPAH-NEXT: _ := expr •
# GRPAH-NEXT: State 2
# GRPAH-NEXT: expr := IDENTIFIER
# GRPAH-NEXT: 0 ->[expr] 1
# GRPAH-NEXT: 0 ->[IDENTIFIER] 2
# GRPAH-NEXT: expr := id
# GRPAH-NEXT: State 3
# GRPAH-NEXT: id := IDENTIFIER

# RUN: clang-pseudo -grammar %s -print-table | FileCheck %s --check-prefix=TABLE
# TABLE: LRTable:
# TABLE-NEXT: State 0
# TABLE-NEXT: 'IDENTIFIER': shift state 2
# TABLE-NEXT: 'IDENTIFIER': shift state 3
# TABLE-NEXT: 'expr': go to state 1
# TABLE-NEXT: 'id': go to state 2
# TABLE-NEXT: State 1
# TABLE-NEXT: 'EOF': accept
# TABLE-NEXT: State 2
# TABLE-NEXT: 'EOF': reduce by rule 1 'expr := IDENTIFIER'
# TABLE-NEXT: 'EOF': reduce by rule 1 'expr := id'
# TABLE-NEXT: State 3
# TABLE-NEXT: 'EOF': reduce by rule 2 'id := IDENTIFIER'

0 comments on commit 28efb1c

Please sign in to comment.