[compiler-rt] 12bfea5 - [DFSan] Fix several bugs in dfsan custom callbacks test.

Andrew Browne via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 8 14:26:59 PST 2022


Author: Andrew Browne
Date: 2022-03-08T14:26:28-08:00
New Revision: 12bfea58b8ffc141c4440af998dc8ee1b309dbe4

URL: https://github.com/llvm/llvm-project/commit/12bfea58b8ffc141c4440af998dc8ee1b309dbe4
DIFF: https://github.com/llvm/llvm-project/commit/12bfea58b8ffc141c4440af998dc8ee1b309dbe4.diff

LOG: [DFSan] Fix several bugs in dfsan custom callbacks test.

Reviewed By: kda

Differential Revision: https://reviews.llvm.org/D121249

Added: 
    

Modified: 
    compiler-rt/test/dfsan/custom.cpp

Removed: 
    


################################################################################
diff  --git a/compiler-rt/test/dfsan/custom.cpp b/compiler-rt/test/dfsan/custom.cpp
index 97227fdc3f3ea..e15fb61d4dc47 100644
--- a/compiler-rt/test/dfsan/custom.cpp
+++ b/compiler-rt/test/dfsan/custom.cpp
@@ -1,5 +1,4 @@
 // RUN: %clang_dfsan %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t
-// RUN: %clang_dfsan %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t
 // RUN: %clang_dfsan -DSTRICT_DATA_DEPENDENCIES %s -o %t && %run %t
 // RUN: %clang_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 -mllvm -dfsan-combine-pointer-labels-on-load=false -DSTRICT_DATA_DEPENDENCIES %s -o %t && %run %t
 // RUN: %clang_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 -mllvm -dfsan-combine-pointer-labels-on-load=false %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t
@@ -828,8 +827,8 @@ void write_callback(int fd, const void *buf, size_t count) {
 }
 
 void test_dfsan_set_write_callback() {
-  char buf[] = "Sample chars";
-  int buf_len = strlen(buf);
+  char a_buf[] = "Sample chars";
+  int a_buf_len = strlen(a_buf);
 
   int fd = open("/dev/null", O_WRONLY);
 
@@ -837,59 +836,74 @@ void test_dfsan_set_write_callback() {
 
   write_callback_count = 0;
 
-  DEFINE_AND_SAVE_ORIGINS(buf)
+  DEFINE_AND_SAVE_ORIGINS(a_buf)
 
   // Callback should be invoked on every call to write().
-  int res = write(fd, buf, buf_len);
+  int res = write(fd, a_buf, a_buf_len);
   assert(write_callback_count == 1);
   ASSERT_READ_ZERO_LABEL(&res, sizeof(res));
   ASSERT_READ_ZERO_LABEL(&last_fd, sizeof(last_fd));
   ASSERT_READ_ZERO_LABEL(last_buf, sizeof(last_buf));
-  ASSERT_READ_ZERO_LABEL(&last_count, sizeof(last_count));
 
-  for (int i = 0; i < buf_len; ++i)
-    ASSERT_ORIGIN(last_buf[i], buf_o[i]);
+  for (int i = 0; i < a_buf_len; ++i)
+    ASSERT_ORIGIN(last_buf[i], a_buf_o[i]);
 
   ASSERT_ZERO_ORIGINS(&last_count, sizeof(last_count));
+  last_fd = 0;
+  last_buf = 0;
+  last_count = 0;
+
+  char b_buf[] = "Other chars";
+  int b_buf_len = strlen(b_buf);
+  // Create a separate variable so we can taint the pointer.
+  // We would always get a shadow of 0 for b_buf because it is a constant.
+  const unsigned char *buf = (const unsigned char *)b_buf;
 
   // Add a label to write() arguments.  Check that the labels are readable from
   // the values passed to the callback.
   dfsan_set_label(i_label, &fd, sizeof(fd));
-  dfsan_set_label(j_label, &(buf[3]), 1);
-  dfsan_set_label(k_label, &buf_len, sizeof(buf_len));
+  dfsan_set_label(j_label, &buf, sizeof(buf)); // ptr
+  dfsan_set_label(k_label, &(b_buf[3]), 1);    // content
+  dfsan_set_label(m_label, &b_buf_len, sizeof(b_buf_len));
 
   dfsan_origin fd_o = dfsan_get_origin((long)fd);
-  dfsan_origin buf3_o = dfsan_get_origin((long)(buf[3]));
-  dfsan_origin buf_len_o = dfsan_get_origin((long)buf_len);
+  dfsan_origin b_buf3_o = dfsan_get_origin((long)(b_buf[3]));
+  dfsan_origin b_buf_len_o = dfsan_get_origin((long)b_buf_len);
 #ifndef ORIGIN_TRACKING
   (void)fd_o;
-  (void)buf3_o;
-  (void)buf_len_o;
+  (void)b_buf3_o;
+  (void)b_buf_len_o;
 #endif
+  DEFINE_AND_SAVE_ORIGINS(b_buf)
 
-  res = write(fd, buf, buf_len);
+  res = write(fd, buf, b_buf_len);
   assert(write_callback_count == 2);
+  assert(last_fd == fd);
+  assert(last_buf == (const unsigned char *)b_buf);
+  assert(last_count == b_buf_len);
+
   ASSERT_READ_ZERO_LABEL(&res, sizeof(res));
   ASSERT_READ_LABEL(&last_fd, sizeof(last_fd), i_label);
-  ASSERT_READ_LABEL(&last_buf[3], sizeof(last_buf[3]), j_label);
-  ASSERT_READ_LABEL(last_buf, sizeof(last_buf), j_label);
-  ASSERT_READ_LABEL(&last_count, sizeof(last_count), k_label);
+  ASSERT_READ_LABEL(&last_buf, sizeof(&last_buf), j_label);      // ptr
+  ASSERT_READ_LABEL(last_buf, last_count, k_label);              // content
+  ASSERT_READ_LABEL(&last_buf[3], sizeof(last_buf[3]), k_label); // content
+  ASSERT_READ_LABEL(&last_count, sizeof(last_count), m_label);
   ASSERT_ZERO_ORIGINS(&res, sizeof(res));
   ASSERT_INIT_ORIGINS(&last_fd, sizeof(last_fd), fd_o);
-  ASSERT_INIT_ORIGINS(&last_buf[3], sizeof(last_buf[3]), buf3_o);
+  ASSERT_INIT_ORIGINS(&last_buf[3], sizeof(last_buf[3]), b_buf3_o);
 
   // Origins are assigned for every 4 contiguous 4-aligned bytes. After
   // appending src to dst, origins of src can overwrite origins of dst if their
   // application adddresses are within an aligned range. Other origins are not
   // changed.
-  for (int i = 0; i < buf_len; ++i) {
+  for (int i = 0; i < b_buf_len; ++i) {
     size_t i_addr = size_t(&last_buf[i]);
     if (((size_t(&last_buf[3]) & ~3UL) > i_addr) ||
         (((size_t(&last_buf[3]) + 4) & ~3UL) <= i_addr))
-      ASSERT_ORIGIN(last_buf[i], buf_o[i]);
+      ASSERT_ORIGIN(last_buf[i], b_buf_o[i]);
   }
 
-  ASSERT_INIT_ORIGINS(&last_count, sizeof(last_count), buf_len_o);
+  ASSERT_INIT_ORIGINS(&last_count, sizeof(last_count), b_buf_len_o);
 
   dfsan_set_write_callback(NULL);
 }
@@ -1793,7 +1807,7 @@ void test_write() {
   // Label all arguments to write().
   dfsan_set_label(i_label, &(buf[3]), 1);
   dfsan_set_label(j_label, &fd, sizeof(fd));
-  dfsan_set_label(i_label, &len, sizeof(len));
+  dfsan_set_label(k_label, &len, sizeof(len));
 
   // The value returned by write() should have no label.
   res = write(fd, buf, len);


        


More information about the llvm-commits mailing list