Skip to content
This repository was archived by the owner on May 21, 2019. It is now read-only.

Commit d21bd36

Browse files
author
Lorenzo Martignoni
committed
[DFSan] Change the way labels are propagated when comparing memory through libc functions.
Differential Revision: http://llvm-reviews.chandlerc.com/D2252 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@196388 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 9e7679c commit d21bd36

File tree

4 files changed

+97
-19
lines changed

4 files changed

+97
-19
lines changed

lib/dfsan/dfsan.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,11 @@ dfsan_has_label_with_desc(dfsan_label label, const char *desc) {
233233
static void InitializeFlags(Flags &f, const char *env) {
234234
f.warn_unimplemented = true;
235235
f.warn_nonzero_labels = false;
236+
f.strict_data_dependencies = true;
236237

237238
ParseFlag(env, &f.warn_unimplemented, "warn_unimplemented");
238239
ParseFlag(env, &f.warn_nonzero_labels, "warn_nonzero_labels");
240+
ParseFlag(env, &f.strict_data_dependencies, "strict_data_dependencies");
239241
}
240242

241243
#ifdef DFSAN_NOLIBC

lib/dfsan/dfsan.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ struct Flags {
5555
bool warn_unimplemented;
5656
// Whether to warn on non-zero labels.
5757
bool warn_nonzero_labels;
58+
// Whether to propagate labels only when there is an obvious data dependency
59+
// (e.g., when comparing strings, ignore the fact that the output of the
60+
// comparison might be data-dependent on the content of the strings). This
61+
// applies only to the custom functions defined in 'custom.c'.
62+
bool strict_data_dependencies;
5863
};
5964

6065
extern Flags flags_data;

lib/dfsan/dfsan_custom.cc

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strchr(const char *s, int c,
6767
dfsan_label *ret_label) {
6868
for (size_t i = 0;; ++i) {
6969
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+
}
7175
return s[i] == 0 ? 0 : const_cast<char *>(s+i);
7276
}
7377
}
@@ -81,13 +85,22 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_memcmp(const void *s1, const void *s2,
8185
const char *cs1 = (const char *) s1, *cs2 = (const char *) s2;
8286
for (size_t i = 0; i != n; ++i) {
8387
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+
}
8694
return cs1[i] - cs2[i];
8795
}
8896
}
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+
}
91104
return 0;
92105
}
93106

@@ -97,8 +110,12 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_strcmp(const char *s1, const char *s2,
97110
dfsan_label *ret_label) {
98111
for (size_t i = 0;; ++i) {
99112
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+
}
102119
return s1[i] - s2[i];
103120
}
104121
}
@@ -110,8 +127,12 @@ __dfsw_strcasecmp(const char *s1, const char *s2, dfsan_label s1_label,
110127
dfsan_label s2_label, dfsan_label *ret_label) {
111128
for (size_t i = 0;; ++i) {
112129
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+
}
115136
return s1[i] - s2[i];
116137
}
117138
}
@@ -129,9 +150,13 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_strncmp(const char *s1, const char *s2,
129150
}
130151

131152
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+
}
135160
return s1[i] - s2[i];
136161
}
137162
}
@@ -150,8 +175,12 @@ __dfsw_strncasecmp(const char *s1, const char *s2, size_t n,
150175
for (size_t i = 0;; ++i) {
151176
if (tolower(s1[i]) != tolower(s2[i]) || s1[i] == 0 || s2[i] == 0 ||
152177
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+
}
155184
return s1[i] - s2[i];
156185
}
157186
}
@@ -171,7 +200,11 @@ SANITIZER_INTERFACE_ATTRIBUTE void *__dfsw_calloc(size_t nmemb, size_t size,
171200
SANITIZER_INTERFACE_ATTRIBUTE size_t
172201
__dfsw_strlen(const char *s, dfsan_label s_label, dfsan_label *ret_label) {
173202
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+
}
175208
return ret;
176209
}
177210

@@ -191,7 +224,7 @@ SANITIZER_INTERFACE_ATTRIBUTE
191224
void *__dfsw_memcpy(void *dest, const void *src, size_t n,
192225
dfsan_label dest_label, dfsan_label src_label,
193226
dfsan_label n_label, dfsan_label *ret_label) {
194-
*ret_label = 0;
227+
*ret_label = dest_label;
195228
return dfsan_memcpy(dest, src, n);
196229
}
197230

@@ -200,7 +233,7 @@ void *__dfsw_memset(void *s, int c, size_t n,
200233
dfsan_label s_label, dfsan_label c_label,
201234
dfsan_label n_label, dfsan_label *ret_label) {
202235
dfsan_memset(s, c, c_label, n);
203-
*ret_label = 0;
236+
*ret_label = s_label;
204237
return s;
205238
}
206239

lib/dfsan/lit_tests/custom.c

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
// RUN: %clang_dfsan -m64 %s -o %t && %t
2-
// RUN: %clang_dfsan -mllvm -dfsan-args-abi -m64 %s -o %t && %t
1+
// RUN: %clang_dfsan -m64 %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %t
2+
// RUN: %clang_dfsan -mllvm -dfsan-args-abi -m64 %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %t
3+
// RUN: %clang_dfsan -DSTRICT_DATA_DEPENDENCIES -m64 %s -o %t && %t
4+
// RUN: %clang_dfsan -DSTRICT_DATA_DEPENDENCIES -mllvm -dfsan-args-abi -m64 %s -o %t && %t
35

46
// Tests custom implementations of various glibc functions.
57

@@ -75,7 +77,11 @@ void test_memcmp() {
7577

7678
int rv = memcmp(str1, str2, sizeof(str1));
7779
assert(rv < 0);
80+
#ifdef STRICT_DATA_DEPENDENCIES
81+
ASSERT_ZERO_LABEL(rv);
82+
#else
7883
ASSERT_LABEL(rv, i_j_label);
84+
#endif
7985
}
8086

8187
void test_memcpy() {
@@ -108,7 +114,11 @@ void test_strcmp() {
108114

109115
int rv = strcmp(str1, str2);
110116
assert(rv < 0);
117+
#ifdef STRICT_DATA_DEPENDENCIES
118+
ASSERT_ZERO_LABEL(rv);
119+
#else
111120
ASSERT_LABEL(rv, i_j_label);
121+
#endif
112122
}
113123

114124
void test_strlen() {
@@ -117,7 +127,11 @@ void test_strlen() {
117127

118128
int rv = strlen(str1);
119129
assert(rv == 4);
130+
#ifdef STRICT_DATA_DEPENDENCIES
131+
ASSERT_ZERO_LABEL(rv);
132+
#else
120133
ASSERT_LABEL(rv, i_label);
134+
#endif
121135
}
122136

123137
void test_strdup() {
@@ -160,7 +174,11 @@ void test_strncmp() {
160174

161175
int rv = strncmp(str1, str2, sizeof(str1));
162176
assert(rv < 0);
177+
#ifdef STRICT_DATA_DEPENDENCIES
178+
ASSERT_ZERO_LABEL(rv);
179+
#else
163180
ASSERT_LABEL(rv, dfsan_union(i_label, j_label));
181+
#endif
164182

165183
rv = strncmp(str1, str2, 3);
166184
assert(rv == 0);
@@ -175,11 +193,19 @@ void test_strcasecmp() {
175193

176194
int rv = strcasecmp(str1, str2);
177195
assert(rv < 0);
196+
#ifdef STRICT_DATA_DEPENDENCIES
197+
ASSERT_ZERO_LABEL(rv);
198+
#else
178199
ASSERT_LABEL(rv, dfsan_union(i_label, j_label));
200+
#endif
179201

180202
rv = strcasecmp(str1, str3);
181203
assert(rv == 0);
204+
#ifdef STRICT_DATA_DEPENDENCIES
205+
ASSERT_ZERO_LABEL(rv);
206+
#else
182207
ASSERT_LABEL(rv, dfsan_union(i_label, j_label));
208+
#endif
183209
}
184210

185211
void test_strncasecmp() {
@@ -189,7 +215,11 @@ void test_strncasecmp() {
189215

190216
int rv = strncasecmp(str1, str2, sizeof(str1));
191217
assert(rv < 0);
218+
#ifdef STRICT_DATA_DEPENDENCIES
219+
ASSERT_ZERO_LABEL(rv);
220+
#else
192221
ASSERT_LABEL(rv, dfsan_union(i_label, j_label));
222+
#endif
193223

194224
rv = strncasecmp(str1, str2, 3);
195225
assert(rv == 0);
@@ -206,11 +236,19 @@ void test_strchr() {
206236

207237
crv = strchr(str1, '1');
208238
assert(crv == &str1[3]);
239+
#ifdef STRICT_DATA_DEPENDENCIES
240+
ASSERT_ZERO_LABEL(crv);
241+
#else
209242
ASSERT_LABEL(crv, i_label);
243+
#endif
210244

211245
crv = strchr(str1, 'x');
212246
assert(!crv);
247+
#ifdef STRICT_DATA_DEPENDENCIES
248+
ASSERT_ZERO_LABEL(crv);
249+
#else
213250
ASSERT_LABEL(crv, i_label);
251+
#endif
214252
}
215253

216254
void test_calloc() {

0 commit comments

Comments
 (0)