67 lines · cpp
1// RUN: mkdir -p %t.dir && cd %t.dir2// RUN: %clangxx_cfi_dso -DSHARED_LIB %s -fPIC -shared -o %dynamiclib %ld_flags_rpath_so3// RUN: %clangxx_cfi_dso -g %s -o %t.dir/exe %ld_flags_rpath_exe4// RUN: %t.dir/exe 2>&1 | FileCheck --check-prefix=CFI %s5 6// RUN: %clangxx_cfi_dso -DB32 -DSHARED_LIB %s -fPIC -shared -o %dynamiclib %ld_flags_rpath_so7// RUN: %clangxx_cfi_dso -DB32 %s -o %t.dir/exe %ld_flags_rpath_exe8// RUN: %t.dir/exe 2>&1 | FileCheck --check-prefix=CFI %s9 10// RUN: %clangxx_cfi_dso -DB64 -DSHARED_LIB %s -fPIC -shared -o %dynamiclib %ld_flags_rpath_so11// RUN: %clangxx_cfi_dso -DB64 %s -o %t.dir/exe %ld_flags_rpath_exe12// RUN: %t.dir/exe 2>&1 | FileCheck --check-prefix=CFI %s13 14// RUN: %clangxx_cfi_dso -DBM -DSHARED_LIB %s -fPIC -shared -o %dynamiclib %ld_flags_rpath_so15// RUN: %clangxx_cfi_dso -DBM %s -o %t.dir/exe %ld_flags_rpath_exe16// RUN: %t.dir/exe 2>&1 | FileCheck --check-prefix=CFI %s17 18// RUN: %clangxx -DBM -DSHARED_LIB %s -fPIC -shared -o %dynamiclib %ld_flags_rpath_so19// RUN: %clangxx -DBM %s -o %t.dir/exe %ld_flags_rpath_exe20// RUN: %t.dir/exe 2>&1 | FileCheck --check-prefix=NCFI %s21// RUN: %t.dir/exe x 2>&1 | FileCheck --check-prefix=NCFI %s22 23// Tests that the CFI mechanism crashes the program when making a virtual call24// to an object of the wrong class but with a compatible vtable, by casting a25// pointer to such an object and attempting to make a call through it.26 27// REQUIRES: cxxabi28 29#include <stdio.h>30#include <string.h>31 32struct A {33 virtual void f();34};35 36A *create_B();37 38#ifdef SHARED_LIB39 40#include "../utils.h"41struct B : public A {42 virtual void f();43};44void B::f() {}45 46A *create_B() {47 create_derivers<B>();48 return new B();49}50 51#else52 53void A::f() {}54 55int main(int argc, char *argv[]) {56 A *a = create_B();57 58 // CFI: =1=59 // NCFI: =1=60 fprintf(stderr, "=1=\n");61 a->f(); // OK62 // CFI: =2=63 // NCFI: =2=64 fprintf(stderr, "=2=\n");65}66#endif67