@@ -67,7 +67,11 @@ SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strchr(const char *s, int c,
67
67
dfsan_label *ret_label) {
68
68
for (size_t i = 0 ;; ++i) {
69
69
if (s[i] == c || s[i] == 0 ) {
70
- *ret_label = dfsan_union (dfsan_read_label (s, i+1 ), c_label);
70
+ if (flags ().strict_data_dependencies ) {
71
+ *ret_label = s_label;
72
+ } else {
73
+ *ret_label = dfsan_union (dfsan_read_label (s, i + 1 ), c_label);
74
+ }
71
75
return s[i] == 0 ? 0 : const_cast <char *>(s+i);
72
76
}
73
77
}
@@ -81,13 +85,22 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_memcmp(const void *s1, const void *s2,
81
85
const char *cs1 = (const char *) s1, *cs2 = (const char *) s2;
82
86
for (size_t i = 0 ; i != n; ++i) {
83
87
if (cs1[i] != cs2[i]) {
84
- *ret_label = dfsan_union (dfsan_read_label (cs1, i+1 ),
85
- dfsan_read_label (cs2, i+1 ));
88
+ if (flags ().strict_data_dependencies ) {
89
+ *ret_label = 0 ;
90
+ } else {
91
+ *ret_label = dfsan_union (dfsan_read_label (cs1, i + 1 ),
92
+ dfsan_read_label (cs2, i + 1 ));
93
+ }
86
94
return cs1[i] - cs2[i];
87
95
}
88
96
}
89
- *ret_label = dfsan_union (dfsan_read_label (cs1, n),
90
- dfsan_read_label (cs2, n));
97
+
98
+ if (flags ().strict_data_dependencies ) {
99
+ *ret_label = 0 ;
100
+ } else {
101
+ *ret_label = dfsan_union (dfsan_read_label (cs1, n),
102
+ dfsan_read_label (cs2, n));
103
+ }
91
104
return 0 ;
92
105
}
93
106
@@ -97,8 +110,12 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_strcmp(const char *s1, const char *s2,
97
110
dfsan_label *ret_label) {
98
111
for (size_t i = 0 ;; ++i) {
99
112
if (s1[i] != s2[i] || s1[i] == 0 || s2[i] == 0 ) {
100
- *ret_label = dfsan_union (dfsan_read_label (s1, i+1 ),
101
- dfsan_read_label (s2, i+1 ));
113
+ if (flags ().strict_data_dependencies ) {
114
+ *ret_label = 0 ;
115
+ } else {
116
+ *ret_label = dfsan_union (dfsan_read_label (s1, i + 1 ),
117
+ dfsan_read_label (s2, i + 1 ));
118
+ }
102
119
return s1[i] - s2[i];
103
120
}
104
121
}
@@ -110,8 +127,12 @@ __dfsw_strcasecmp(const char *s1, const char *s2, dfsan_label s1_label,
110
127
dfsan_label s2_label, dfsan_label *ret_label) {
111
128
for (size_t i = 0 ;; ++i) {
112
129
if (tolower (s1[i]) != tolower (s2[i]) || s1[i] == 0 || s2[i] == 0 ) {
113
- *ret_label = dfsan_union (dfsan_read_label (s1, i+1 ),
114
- dfsan_read_label (s2, i+1 ));
130
+ if (flags ().strict_data_dependencies ) {
131
+ *ret_label = 0 ;
132
+ } else {
133
+ *ret_label = dfsan_union (dfsan_read_label (s1, i + 1 ),
134
+ dfsan_read_label (s2, i + 1 ));
135
+ }
115
136
return s1[i] - s2[i];
116
137
}
117
138
}
@@ -129,9 +150,13 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_strncmp(const char *s1, const char *s2,
129
150
}
130
151
131
152
for (size_t i = 0 ;; ++i) {
132
- if (s1[i] != s2[i] || s1[i] == 0 || s2[i] == 0 || i == n-1 ) {
133
- *ret_label = dfsan_union (dfsan_read_label (s1, i+1 ),
134
- dfsan_read_label (s2, i+1 ));
153
+ if (s1[i] != s2[i] || s1[i] == 0 || s2[i] == 0 || i == n - 1 ) {
154
+ if (flags ().strict_data_dependencies ) {
155
+ *ret_label = 0 ;
156
+ } else {
157
+ *ret_label = dfsan_union (dfsan_read_label (s1, i + 1 ),
158
+ dfsan_read_label (s2, i + 1 ));
159
+ }
135
160
return s1[i] - s2[i];
136
161
}
137
162
}
@@ -150,8 +175,12 @@ __dfsw_strncasecmp(const char *s1, const char *s2, size_t n,
150
175
for (size_t i = 0 ;; ++i) {
151
176
if (tolower (s1[i]) != tolower (s2[i]) || s1[i] == 0 || s2[i] == 0 ||
152
177
i == n - 1 ) {
153
- *ret_label = dfsan_union (dfsan_read_label (s1, i+1 ),
154
- dfsan_read_label (s2, i+1 ));
178
+ if (flags ().strict_data_dependencies ) {
179
+ *ret_label = 0 ;
180
+ } else {
181
+ *ret_label = dfsan_union (dfsan_read_label (s1, i + 1 ),
182
+ dfsan_read_label (s2, i + 1 ));
183
+ }
155
184
return s1[i] - s2[i];
156
185
}
157
186
}
@@ -171,7 +200,11 @@ SANITIZER_INTERFACE_ATTRIBUTE void *__dfsw_calloc(size_t nmemb, size_t size,
171
200
SANITIZER_INTERFACE_ATTRIBUTE size_t
172
201
__dfsw_strlen (const char *s, dfsan_label s_label, dfsan_label *ret_label) {
173
202
size_t ret = strlen (s);
174
- *ret_label = dfsan_read_label (s, ret+1 );
203
+ if (flags ().strict_data_dependencies ) {
204
+ *ret_label = 0 ;
205
+ } else {
206
+ *ret_label = dfsan_read_label (s, ret + 1 );
207
+ }
175
208
return ret;
176
209
}
177
210
@@ -191,7 +224,7 @@ SANITIZER_INTERFACE_ATTRIBUTE
191
224
void *__dfsw_memcpy (void *dest, const void *src, size_t n,
192
225
dfsan_label dest_label, dfsan_label src_label,
193
226
dfsan_label n_label, dfsan_label *ret_label) {
194
- *ret_label = 0 ;
227
+ *ret_label = dest_label ;
195
228
return dfsan_memcpy (dest, src, n);
196
229
}
197
230
@@ -200,7 +233,7 @@ void *__dfsw_memset(void *s, int c, size_t n,
200
233
dfsan_label s_label, dfsan_label c_label,
201
234
dfsan_label n_label, dfsan_label *ret_label) {
202
235
dfsan_memset (s, c, c_label, n);
203
- *ret_label = 0 ;
236
+ *ret_label = s_label ;
204
237
return s;
205
238
}
206
239
0 commit comments