forked from OSchip/llvm-project
Revert "Revert "[compiler-rt][asan] Make wild-pointer crash error more useful""
This reverts commit c578508b5b
.
Reland now that unrelated crash has been resolved.
This commit is contained in:
parent
731b3d7664
commit
ab08c3865b
|
@ -77,7 +77,6 @@ static bool GetShadowKind(uptr addr, ShadowKind *shadow_kind) {
|
||||||
} else if (AddrIsInLowShadow(addr)) {
|
} else if (AddrIsInLowShadow(addr)) {
|
||||||
*shadow_kind = kShadowKindLow;
|
*shadow_kind = kShadowKindLow;
|
||||||
} else {
|
} else {
|
||||||
CHECK(0 && "Address is not in memory and not in shadow?");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -464,7 +463,13 @@ AddressDescription::AddressDescription(uptr addr, uptr access_size,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
data.kind = kAddressKindWild;
|
data.kind = kAddressKindWild;
|
||||||
addr = 0;
|
data.wild.addr = addr;
|
||||||
|
data.wild.access_size = access_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WildAddressDescription::Print() const {
|
||||||
|
Printf("Address %p is a wild pointer inside of access range of size %p.\n",
|
||||||
|
addr, access_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintAddressDescription(uptr addr, uptr access_size,
|
void PrintAddressDescription(uptr addr, uptr access_size,
|
||||||
|
|
|
@ -146,6 +146,13 @@ struct StackAddressDescription {
|
||||||
bool GetStackAddressInformation(uptr addr, uptr access_size,
|
bool GetStackAddressInformation(uptr addr, uptr access_size,
|
||||||
StackAddressDescription *descr);
|
StackAddressDescription *descr);
|
||||||
|
|
||||||
|
struct WildAddressDescription {
|
||||||
|
uptr addr;
|
||||||
|
uptr access_size;
|
||||||
|
|
||||||
|
void Print() const;
|
||||||
|
};
|
||||||
|
|
||||||
struct GlobalAddressDescription {
|
struct GlobalAddressDescription {
|
||||||
uptr addr;
|
uptr addr;
|
||||||
// Assume address is close to at most four globals.
|
// Assume address is close to at most four globals.
|
||||||
|
@ -193,7 +200,7 @@ class AddressDescription {
|
||||||
HeapAddressDescription heap;
|
HeapAddressDescription heap;
|
||||||
StackAddressDescription stack;
|
StackAddressDescription stack;
|
||||||
GlobalAddressDescription global;
|
GlobalAddressDescription global;
|
||||||
uptr addr;
|
WildAddressDescription wild;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -211,7 +218,7 @@ class AddressDescription {
|
||||||
uptr Address() const {
|
uptr Address() const {
|
||||||
switch (data.kind) {
|
switch (data.kind) {
|
||||||
case kAddressKindWild:
|
case kAddressKindWild:
|
||||||
return data.addr;
|
return data.wild.addr;
|
||||||
case kAddressKindShadow:
|
case kAddressKindShadow:
|
||||||
return data.shadow.addr;
|
return data.shadow.addr;
|
||||||
case kAddressKindHeap:
|
case kAddressKindHeap:
|
||||||
|
@ -226,7 +233,7 @@ class AddressDescription {
|
||||||
void Print(const char *bug_descr = nullptr) const {
|
void Print(const char *bug_descr = nullptr) const {
|
||||||
switch (data.kind) {
|
switch (data.kind) {
|
||||||
case kAddressKindWild:
|
case kAddressKindWild:
|
||||||
Printf("Address %p is a wild pointer.\n", data.addr);
|
data.wild.Print();
|
||||||
return;
|
return;
|
||||||
case kAddressKindShadow:
|
case kAddressKindShadow:
|
||||||
return data.shadow.Print();
|
return data.shadow.Print();
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
// RUN: %clangxx_asan %s -o %t
|
||||||
|
// RUN: not %run %t 2>&1 | FileCheck %s
|
||||||
|
// REQUIRES: asan-64-bits
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
char *p = new char;
|
||||||
|
char *dest = new char;
|
||||||
|
const size_t offset = 0x4567890123456789;
|
||||||
|
// Flush it so the output came out before the asan report.
|
||||||
|
fprintf(stderr, "Expected bad addr: %p\n", p + offset);
|
||||||
|
fflush(stderr);
|
||||||
|
memmove(dest, p, offset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK: Expected bad addr: [[ADDR:0x[0-9,a-f]+]]
|
||||||
|
// CHECK: AddressSanitizer: unknown-crash on address [[ADDR]]
|
||||||
|
// CHECK: Address [[ADDR]] is a wild pointer inside of access range of size 0x4567890123456789
|
Loading…
Reference in New Issue