| Issue |
84129
|
| Summary |
signed integer overflow in unbounded-array-bounds.c test
|
| Labels |
clang:codegen
|
| Assignees |
|
| Reporter |
tbaederr
|
Test case adapted from `test/Sema/unbounded-array-bounds.c`:
```c
struct S {
long long b;
};
struct S s[];
void f1(void) {
++s[7073650413200313099].b;
}
```
Godbolt: https://godbolt.org/z/WGG3bbxvs
Works just fine[tm] even in an assertions build, but when sanitizers are enabled:
```
./array.cpp:1813:5: warning: array index 7073650413200313099 refers past the last possible element for an array in 64-bit address space containing 64-bit (8-byte) elements (max possible 2305843009213693952 elements) [-Warray-bounds]
1813 | ++s[7073650413200313099].b;
| ^ ~~~~~~~~~~~~~~~~~~~
./array.cpp:1810:1: note: array 's' declared here
1810 | struct S s[];
| ^
Process 2655318 stopped
* thread #1, name = 'clang++', stop reason = Signed integer overflow
frame #0: 0x00000000003dd0f0 clang++`__ubsan_on_report
clang++`__ubsan_on_report:
-> 0x3dd0f0 <+0>: endbr64
0x3dd0f4 <+4>: retq
0x3dd0f5: nopw %cs:(%rax,%rax)
clang++`__ubsan_get_current_report_data:
0x3dd100 <+0>: endbr64
(lldb) bt
* thread #1, name = 'clang++', stop reason = Signed integer overflow
frame #0: 0x00000000003dd0f0 clang++`__ubsan_on_report
frame #1: 0x00000000003d7b3c clang++`__ubsan::Diag::~Diag() + 220
frame #2: 0x00000000003d9ab0 clang++`void handleIntegerOverflowImpl<__ubsan::Value>(__ubsan::OverflowData*, unsigned long, char const*, __ubsan::Value, __ubsan::ReportOptions) + 496
frame #3: 0x00000000003d9ccc clang++`__ubsan_handle_mul_overflow_abort + 60
#4: CharUnits.h:149 clang::CharUnits::operator*(this=0x00007fff71a9f840, N=7073650413200313099) const
#5: CharUnits.h:227 operator*(Scale=7073650413200313099, CU=0x00007fff71a9f840)
#6: CGExpr.cpp:3935 getArrayElementAlign(arrayAlign=(Quantity = 8), idx=0x0000504000019c10, eltSize=(Quantity = 8))
#7: CGExpr.cpp:4039 emitArraySubscriptGEP(CGF=0x00007fff720a8040, addr=Address @ 0x00007fff71b75720, indices=ArrayRef<llvm::Value *> @ 0x00007fff71b75760, eltType=QualType @ 0x00007fffffff6420, inbounds=true, signedIndices=true, loc=(ID = 39051), arrayType=0x00007fff71ffcbf0, Base=0x000052100008fd78, name=0x00007fff71ffccf0)
#8: CGExpr.cpp:4291 clang::CodeGen::CodeGenFunction::EmitArraySubscriptExpr(this=0x00007fff720a8040, E=0x000052100008fd98, Accessed=false)
#9: CGExpr.cpp:1636 clang::CodeGen::CodeGenFunction::EmitLValueHelper(this=0x00007fff720a8040, E=0x000052100008fd98, IsKnownNonNull=NotKnownNonNull)
#10: CGExpr.cpp:1513 clang::CodeGen::CodeGenFunction::EmitLValue(this=0x00007fff720a8040, E=0x000052100008fd98, IsKnownNonNull=NotKnownNonNull)
#11: CGExpr.cpp:1480 clang::CodeGen::CodeGenFunction::EmitCheckedLValue(this=0x00007fff720a8040, E=0x000052100008fd98, TCK=TCK_MemberAccess)
#12: CGExpr.cpp:4615 clang::CodeGen::CodeGenFunction::EmitMemberExpr(this=0x00007fff720a8040, E=0x000052100008fdc0)
#13: CGExpr.cpp:1646 clang::CodeGen::CodeGenFunction::EmitLValueHelper(this=0x00007fff720a8040, E=0x000052100008fdc0, IsKnownNonNull=NotKnownNonNull)
#14: CGExpr.cpp:1513 clang::CodeGen::CodeGenFunction::EmitLValue(this=0x00007fff720a8040, E=0x000052100008fdc0, IsKnownNonNull=NotKnownNonNull)
#15: CGExprScalar.cpp:243 (anonymous namespace)::ScalarExprEmitter::EmitLValue(this=0x00007fff71a98920, E=0x000052100008fdc0)
#16: CGExprScalar.cpp:606 (anonymous namespace)::ScalarExprEmitter::VisitUnaryPreInc(this=0x00007fff71a98920, E=0x000052100008fdf8)
#17: StmtVisitor.h:90 clang::StmtVisitorBase<std::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::Visit(this=0x00007fff71a98920, S=0x000052100008fdf8)
#18: CGExprScalar.cpp:411 (anonymous namespace)::ScalarExprEmitter::Visit(this=0x00007fff71a98920, E=0x000052100008fdf8)
#19: CGExprScalar.cpp:5257 clang::CodeGen::CodeGenFunction::EmitScalarExpr(this=0x00007fff720a8040, E=0x000052100008fdf8, IgnoreResultAssign=true)
#20: CGExpr.cpp:216 clang::CodeGen::CodeGenFunction::EmitAnyExpr(this=0x00007fff720a8040, E=0x000052100008fdf8, aggSlot=AggValueSlot @ 0x00007fff71c03220, ignoreResult=true)
#21: CGExpr.cpp:191 clang::CodeGen::CodeGenFunction::EmitIgnoredExpr(this=0x00007fff720a8040, E=0x000052100008fdf8)
#22: CGStmt.cpp:128 clang::CodeGen::CodeGenFunction::EmitStmt(this=0x00007fff720a8040, S=0x000052100008fdf8, Attrs=ArrayRef<const clang::Attr *> @ 0x00007fffffff9280)
#23: CGStmt.cpp:549 clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(this=0x00007fff720a8040, S=0x000052100008fe18, GetLast=false, AggSlot=AggValueSlot @ 0x00007fff71c02e20)
#24: CodeGenFunction.cpp:1265 clang::CodeGen::CodeGenFunction::EmitFunctionBody(this=0x00007fff720a8040, Body=0x000052100008fe18)
#25: CodeGenFunction.cpp:1487 clang::CodeGen::CodeGenFunction::GenerateCode(this=0x00007fff720a8040, GD=GlobalDecl @ 0x00007fff71e5f820, Fn=0x000050d000000388, FnInfo=0x0000507000003ba0)
[...]
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs