1 //===-- dfsan.h -------------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file is a part of DataFlowSanitizer. 11 // 12 // Private DFSan header. 13 //===----------------------------------------------------------------------===// 14 15 #ifndef DFSAN_H 16 #define DFSAN_H 17 18 #include "sanitizer_common/sanitizer_internal_defs.h" 19 20 // Copy declarations from public sanitizer/dfsan_interface.h header here. 21 typedef u16 dfsan_label; 22 23 struct dfsan_label_info { 24 dfsan_label l1; 25 dfsan_label l2; 26 const char *desc; 27 void *userdata; 28 }; 29 30 extern "C" { 31 void dfsan_add_label(dfsan_label label, void *addr, uptr size); 32 void dfsan_set_label(dfsan_label label, void *addr, uptr size); 33 dfsan_label dfsan_read_label(const void *addr, uptr size); 34 dfsan_label dfsan_union(dfsan_label l1, dfsan_label l2); 35 } // extern "C" 36 37 template <typename T> 38 void dfsan_set_label(dfsan_label label, T &data) { // NOLINT 39 dfsan_set_label(label, (void *)&data, sizeof(T)); 40 } 41 42 namespace __dfsan { 43 44 void InitializeInterceptors(); 45 46 inline dfsan_label *shadow_for(void *ptr) { 47 return (dfsan_label *) ((((uptr) ptr) & ~0x700000000000) << 1); 48 } 49 50 inline const dfsan_label *shadow_for(const void *ptr) { 51 return shadow_for(const_cast<void *>(ptr)); 52 } 53 54 struct Flags { 55 // Whether to warn on unimplemented functions. 56 bool warn_unimplemented; 57 // Whether to warn on non-zero labels. 58 bool warn_nonzero_labels; 59 // Whether to propagate labels only when there is an obvious data dependency 60 // (e.g., when comparing strings, ignore the fact that the output of the 61 // comparison might be data-dependent on the content of the strings). This 62 // applies only to the custom functions defined in 'custom.c'. 63 bool strict_data_dependencies; 64 }; 65 66 extern Flags flags_data; 67 inline Flags &flags() { 68 return flags_data; 69 } 70 71 } // namespace __dfsan 72 73 #endif // DFSAN_H 74