1*7c3d14c8STreehugger Robot // RUN: %clang -o %t1 %s 2*7c3d14c8STreehugger Robot // RUN: %t1 2>&1 | FileCheck --check-prefix=NCFI %s 3*7c3d14c8STreehugger Robot 4*7c3d14c8STreehugger Robot // RUN: %clang_cfi -o %t2 %s 5*7c3d14c8STreehugger Robot // RUN: %expect_crash %t2 2>&1 | FileCheck --check-prefix=CFI %s 6*7c3d14c8STreehugger Robot 7*7c3d14c8STreehugger Robot // RUN: %clang_cfi_diag -g -o %t3 %s 8*7c3d14c8STreehugger Robot // RUN: %t3 2>&1 | FileCheck --check-prefix=CFI-DIAG %s 9*7c3d14c8STreehugger Robot 10*7c3d14c8STreehugger Robot #include <stdio.h> 11*7c3d14c8STreehugger Robot f()12*7c3d14c8STreehugger Robotvoid f() { 13*7c3d14c8STreehugger Robot } 14*7c3d14c8STreehugger Robot main()15*7c3d14c8STreehugger Robotint main() { 16*7c3d14c8STreehugger Robot // CFI: 1 17*7c3d14c8STreehugger Robot // NCFI: 1 18*7c3d14c8STreehugger Robot fprintf(stderr, "1\n"); 19*7c3d14c8STreehugger Robot 20*7c3d14c8STreehugger Robot // CFI-DIAG: runtime error: control flow integrity check for type 'void (int)' failed during indirect function call 21*7c3d14c8STreehugger Robot // CFI-DIAG: f defined here 22*7c3d14c8STreehugger Robot ((void (*)(int))f)(42); // UB here 23*7c3d14c8STreehugger Robot 24*7c3d14c8STreehugger Robot // CFI-NOT: 2 25*7c3d14c8STreehugger Robot // NCFI: 2 26*7c3d14c8STreehugger Robot fprintf(stderr, "2\n"); 27*7c3d14c8STreehugger Robot } 28