xref: /aosp_15_r20/external/compiler-rt/test/cfi/sibling.cpp (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // XFAIL: *
2*7c3d14c8STreehugger Robot 
3*7c3d14c8STreehugger Robot // RUN: %clangxx_cfi -o %t1 %s
4*7c3d14c8STreehugger Robot // RUN: %expect_crash %t1 2>&1 | FileCheck --check-prefix=CFI %s
5*7c3d14c8STreehugger Robot 
6*7c3d14c8STreehugger Robot // RUN: %clangxx_cfi -DB32 -o %t2 %s
7*7c3d14c8STreehugger Robot // RUN: %expect_crash %t2 2>&1 | FileCheck --check-prefix=CFI %s
8*7c3d14c8STreehugger Robot 
9*7c3d14c8STreehugger Robot // RUN: %clangxx_cfi -DB64 -o %t3 %s
10*7c3d14c8STreehugger Robot // RUN: %expect_crash %t3 2>&1 | FileCheck --check-prefix=CFI %s
11*7c3d14c8STreehugger Robot 
12*7c3d14c8STreehugger Robot // RUN: %clangxx_cfi -DBM -o %t4 %s
13*7c3d14c8STreehugger Robot // RUN: %expect_crash %t4 2>&1 | FileCheck --check-prefix=CFI %s
14*7c3d14c8STreehugger Robot 
15*7c3d14c8STreehugger Robot // RUN: %clangxx -o %t5 %s
16*7c3d14c8STreehugger Robot // RUN: %t5 2>&1 | FileCheck --check-prefix=NCFI %s
17*7c3d14c8STreehugger Robot 
18*7c3d14c8STreehugger Robot // Tests that the CFI enforcement distinguishes betwen non-overriding siblings.
19*7c3d14c8STreehugger Robot // XFAILed as not implemented yet.
20*7c3d14c8STreehugger Robot 
21*7c3d14c8STreehugger Robot #include <stdio.h>
22*7c3d14c8STreehugger Robot #include "utils.h"
23*7c3d14c8STreehugger Robot 
24*7c3d14c8STreehugger Robot struct A {
25*7c3d14c8STreehugger Robot   virtual void f();
26*7c3d14c8STreehugger Robot };
27*7c3d14c8STreehugger Robot 
f()28*7c3d14c8STreehugger Robot void A::f() {}
29*7c3d14c8STreehugger Robot 
30*7c3d14c8STreehugger Robot struct B : A {
31*7c3d14c8STreehugger Robot   virtual void f();
32*7c3d14c8STreehugger Robot };
33*7c3d14c8STreehugger Robot 
f()34*7c3d14c8STreehugger Robot void B::f() {}
35*7c3d14c8STreehugger Robot 
36*7c3d14c8STreehugger Robot struct C : A {
37*7c3d14c8STreehugger Robot };
38*7c3d14c8STreehugger Robot 
main()39*7c3d14c8STreehugger Robot int main() {
40*7c3d14c8STreehugger Robot   create_derivers<B>();
41*7c3d14c8STreehugger Robot 
42*7c3d14c8STreehugger Robot   B *b = new B;
43*7c3d14c8STreehugger Robot   break_optimization(b);
44*7c3d14c8STreehugger Robot 
45*7c3d14c8STreehugger Robot   // CFI: 1
46*7c3d14c8STreehugger Robot   // NCFI: 1
47*7c3d14c8STreehugger Robot   fprintf(stderr, "1\n");
48*7c3d14c8STreehugger Robot 
49*7c3d14c8STreehugger Robot   ((C *)b)->f(); // UB here
50*7c3d14c8STreehugger Robot 
51*7c3d14c8STreehugger Robot   // CFI-NOT: 2
52*7c3d14c8STreehugger Robot   // NCFI: 2
53*7c3d14c8STreehugger Robot   fprintf(stderr, "2\n");
54*7c3d14c8STreehugger Robot }
55