[compiler-rt] r197601 - [DFSan] New custom wrappers

Kostya Serebryany kcc at google.com
Wed Dec 18 22:32:03 PST 2013


I get this error now:

/home/kcc/llvm/projects/compiler-rt/lib/dfsan/dfsan_custom.cc:799:34:
error: sizeof on array function parameter will return size of 'int *'
instead of 'int [2]' [-Werror,-Wsizeof-array-argument]
    dfsan_set_label(0, sv, sizeof(sv));
                                 ^
/home/kcc/llvm/projects/compiler-rt/lib/dfsan/dfsan_custom.cc:792:59: note:
declared here
__dfsw_socketpair(int domain, int type, int protocol, int sv[2],
                                                          ^
1 error generated.


On Wed, Dec 18, 2013 at 11:25 PM, Lorenzo Martignoni
<martignlo at google.com>wrote:

> Author: martignlo
> Date: Wed Dec 18 13:25:34 2013
> New Revision: 197601
>
> URL: http://llvm.org/viewvc/llvm-project?rev=197601&view=rev
> Log:
> [DFSan] New custom wrappers
>
> Added the following custom wrappers:
>   strstr
>   strrchr
>   memchr
>   nanosleep
>   socketpair
>
> Tweaked a couple of existing wrappers: if a wrapper returns a pointers
> derived
> from an input pointer, then return the label of the input pointer
>
> Sorted tests invocation
>
> Differential Revision: D2354
>
> Modified:
>     compiler-rt/trunk/lib/dfsan/dfsan_custom.cc
>     compiler-rt/trunk/lib/dfsan/done_abilist.txt
>     compiler-rt/trunk/lib/dfsan/lit_tests/custom.c
>
> Modified: compiler-rt/trunk/lib/dfsan/dfsan_custom.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/dfsan/dfsan_custom.cc?rev=197601&r1=197600&r2=197601&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/dfsan/dfsan_custom.cc (original)
> +++ compiler-rt/trunk/lib/dfsan/dfsan_custom.cc Wed Dec 18 13:25:34 2013
> @@ -70,7 +70,8 @@ SANITIZER_INTERFACE_ATTRIBUTE char *__df
>        if (flags().strict_data_dependencies) {
>          *ret_label = s_label;
>        } else {
> -        *ret_label = dfsan_union(dfsan_read_label(s, i + 1), c_label);
> +        *ret_label = dfsan_union(dfsan_read_label(s, i + 1),
> +                                 dfsan_union(s_label, c_label));
>        }
>        return s[i] == 0 ? 0 : const_cast<char *>(s+i);
>      }
> @@ -258,7 +259,7 @@ __dfsw_strncpy(char *s1, const char *s2,
>      dfsan_memcpy(s1, s2, n);
>    }
>
> -  *ret_label = 0;
> +  *ret_label = s1_label;
>    return s1;
>  }
>
> @@ -720,4 +721,83 @@ int __dfsw_gettimeofday(struct timeval *
>    *ret_label = 0;
>    return ret;
>  }
> +
> +SANITIZER_INTERFACE_ATTRIBUTE void *__dfsw_memchr(void *s, int c, size_t
> n,
> +                                                  dfsan_label s_label,
> +                                                  dfsan_label c_label,
> +                                                  dfsan_label n_label,
> +                                                  dfsan_label *ret_label)
> {
> +  void *ret = memchr(s, c, n);
> +  if (flags().strict_data_dependencies) {
> +    *ret_label = ret ? s_label : 0;
> +  } else {
> +    size_t len =
> +        ret ? reinterpret_cast<char *>(ret) - reinterpret_cast<char *>(s)
> + 1
> +            : n;
> +    *ret_label =
> +        dfsan_union(dfsan_read_label(s, len), dfsan_union(s_label,
> c_label));
> +  }
> +  return ret;
> +}
> +
> +SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strrchr(char *s, int c,
> +                                                   dfsan_label s_label,
> +                                                   dfsan_label c_label,
> +                                                   dfsan_label
> *ret_label) {
> +  char *ret = strrchr(s, c);
> +  if (flags().strict_data_dependencies) {
> +    *ret_label = ret ? s_label : 0;
> +  } else {
> +    *ret_label =
> +        dfsan_union(dfsan_read_label(s, strlen(s) + 1),
> +                    dfsan_union(s_label, c_label));
> +  }
> +
> +  return ret;
> +}
> +
> +SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strstr(char *haystack, char
> *needle,
> +                                                  dfsan_label
> haystack_label,
> +                                                  dfsan_label
> needle_label,
> +                                                  dfsan_label *ret_label)
> {
> +  char *ret = strstr(haystack, needle);
> +  if (flags().strict_data_dependencies) {
> +    *ret_label = ret ? haystack_label : 0;
> +  } else {
> +    size_t len = ret ? ret + strlen(needle) - haystack : strlen(haystack)
> + 1;
> +    *ret_label =
> +        dfsan_union(dfsan_read_label(haystack, len),
> +                    dfsan_union(dfsan_read_label(needle, strlen(needle) +
> 1),
> +                                dfsan_union(haystack_label,
> needle_label)));
> +  }
> +
> +  return ret;
> +}
> +
> +SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_nanosleep(const struct timespec
> *req,
> +                                                   struct timespec *rem,
> +                                                   dfsan_label req_label,
> +                                                   dfsan_label rem_label,
> +                                                   dfsan_label
> *ret_label) {
> +  int ret = nanosleep(req, rem);
> +  *ret_label = 0;
> +  if (ret == -1) {
> +    // Interrupted by a signal, rem is filled with the remaining time.
> +    dfsan_set_label(0, rem, sizeof(struct timespec));
> +  }
> +  return ret;
> +}
> +
> +SANITIZER_INTERFACE_ATTRIBUTE int
> +__dfsw_socketpair(int domain, int type, int protocol, int sv[2],
> +                  dfsan_label domain_label, dfsan_label type_label,
> +                  dfsan_label protocol_label, dfsan_label sv_label,
> +                  dfsan_label *ret_label) {
> +  int ret = socketpair(domain, type, protocol, sv);
> +  *ret_label = 0;
> +  if (ret == 0) {
> +    dfsan_set_label(0, sv, sizeof(sv));
> +  }
> +  return ret;
> +}
>  }
>
> Modified: compiler-rt/trunk/lib/dfsan/done_abilist.txt
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/dfsan/done_abilist.txt?rev=197601&r1=197600&r2=197601&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/dfsan/done_abilist.txt (original)
> +++ compiler-rt/trunk/lib/dfsan/done_abilist.txt Wed Dec 18 13:25:34 2013
> @@ -154,8 +154,10 @@ fun:get_current_dir_name=custom
>  fun:gethostname=custom
>  fun:getrlimit=custom
>  fun:getrusage=custom
> +fun:nanosleep=custom
>  fun:pread=custom
>  fun:read=custom
> +fun:socketpair=custom
>  fun:stat=custom
>  fun:time=custom
>
> @@ -177,6 +179,7 @@ fun:strtoull=custom
>
>  # Functions that produce an output that is computed from the input, but
> is not
>  # necessarily data dependent.
> +fun:memchr=custom
>  fun:memcmp=custom
>  fun:strcasecmp=custom
>  fun:strchr=custom
> @@ -184,6 +187,8 @@ fun:strcmp=custom
>  fun:strlen=custom
>  fun:strncasecmp=custom
>  fun:strncmp=custom
> +fun:strrchr=custom
> +fun:strstr=custom
>
>  # Functions that take a callback (wrap the callback manually).
>  fun:dl_iterate_phdr=custom
>
> Modified: compiler-rt/trunk/lib/dfsan/lit_tests/custom.c
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/dfsan/lit_tests/custom.c?rev=197601&r1=197600&r2=197601&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/dfsan/lit_tests/custom.c (original)
> +++ compiler-rt/trunk/lib/dfsan/lit_tests/custom.c Wed Dec 18 13:25:34 2013
> @@ -605,6 +605,103 @@ void test_dl_iterate_phdr() {
>    dl_iterate_phdr(dl_iterate_phdr_test_cb, (void *)3);
>  }
>
> +void test_strrchr() {
> +  char str1[] = "str1str1";
> +  dfsan_set_label(i_label, &str1[7], 1);
> +
> +  char *rv = strrchr(str1, 'r');
> +  assert(rv == &str1[6]);
> +#ifdef STRICT_DATA_DEPENDENCIES
> +  ASSERT_ZERO_LABEL(rv);
> +#else
> +  ASSERT_LABEL(rv, i_label);
> +#endif
> +}
> +
> +void test_strstr() {
> +  char str1[] = "str1str1";
> +  dfsan_set_label(i_label, &str1[3], 1);
> +  dfsan_set_label(j_label, &str1[5], 1);
> +
> +  char *rv = strstr(str1, "1s");
> +  assert(rv == &str1[3]);
> +#ifdef STRICT_DATA_DEPENDENCIES
> +  ASSERT_ZERO_LABEL(rv);
> +#else
> +  ASSERT_LABEL(rv, i_label);
> +#endif
> +
> +  rv = strstr(str1, "2s");
> +  assert(rv == NULL);
> +#ifdef STRICT_DATA_DEPENDENCIES
> +  ASSERT_ZERO_LABEL(rv);
> +#else
> +  ASSERT_LABEL(rv, i_j_label);
> +#endif
> +}
> +
> +void test_memchr() {
> +  char str1[] = "str1";
> +  dfsan_set_label(i_label, &str1[3], 1);
> +  dfsan_set_label(j_label, &str1[4], 1);
> +
> +  char *crv = memchr(str1, 'r', sizeof(str1));
> +  assert(crv == &str1[2]);
> +  ASSERT_ZERO_LABEL(crv);
> +
> +  crv = memchr(str1, '1', sizeof(str1));
> +  assert(crv == &str1[3]);
> +#ifdef STRICT_DATA_DEPENDENCIES
> +  ASSERT_ZERO_LABEL(crv);
> +#else
> +  ASSERT_LABEL(crv, i_label);
> +#endif
> +
> +  crv = memchr(str1, 'x', sizeof(str1));
> +  assert(!crv);
> +#ifdef STRICT_DATA_DEPENDENCIES
> +  ASSERT_ZERO_LABEL(crv);
> +#else
> +  ASSERT_LABEL(crv, i_j_label);
> +#endif
> +}
> +
> +void alarm_handler(int unused) {
> +  ;
> +}
> +
> +void test_nanosleep() {
> +  struct timespec req, rem;
> +  req.tv_sec = 1;
> +  req.tv_nsec = 0;
> +  dfsan_set_label(i_label, &rem, sizeof(rem));
> +
> +  // non interrupted
> +  int rv = nanosleep(&req, &rem);
> +  assert(rv == 0);
> +  ASSERT_ZERO_LABEL(rv);
> +  ASSERT_READ_LABEL(&rem, 1, i_label);
> +
> +  // interrupted by an alarm
> +  signal(SIGALRM, alarm_handler);
> +  req.tv_sec = 3;
> +  alarm(1);
> +  rv = nanosleep(&req, &rem);
> +  assert(rv == -1);
> +  ASSERT_ZERO_LABEL(rv);
> +  ASSERT_READ_ZERO_LABEL(&rem, sizeof(rem));
> +}
> +
> +void test_socketpair() {
> +  int fd[2];
> +
> +  dfsan_set_label(i_label, fd, sizeof(fd));
> +  int rv = socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);
> +  assert(rv == 0);
> +  ASSERT_ZERO_LABEL(rv);
> +  ASSERT_READ_ZERO_LABEL(fd, sizeof(fd));
> +}
> +
>  int main(void) {
>    i_label = dfsan_create_label("i", 0);
>    j_label = dfsan_create_label("j", 0);
> @@ -612,47 +709,50 @@ int main(void) {
>
>    test_calloc();
>    test_clock_gettime();
> +  test_ctime_r();
> +  test_dl_iterate_phdr();
>    test_dlopen();
> +  test_fgets();
>    test_fstat();
> +  test_get_current_dir_name();
> +  test_getcwd();
> +  test_gethostname();
> +  test_getpwuid_r();
> +  test_getrlimit();
> +  test_getrusage();
> +  test_gettimeofday();
> +  test_inet_pton();
> +  test_localtime_r();
> +  test_memchr();
>    test_memcmp();
>    test_memcpy();
>    test_memset();
> +  test_nanosleep();
> +  test_poll();
>    test_pread();
> +  test_pthread_create();
>    test_read();
> +  test_sched_getaffinity();
> +  test_select();
> +  test_sigaction();
> +  test_sigemptyset();
> +  test_socketpair();
>    test_stat();
>    test_strcasecmp();
>    test_strchr();
>    test_strcmp();
> +  test_strcpy();
>    test_strdup();
>    test_strlen();
>    test_strncasecmp();
>    test_strncmp();
>    test_strncpy();
> -
> -  test_ctime_r();
> -  test_fgets();
> -  test_getcwd();
> -  test_get_current_dir_name();
> -  test_gethostname();
> -  test_getrlimit();
> -  test_getrusage();
> -  test_strcpy();
> +  test_strrchr();
> +  test_strstr();
> +  test_strtod();
>    test_strtol();
>    test_strtoll();
> -  test_strtod();
>    test_strtoul();
>    test_strtoull();
>    test_time();
> -  test_inet_pton();
> -  test_localtime_r();
> -  test_getpwuid_r();
> -  test_poll();
> -  test_select();
> -  test_sched_getaffinity();
> -  test_sigemptyset();
> -  test_sigaction();
> -  test_gettimeofday();
> -
> -  test_pthread_create();
> -  test_dl_iterate_phdr();
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131219/134d86fe/attachment.html>


More information about the llvm-commits mailing list