1 | // RUN: %clangxx_msan -fsanitize-memory-track-origins -O0 %s -o %t && not %run %t >%t.out 2>&1 |
2 | // RUN: FileCheck %s < %t.out && FileCheck %s < %t.out |
3 | |
4 | // XFAIL: target=mips{{.*}} |
5 | |
6 | #include <assert.h> |
7 | #include <wchar.h> |
8 | |
9 | #include <sanitizer/msan_interface.h> |
10 | |
11 | int main() { |
12 | const wchar_t *s = L"abc" ; |
13 | assert(wcslen(s) == 3); |
14 | |
15 | wchar_t s2[5]; |
16 | assert(wcsncpy(s2, s, 3) == s2); |
17 | assert(__msan_test_shadow(&s2, 5 * sizeof(wchar_t)) == 3 * sizeof(wchar_t)); |
18 | assert(wcsncpy(s2, s, 5) == s2); |
19 | assert(__msan_test_shadow(&s2, 5 * sizeof(wchar_t)) == -1); |
20 | |
21 | wchar_t s3[5]; |
22 | assert(wcsncpy(s3, s, 2) == s3); |
23 | assert(__msan_test_shadow(&s3, 5 * sizeof(wchar_t)) == 2 * sizeof(wchar_t)); |
24 | |
25 | __msan_allocated_memory(data: &s2[1], size: sizeof(wchar_t)); |
26 | wchar_t s4[5]; |
27 | assert(wcsncpy(s4, s2, 3) == s4); |
28 | __msan_check_mem_is_initialized(x: &s4, size: sizeof(s4)); |
29 | } |
30 | // CHECK: Uninitialized bytes in __msan_check_mem_is_initialized |
31 | // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value |
32 | // CHECK: in main {{.*}}wcsncpy.cpp:28 |
33 | |
34 | // CHECK: Uninitialized value was stored to memory at |
35 | // CHECK: in {{[^\s]*}}wcsncpy |
36 | // CHECK: in main {{.*}}wcsncpy.cpp:27 |
37 | |
38 | // CHECK: Memory was marked as uninitialized |
39 | // CHECK: in __msan_allocated_memory |
40 | // CHECK: in main {{.*}}wcsncpy.cpp:25 |
41 | |