summaryrefslogtreecommitdiff
path: root/test/msan
diff options
context:
space:
mode:
Diffstat (limited to 'test/msan')
-rw-r--r--test/msan/Linux/sendmsg.cc31
-rw-r--r--test/msan/alloca.cc25
-rw-r--r--test/msan/fread_fwrite.cc34
-rw-r--r--test/msan/getloadavg.cc16
-rw-r--r--test/msan/ioctl.cc2
-rw-r--r--test/msan/ioctl_custom.cc2
-rw-r--r--test/msan/wcsncpy.cc38
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