Files
clang-p2996/compiler-rt/test/metadata/common.h
Dmitry Vyukov dbe8c2c316 Use-after-return sanitizer binary metadata
Currently per-function metadata consists of:
(start-pc, size, features)

This adds a new UAR feature and if it's set an additional element:
(start-pc, size, features, stack-args-size)

Reviewed By: melver

Differential Revision: https://reviews.llvm.org/D136078
2022-12-05 14:40:31 +01:00

76 lines
2.2 KiB
C++

#include <assert.h>
#include <stdint.h>
#include <stdio.h>
int main() { printf("main\n"); }
typedef unsigned long uptr;
#define FN(X) \
if (pc == reinterpret_cast<uptr>(X)) \
return #X
const char *symbolize(uptr pc) {
FUNCTIONS;
return nullptr;
}
template <typename T> T consume(const char *&pos, const char *end) {
T v = *reinterpret_cast<const T *>(pos);
pos += sizeof(T);
assert(pos <= end);
return v;
}
uint32_t meta_version;
const char *meta_start;
const char *meta_end;
extern "C" {
void __sanitizer_metadata_covered_add(uint32_t version, const char *start,
const char *end) {
printf("metadata add version %u\n", version);
for (const char *pos = start; pos < end;) {
const uptr base = reinterpret_cast<uptr>(pos);
const long offset = (version & (1 << 16)) ? consume<long>(pos, end)
: consume<int>(pos, end);
const uint32_t size = consume<uint32_t>(pos, end);
const uint32_t features = consume<uint32_t>(pos, end);
uint32_t stack_args = 0;
if (features & (1 << 1))
stack_args = consume<uint32_t>(pos, end);
if (const char *name = symbolize(base + offset))
printf("%s: features=%x stack_args=%u\n", name, features, stack_args);
}
meta_version = version;
meta_start = start;
meta_end = end;
}
void __sanitizer_metadata_covered_del(uint32_t version, const char *start,
const char *end) {
assert(version == meta_version);
assert(start == meta_start);
assert(end == meta_end);
}
const char *atomics_start;
const char *atomics_end;
void __sanitizer_metadata_atomics_add(uint32_t version, const char *start,
const char *end) {
assert(version == meta_version);
assert(start);
assert(end >= end);
atomics_start = start;
atomics_end = end;
}
void __sanitizer_metadata_atomics_del(uint32_t version, const char *start,
const char *end) {
assert(version == meta_version);
assert(atomics_start == start);
assert(atomics_end == end);
}
}