mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-05 00:49:43 +00:00
[compiler-rt][UBSan] Sanitization for alignment assumptions.
Summary: This is the compiler-rt part. The clang part is D54589. This is a second commit, the original one was r351106, which was mass-reverted in r351159 because 2 compiler-rt tests were failing. Now, i have fundamentally changed the testing approach: i malloc a few bytes, intentionally mis-align the pointer (increment it by one), and check that. Also, i have decreased the expected alignment. This hopefully should be enough to pacify all the bots. If not, i guess i might just drop the two 'bad' tests. Reviewers: filcab, vsk, #sanitizers, vitalybuka, rsmith, morehouse Reviewed By: morehouse Subscribers: rjmccall, krytarowski, rsmith, kcc, srhines, kubamracek, dberris, llvm-commits Tags: #sanitizers Differential Revision: https://reviews.llvm.org/D54590 llvm-svn: 351178
This commit is contained in:
parent
bd1c087019
commit
a06ad18669
@ -21,6 +21,7 @@ UBSAN_CHECK(GenericUB, "undefined-behavior", "undefined")
|
||||
UBSAN_CHECK(NullPointerUse, "null-pointer-use", "null")
|
||||
UBSAN_CHECK(PointerOverflow, "pointer-overflow", "pointer-overflow")
|
||||
UBSAN_CHECK(MisalignedPointerUse, "misaligned-pointer-use", "alignment")
|
||||
UBSAN_CHECK(AlignmentAssumption, "alignment-assumption", "alignment")
|
||||
UBSAN_CHECK(InsufficientObjectSize, "insufficient-object-size", "object-size")
|
||||
UBSAN_CHECK(SignedIntegerOverflow, "signed-integer-overflow",
|
||||
"signed-integer-overflow")
|
||||
|
@ -106,6 +106,62 @@ void __ubsan::__ubsan_handle_type_mismatch_v1_abort(TypeMismatchData *Data,
|
||||
Die();
|
||||
}
|
||||
|
||||
static void handleAlignmentAssumptionImpl(AlignmentAssumptionData *Data,
|
||||
ValueHandle Pointer,
|
||||
ValueHandle Alignment,
|
||||
ValueHandle Offset,
|
||||
ReportOptions Opts) {
|
||||
Location Loc = Data->Loc.acquire();
|
||||
SourceLocation AssumptionLoc = Data->AssumptionLoc.acquire();
|
||||
|
||||
ErrorType ET = ErrorType::AlignmentAssumption;
|
||||
|
||||
if (ignoreReport(Loc.getSourceLocation(), Opts, ET))
|
||||
return;
|
||||
|
||||
ScopedReport R(Opts, Loc, ET);
|
||||
|
||||
uptr RealPointer = Pointer - Offset;
|
||||
uptr LSB = LeastSignificantSetBitIndex(RealPointer);
|
||||
uptr ActualAlignment = uptr(1) << LSB;
|
||||
|
||||
uptr Mask = Alignment - 1;
|
||||
uptr MisAlignmentOffset = RealPointer & Mask;
|
||||
|
||||
if (!Offset) {
|
||||
Diag(Loc, DL_Error, ET,
|
||||
"assumption of %0 byte alignment for pointer of type %1 failed")
|
||||
<< Alignment << Data->Type;
|
||||
} else {
|
||||
Diag(Loc, DL_Error, ET,
|
||||
"assumption of %0 byte alignment (with offset of %1 byte) for pointer "
|
||||
"of type %2 failed")
|
||||
<< Alignment << Offset << Data->Type;
|
||||
}
|
||||
|
||||
if (!AssumptionLoc.isInvalid())
|
||||
Diag(AssumptionLoc, DL_Note, ET, "alignment assumption was specified here");
|
||||
|
||||
Diag(RealPointer, DL_Note, ET,
|
||||
"%0address is %1 aligned, misalignment offset is %2 bytes")
|
||||
<< (Offset ? "offset " : "") << ActualAlignment << MisAlignmentOffset;
|
||||
}
|
||||
|
||||
void __ubsan::__ubsan_handle_alignment_assumption(AlignmentAssumptionData *Data,
|
||||
ValueHandle Pointer,
|
||||
ValueHandle Alignment,
|
||||
ValueHandle Offset) {
|
||||
GET_REPORT_OPTIONS(false);
|
||||
handleAlignmentAssumptionImpl(Data, Pointer, Alignment, Offset, Opts);
|
||||
}
|
||||
void __ubsan::__ubsan_handle_alignment_assumption_abort(
|
||||
AlignmentAssumptionData *Data, ValueHandle Pointer, ValueHandle Alignment,
|
||||
ValueHandle Offset) {
|
||||
GET_REPORT_OPTIONS(true);
|
||||
handleAlignmentAssumptionImpl(Data, Pointer, Alignment, Offset, Opts);
|
||||
Die();
|
||||
}
|
||||
|
||||
/// \brief Common diagnostic emission for various forms of integer overflow.
|
||||
template <typename T>
|
||||
static void handleIntegerOverflowImpl(OverflowData *Data, ValueHandle LHS,
|
||||
|
@ -39,6 +39,17 @@ struct TypeMismatchData {
|
||||
/// type.
|
||||
RECOVERABLE(type_mismatch_v1, TypeMismatchData *Data, ValueHandle Pointer)
|
||||
|
||||
struct AlignmentAssumptionData {
|
||||
SourceLocation Loc;
|
||||
SourceLocation AssumptionLoc;
|
||||
const TypeDescriptor &Type;
|
||||
};
|
||||
|
||||
/// \brief Handle a runtime alignment assumption check failure,
|
||||
/// caused by a misaligned pointer.
|
||||
RECOVERABLE(alignment_assumption, AlignmentAssumptionData *Data,
|
||||
ValueHandle Pointer, ValueHandle Alignment, ValueHandle Offset)
|
||||
|
||||
struct OverflowData {
|
||||
SourceLocation Loc;
|
||||
const TypeDescriptor &Type;
|
||||
|
@ -10,6 +10,8 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
INTERFACE_FUNCTION(__ubsan_handle_add_overflow)
|
||||
INTERFACE_FUNCTION(__ubsan_handle_add_overflow_abort)
|
||||
INTERFACE_FUNCTION(__ubsan_handle_alignment_assumption)
|
||||
INTERFACE_FUNCTION(__ubsan_handle_alignment_assumption_abort)
|
||||
INTERFACE_FUNCTION(__ubsan_handle_builtin_unreachable)
|
||||
INTERFACE_FUNCTION(__ubsan_handle_cfi_bad_type)
|
||||
INTERFACE_FUNCTION(__ubsan_handle_cfi_check_fail)
|
||||
|
@ -95,6 +95,7 @@ void NORETURN CheckFailed(const char *file, int, const char *cond, u64, u64) {
|
||||
HANDLER_NORECOVER(name, msg)
|
||||
|
||||
HANDLER(type_mismatch, "type-mismatch")
|
||||
HANDLER(alignment_assumption, "alignment-assumption")
|
||||
HANDLER(add_overflow, "add-overflow")
|
||||
HANDLER(sub_overflow, "sub-overflow")
|
||||
HANDLER(mul_overflow, "mul-overflow")
|
||||
|
27
compiler-rt/test/fuzzer/AlignmentAssumptionTest.cpp
Normal file
27
compiler-rt/test/fuzzer/AlignmentAssumptionTest.cpp
Normal file
@ -0,0 +1,27 @@
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
|
||||
// Test for alignment assumption failure.
|
||||
|
||||
#include <assert.h>
|
||||
#include <climits>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
|
||||
static volatile int32_t Sink;
|
||||
|
||||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
assert(Data);
|
||||
if (Size > 0 && Data[0] == 'H') {
|
||||
Sink = 1;
|
||||
if (Size > 1 && Data[1] == 'i') {
|
||||
Sink = 2;
|
||||
if (Size > 2 && Data[2] == '!') {
|
||||
__builtin_assume_aligned(Data + 1, 0x8000);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
7
compiler-rt/test/fuzzer/fuzzer-alignment-assumption.test
Normal file
7
compiler-rt/test/fuzzer/fuzzer-alignment-assumption.test
Normal file
@ -0,0 +1,7 @@
|
||||
RUN: rm -f %t-AlignmentAssumptionTest-Ubsan
|
||||
RUN: %cpp_compiler -fsanitize=alignment -fno-sanitize-recover=all %S/AlignmentAssumptionTest.cpp -o %t-AlignmentAssumptionTest-Ubsan
|
||||
RUN: not %run %t-AlignmentAssumptionTest-Ubsan 2>&1 | FileCheck %s
|
||||
CHECK: AlignmentAssumptionTest.cpp:22:34: runtime error: assumption of 32768 byte alignment for pointer of type 'const {{.*}} *' (aka 'const unsigned char *') failed
|
||||
CHECK: 0x{{.*}}: note: address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
CHECK: Test unit written to ./crash-
|
@ -0,0 +1,36 @@
|
||||
// RUN: %clang -x c -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef char *__attribute__((align_value(0x8000))) aligned_char;
|
||||
|
||||
struct ac_struct {
|
||||
aligned_char a;
|
||||
};
|
||||
|
||||
char *load_from_ac_struct(struct ac_struct *x) {
|
||||
return x->a;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(2);
|
||||
|
||||
struct ac_struct x;
|
||||
x.a = ptr + 1; // FIXME: it is weird that this does not also have an assumption.
|
||||
load_from_ac_struct(&x);
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-9]]:13: runtime error: assumption of 32768 byte alignment for pointer of type 'aligned_char' (aka 'char *') failed
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-17]]:30: note: alignment assumption was specified here
|
||||
// CHECK: 0x{{.*}}: note: address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
// RUN: %clang -x c -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
char *passthrough(__attribute__((align_value(0x8000))) char *x) {
|
||||
return x;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(2);
|
||||
|
||||
passthrough(ptr + 1);
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-7]]:10: runtime error: assumption of 32768 byte alignment for pointer of type 'char *' failed
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-9]]:34: note: alignment assumption was specified here
|
||||
// CHECK: 0x{{.*}}: note: address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
// FIXME: shouldn't there be an assumption on the caller's side too?
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
// RUN: %clang -x c -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
char *__attribute__((alloc_align(2)))
|
||||
passthrough(char *x, unsigned long alignment) {
|
||||
return x;
|
||||
}
|
||||
|
||||
unsigned long alignment;
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(2);
|
||||
|
||||
alignment = 0x8000;
|
||||
|
||||
passthrough(ptr + 1, alignment);
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-1]]:3: runtime error: assumption of 32768 byte alignment for pointer of type 'char *' failed
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-14]]:22: note: alignment assumption was specified here
|
||||
// CHECK: 0x{{.*}}: note: address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
// RUN: %clang -x c -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
char *__attribute__((alloc_align(2)))
|
||||
passthrough(char *x, unsigned long alignment) {
|
||||
return x;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(2);
|
||||
|
||||
passthrough(ptr + 1, 0x8000);
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-1]]:3: runtime error: assumption of 32768 byte alignment for pointer of type 'char *' failed
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-10]]:22: note: alignment assumption was specified here
|
||||
// CHECK: 0x{{.*}}: note: address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
// RUN: %clang -x c -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
char *__attribute__((assume_aligned(0x8000, 1))) passthrough(char *x) {
|
||||
return x;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(3);
|
||||
|
||||
passthrough(ptr + 2);
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-1]]:3: runtime error: assumption of 32768 byte alignment (with offset of 1 byte) for pointer of type 'char *' failed
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-9]]:22: note: alignment assumption was specified here
|
||||
// CHECK: 0x{{.*}}: note: offset address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
// RUN: %clang -x c -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
char *__attribute__((assume_aligned(0x8000))) passthrough(char *x) {
|
||||
return x;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(2);
|
||||
|
||||
passthrough(ptr + 1);
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-1]]:3: runtime error: assumption of 32768 byte alignment for pointer of type 'char *' failed
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-9]]:22: note: alignment assumption was specified here
|
||||
// CHECK: 0x{{.*}}: note: address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=316
|
||||
// I'm not sure this is actually *that* issue, but this seems oddly similar to the other XFAIL'ed cases.
|
||||
// XFAIL: android
|
||||
// UNSUPPORTED: ios
|
||||
|
||||
// RUN: %clang -fsanitize=alignment -fno-sanitize-recover=alignment -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption "
|
||||
|
||||
// RUN: rm -f %tmp
|
||||
// RUN: echo "[alignment]" >> %tmp
|
||||
// RUN: echo "fun:main" >> %tmp
|
||||
// RUN: %clang -fsanitize=alignment -fno-sanitize-recover=alignment -fsanitize-blacklist=%tmp -O0 %s -o %t && %run %t 2>&1
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(2);
|
||||
|
||||
__builtin_assume_aligned(ptr + 1, 0x8000);
|
||||
// CHECK: {{.*}}alignment-assumption-blacklist.cpp:[[@LINE-1]]:32: runtime error: assumption of 32768 byte alignment for pointer of type 'char *' failed
|
||||
// CHECK: 0x{{.*}}: note: address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
// RUN: %clang -x c -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
volatile long offset;
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(3);
|
||||
|
||||
offset = 1;
|
||||
|
||||
__builtin_assume_aligned(ptr + 2, 0x8000, offset);
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-1]]:32: runtime error: assumption of 32768 byte alignment (with offset of 1 byte) for pointer of type 'char *' failed
|
||||
// CHECK: 0x{{.*}}: note: offset address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
// RUN: %clang -x c -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(3);
|
||||
|
||||
__builtin_assume_aligned(ptr + 2, 0x8000, 1);
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-1]]:32: runtime error: assumption of 32768 byte alignment (with offset of 1 byte) for pointer of type 'char *' failed
|
||||
// CHECK: 0x{{.*}}: note: offset address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
// RUN: %clang -x c -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(2);
|
||||
|
||||
__builtin_assume_aligned(ptr + 1, 0x8000);
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-1]]:32: runtime error: assumption of 32768 byte alignment for pointer of type 'char *' failed
|
||||
// CHECK: 0x{{.*}}: note: address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
// RUN: %clang -x c -fsanitize=alignment -fopenmp-simd -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -fopenmp-simd -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -fopenmp-simd -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c -fsanitize=alignment -fopenmp-simd -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -fopenmp-simd -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -fopenmp-simd -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -fopenmp-simd -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
// RUN: %clang -x c++ -fsanitize=alignment -fopenmp-simd -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not=" assumption " --implicit-check-not="note:" --implicit-check-not="error:"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(2);
|
||||
char *data = ptr + 1;
|
||||
|
||||
data[0] = 0;
|
||||
|
||||
#pragma omp for simd aligned(data : 0x8000)
|
||||
for(int x = 0; x < 1; x++)
|
||||
data[x] = data[x];
|
||||
// CHECK: {{.*}}alignment-assumption-{{.*}}.cpp:[[@LINE-3]]:30: runtime error: assumption of 32768 byte alignment for pointer of type 'char *' failed
|
||||
// CHECK: 0x{{.*}}: note: address is {{.*}} aligned, misalignment offset is {{.*}} byte
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
// RUN: %clangxx -fsanitize=alignment %s -o %t
|
||||
// RUN: %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-NOTYPE
|
||||
// RUN: %env_ubsan_opts=report_error_type=1 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-TYPE
|
||||
// REQUIRES: !ubsan-standalone && !ubsan-standalone-static
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char *ptr = (char *)malloc(2);
|
||||
|
||||
__builtin_assume_aligned(ptr + 1, 0x8000);
|
||||
// CHECK-NOTYPE: SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior {{.*}}summary.cpp:[[@LINE-1]]:32
|
||||
// CHECK-TYPE: SUMMARY: UndefinedBehaviorSanitizer: alignment-assumption {{.*}}summary.cpp:[[@LINE-2]]:32
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
// RUN: %clang -fsanitize=alignment %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
// CHECK-NOT: alignment-assumption
|
||||
|
||||
char *ptr = (char *)malloc(2);
|
||||
|
||||
__builtin_assume_aligned(ptr + 1, 0x8000);
|
||||
// CHECK: alignment-assumption
|
||||
// CHECK-NOT: alignment-assumption
|
||||
|
||||
free(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user