Skip to content

Commit 374fffe

Browse files
authored
Fix out-of-bounds access to std::unique_ptr<T[]> (#111581)
This manifested as an assertion failure in Clang built against libc++ with hardening enabled (e.g. -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG): `libcxx/include/__memory/unique_ptr.h:596: assertion __checker_.__in_bounds(std::__to_address(__ptr_), __i) failed: unique_ptr<T[]>::operator[](index): index out of range`
1 parent a9f5a44 commit 374fffe

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

clang/lib/Frontend/TextDiagnostic.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,10 +1252,10 @@ highlightLines(StringRef FileData, unsigned StartLineNumber,
12521252
for (unsigned I = 0; I <= Spelling.size(); ++I) {
12531253
// This line is done.
12541254
if (I == Spelling.size() || isVerticalWhitespace(Spelling[I])) {
1255-
SmallVector<TextDiagnostic::StyleRange> &LineRanges =
1256-
SnippetRanges[L - StartLineNumber];
1257-
12581255
if (L >= StartLineNumber) {
1256+
SmallVector<TextDiagnostic::StyleRange> &LineRanges =
1257+
SnippetRanges[L - StartLineNumber];
1258+
12591259
if (L == TokenStartLine) // First line
12601260
appendStyle(LineRanges, T, StartCol, LineLength);
12611261
else if (L == TokenEndLine) // Last line

clang/test/Frontend/highlight-text.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// RUN: %clang_cc1 -fsyntax-only %s 2> %t
2+
// RUN: FileCheck < %t %s
3+
#define F (1 << 99)
4+
5+
#define M \
6+
F | F
7+
8+
int a = M;
9+
// CHECK: :8:9: warning: shift count >= width of type [-Wshift-count-overflow]
10+
// CHECK-NEXT: 8 | int a = M;
11+
// CHECK-NEXT: | ^
12+
// CHECK-NEXT: :5:11: note: expanded from macro 'M'
13+
// CHECK-NEXT: 5 | #define M \
14+
// CHECK-NEXT: | ^
15+
// CHECK-NEXT: :3:14: note: expanded from macro '\
16+
// CHECK-NEXT: F'
17+
// CHECK-NEXT: 3 | #define F (1 << 99)
18+
// CHECK-NEXT: | ^ ~~
19+
// CHECK-NEXT: :8:9: warning: shift count >= width of type [-Wshift-count-overflow]
20+
// CHECK-NEXT: 8 | int a = M;
21+
// CHECK-NEXT: | ^
22+
// CHECK-NEXT: :6:5: note: expanded from macro 'M'
23+
// CHECK-NEXT: 6 | F | F
24+
// CHECK-NEXT: | ^
25+
// CHECK-NEXT: :3:14: note: expanded from macro 'F'
26+
// CHECK-NEXT: 3 | #define F (1 << 99)
27+
// CHECK-NEXT: | ^ ~~

0 commit comments

Comments
 (0)