diff options
Diffstat (limited to 'test/msan')
| -rw-r--r-- | test/msan/Linux/sendmsg.cc | 31 | ||||
| -rw-r--r-- | test/msan/alloca.cc | 25 | ||||
| -rw-r--r-- | test/msan/fread_fwrite.cc | 34 | ||||
| -rw-r--r-- | test/msan/getloadavg.cc | 16 | ||||
| -rw-r--r-- | test/msan/ioctl.cc | 2 | ||||
| -rw-r--r-- | test/msan/ioctl_custom.cc | 2 | ||||
| -rw-r--r-- | test/msan/wcsncpy.cc | 38 |
7 files changed, 137 insertions, 11 deletions
diff --git a/test/msan/Linux/sendmsg.cc b/test/msan/Linux/sendmsg.cc index 6a8ef83c118b..4fc6c88cc5dd 100644 --- a/test/msan/Linux/sendmsg.cc +++ b/test/msan/Linux/sendmsg.cc @@ -33,17 +33,31 @@ int main() { char buf[kBufSize] = {0}; pthread_t client_thread; struct sockaddr_in serveraddr; - - sockfd = socket(AF_INET, SOCK_DGRAM, 0); + struct sockaddr_in6 serveraddr6; memset(&serveraddr, 0, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); serveraddr.sin_port = 0; - - bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); + struct sockaddr *addr = (struct sockaddr *)&serveraddr; socklen_t addrlen = sizeof(serveraddr); - getsockname(sockfd, (struct sockaddr *)&serveraddr, &addrlen); + + sockfd = socket(addr->sa_family, SOCK_DGRAM, 0); + if (sockfd <= 0) { + // Try to fall-back to IPv6 + memset(&serveraddr6, 0, sizeof(serveraddr6)); + serveraddr6.sin6_family = AF_INET6; + serveraddr6.sin6_addr = in6addr_any; + serveraddr6.sin6_port = 0; + addr = (struct sockaddr *)&serveraddr6; + addrlen = sizeof(serveraddr6); + + sockfd = socket(addr->sa_family, SOCK_DGRAM, 0); + } + assert(sockfd > 0); + + bind(sockfd, addr, addrlen); + getsockname(sockfd, addr, &addrlen); #if defined(POISON) __msan_poison(buf + 7, 1); @@ -52,7 +66,7 @@ int main() { #if defined(SENDMSG) struct iovec iov[2] = {{buf, 5}, {buf + 5, 5}}; struct msghdr msg; - msg.msg_name = &serveraddr; + msg.msg_name = addr; msg.msg_namelen = addrlen; msg.msg_iov = iov; msg.msg_iovlen = 2; @@ -62,14 +76,13 @@ int main() { #endif #if defined(SEND) - ret = connect(sockfd, (struct sockaddr *)&serveraddr, addrlen); + ret = connect(sockfd, addr, addrlen); assert(ret == 0); ret = send(sockfd, buf, kBufSize, 0); // SEND: Uninitialized bytes in __interceptor_send at offset 7 inside [{{.*}}, 10) assert(ret > 0); #elif defined(SENDTO) - ret = - sendto(sockfd, buf, kBufSize, 0, (struct sockaddr *)&serveraddr, addrlen); + ret = sendto(sockfd, buf, kBufSize, 0, addr, addrlen); // SENDTO: Uninitialized bytes in __interceptor_sendto at offset 7 inside [{{.*}}, 10) assert(ret > 0); #elif defined(SENDMSG) diff --git a/test/msan/alloca.cc b/test/msan/alloca.cc new file mode 100644 index 000000000000..3472361e4b01 --- /dev/null +++ b/test/msan/alloca.cc @@ -0,0 +1,25 @@ +// RUN: %clangxx_msan -O0 -g %s -o %t && %run %t +// RUN: %clangxx_msan -O3 -g %s -o %t && %run %t + +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <sanitizer/msan_interface.h> + +int main(void) { + char *p = (char *)alloca(16); + assert(0 == __msan_test_shadow(p, 16)); + assert(0 == __msan_test_shadow(p + 15, 1)); + + memset(p, 0, 16); + assert(-1 == __msan_test_shadow(p, 16)); + + volatile int x = 0; + char * volatile q = (char *)alloca(42 * x); + assert(-1 == __msan_test_shadow(p, 16)); + + int r[x]; + int *volatile r2 = r; + assert(-1 == __msan_test_shadow(p, 16)); +} diff --git a/test/msan/fread_fwrite.cc b/test/msan/fread_fwrite.cc new file mode 100644 index 000000000000..3d500342a1eb --- /dev/null +++ b/test/msan/fread_fwrite.cc @@ -0,0 +1,34 @@ +// RUN: %clangxx_msan -g %s -o %t +// RUN: not %t 2>&1 | FileCheck %s +// RUN: %t 1 + +#include <stdio.h> +#include <stdlib.h> + +int test_fread() { + FILE *f = fopen("/dev/zero", "r"); + char c; + unsigned read = fread(&c, sizeof(c), 1, f); + fclose(f); + if (c == '1') // No error + return 1; + return 0; +} + +int test_fwrite() { + FILE *f = fopen("/dev/null", "w"); + char c; + if (fwrite(&c, sizeof(c), 1, f) != sizeof(c)) // BOOM + return 1; + return fclose(f); +} + +int main(int argc, char *argv[]) { + if (argc > 1) + test_fread(); + else + test_fwrite(); + return 0; +} + +// CHECK: Uninitialized bytes in __interceptor_fwrite at offset 0 inside diff --git a/test/msan/getloadavg.cc b/test/msan/getloadavg.cc new file mode 100644 index 000000000000..7facd580daf0 --- /dev/null +++ b/test/msan/getloadavg.cc @@ -0,0 +1,16 @@ +// RUN: %clangxx_msan -O0 -g %s -o %t && %run %t + +#define _BSD_SOURCE +#include <assert.h> +#include <stdlib.h> + +#include <sanitizer/msan_interface.h> + +int main(void) { + double x[4]; + int ret = getloadavg(x, 3); + assert(ret > 0); + assert(ret <= 3); + assert(__msan_test_shadow(x, sizeof(double) * ret) == -1); + assert(__msan_test_shadow(&x[ret], sizeof(double)) == 0); +} diff --git a/test/msan/ioctl.cc b/test/msan/ioctl.cc index e21ef636c604..66ac6e95b665 100644 --- a/test/msan/ioctl.cc +++ b/test/msan/ioctl.cc @@ -8,7 +8,7 @@ #include <unistd.h> int main(int argc, char **argv) { - int fd = socket(AF_INET, SOCK_DGRAM, 0); + int fd = socket(AF_UNIX, SOCK_DGRAM, 0); unsigned int z; int res = ioctl(fd, FIOGETOWN, &z); diff --git a/test/msan/ioctl_custom.cc b/test/msan/ioctl_custom.cc index 6df22d75e95e..eaab63384582 100644 --- a/test/msan/ioctl_custom.cc +++ b/test/msan/ioctl_custom.cc @@ -14,7 +14,7 @@ #include <unistd.h> int main(int argc, char **argv) { - int fd = socket(AF_INET, SOCK_STREAM, 0); + int fd = socket(AF_UNIX, SOCK_STREAM, 0); struct ifreq ifreqs[20]; struct ifconf ifc; diff --git a/test/msan/wcsncpy.cc b/test/msan/wcsncpy.cc new file mode 100644 index 000000000000..f582c37b7aab --- /dev/null +++ b/test/msan/wcsncpy.cc @@ -0,0 +1,38 @@ +// RUN: %clangxx_msan -fsanitize-memory-track-origins -O0 %s -o %t && not %run %t >%t.out 2>&1 +// RUN: FileCheck %s < %t.out && FileCheck %s < %t.out + +#include <assert.h> +#include <wchar.h> + +#include <sanitizer/msan_interface.h> + +int main() { + const wchar_t *s = L"abc"; + assert(wcslen(s) == 3); + + wchar_t s2[5]; + assert(wcsncpy(s2, s, 3) == s2); + assert(__msan_test_shadow(&s2, 5 * sizeof(wchar_t)) == 3 * sizeof(wchar_t)); + assert(wcsncpy(s2, s, 5) == s2); + assert(__msan_test_shadow(&s2, 5 * sizeof(wchar_t)) == -1); + + wchar_t s3[5]; + assert(wcsncpy(s3, s, 2) == s3); + assert(__msan_test_shadow(&s3, 5 * sizeof(wchar_t)) == 2 * sizeof(wchar_t)); + + __msan_allocated_memory(&s2[1], sizeof(wchar_t)); + wchar_t s4[5]; + assert(wcsncpy(s4, s2, 3) == s4); + __msan_check_mem_is_initialized(&s4, sizeof(s4)); +} +// CHECK: Uninitialized bytes in __msan_check_mem_is_initialized +// CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value +// CHECK: in main {{.*}}wcsncpy.cc:26 + +// CHECK: Uninitialized value was stored to memory at +// CHECK: in {{[^\s]*}}wcsncpy +// CHECK: in main {{.*}}wcsncpy.cc:25 + +// CHECK: Memory was marked as uninitialized +// CHECK: in __msan_allocated_memory +// CHECK: in main {{.*}}wcsncpy.cc:23 |
