[compiler-rt] r197601 - [DFSan] New custom wrappers
Lorenzo Martignoni
martignlo at google.com
Thu Dec 19 01:22:39 PST 2013
Thanks!
Lorenzo
On Thu, Dec 19, 2013 at 10:02 AM, Evgeniy Stepanov <
eugeni.stepanov at gmail.com> wrote:
> I've fixed it in r197665.
>
> On Thu, Dec 19, 2013 at 10:32 AM, Kostya Serebryany <kcc at google.com>
> wrote:
> > 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
> >
> >
> >
> > _______________________________________________
> > 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/833102d4/attachment.html>
More information about the llvm-commits
mailing list