1*7c3d14c8STreehugger Robot // RUN: %clang_dfsan %s -o %t && %run %t 2*7c3d14c8STreehugger Robot // RUN: %clang_dfsan -mllvm -dfsan-args-abi %s -o %t && %run %t 3*7c3d14c8STreehugger Robot 4*7c3d14c8STreehugger Robot // Tests that labels are propagated through function calls. 5*7c3d14c8STreehugger Robot 6*7c3d14c8STreehugger Robot #include <sanitizer/dfsan_interface.h> 7*7c3d14c8STreehugger Robot #include <assert.h> 8*7c3d14c8STreehugger Robot f(int x)9*7c3d14c8STreehugger Robotint f(int x) { 10*7c3d14c8STreehugger Robot int j = 2; 11*7c3d14c8STreehugger Robot dfsan_label j_label = dfsan_create_label("j", 0); 12*7c3d14c8STreehugger Robot dfsan_set_label(j_label, &j, sizeof(j)); 13*7c3d14c8STreehugger Robot return x + j; 14*7c3d14c8STreehugger Robot } 15*7c3d14c8STreehugger Robot main(void)16*7c3d14c8STreehugger Robotint main(void) { 17*7c3d14c8STreehugger Robot int i = 1; 18*7c3d14c8STreehugger Robot dfsan_label i_label = dfsan_create_label("i", 0); 19*7c3d14c8STreehugger Robot dfsan_set_label(i_label, &i, sizeof(i)); 20*7c3d14c8STreehugger Robot 21*7c3d14c8STreehugger Robot dfsan_label ij_label = dfsan_get_label(f(i)); 22*7c3d14c8STreehugger Robot assert(dfsan_has_label(ij_label, i_label)); 23*7c3d14c8STreehugger Robot assert(dfsan_has_label_with_desc(ij_label, "j")); 24*7c3d14c8STreehugger Robot 25*7c3d14c8STreehugger Robot return 0; 26*7c3d14c8STreehugger Robot } 27