Skip to content

Commit

Permalink
Add a test for vcall on a null ptr.
Browse files Browse the repository at this point in the history
Summary:
Turns out that in the case of -fsanitize=null and a virtual call,
the type check was generated *after* reading from vtable, which
causes a non-interpretable segfault. The check has been moved up
in https://reviews.llvm.org/D26559 and this CL adds a test for this case.

Reviewers: pcc

Subscribers: cfe-commits, kubabrecka

Differential Revision: https://reviews.llvm.org/D26560

llvm-svn: 287578
  • Loading branch information
Ivan Krasin committed Nov 21, 2016
1 parent 7a7477c commit 694c284
Showing 1 changed file with 26 additions and 6 deletions.
32 changes: 26 additions & 6 deletions compiler-rt/test/ubsan/TestCases/TypeCheck/null.cpp
@@ -1,20 +1,34 @@
// RUN: %clangxx -fsanitize=null %s -O3 -o %t
// RUN: %run %t l 2>&1 | FileCheck %s --check-prefix=CHECK-LOAD
// RUN: %expect_crash %run %t s 2>&1 | FileCheck %s --check-prefix=CHECK-STORE
// RUN: %run %t r 2>&1 | FileCheck %s --check-prefix=CHECK-REFERENCE
// RUN: %run %t m 2>&1 | FileCheck %s --check-prefix=CHECK-MEMBER
// RUN: %run %t f 2>&1 | FileCheck %s --check-prefix=CHECK-MEMFUN
// RUN: %clangxx -fsanitize=null -fno-sanitize-recover=null %s -O3 -o %t
// RUN: not %run %t l 2>&1 | FileCheck %s --check-prefix=CHECK-LOAD
// RUN: not %run %t s 2>&1 | FileCheck %s --check-prefix=CHECK-STORE
// RUN: not %run %t r 2>&1 | FileCheck %s --check-prefix=CHECK-REFERENCE
// RUN: not %run %t m 2>&1 | FileCheck %s --check-prefix=CHECK-MEMBER
// RUN: not %run %t f 2>&1 | FileCheck %s --check-prefix=CHECK-MEMFUN
// RUN: not %run %t t 2>&1 | FileCheck %s --check-prefix=CHECK-VCALL
// RUN: not %run %t u 2>&1 | FileCheck %s --check-prefix=CHECK-VCALL2

struct S {
int f() { return 0; }
int k;
};

struct T {
virtual int v() { return 1; }
};

struct U : T {
virtual int v() { return 2; }
};

int main(int, char **argv) {
int *p = 0;
S *s = 0;
T *t = 0;
U *u = 0;

(void)*p; // ok!
(void)*t; // ok!
(void)*u; // ok!

switch (argv[1][0]) {
case 'l':
Expand All @@ -34,5 +48,11 @@ int main(int, char **argv) {
case 'f':
// CHECK-MEMFUN: null.cpp:[[@LINE+1]]:15: runtime error: member call on null pointer of type 'S'
return s->f();
case 't':
// CHECK-VCALL: null.cpp:[[@LINE+1]]:15: runtime error: member call on null pointer of type 'T'
return t->v();
case 'u':
// CHECK-VCALL2: null.cpp:[[@LINE+1]]:15: runtime error: member call on null pointer of type 'U'
return u->v();
}
}

0 comments on commit 694c284

Please sign in to comment.