1 // RUN: %check_clang_tidy %s bugprone-not-null-terminated-result %t -- \
2 // RUN: -- -std=c++11 -I %S/Inputs/bugprone-not-null-terminated-result
3
4 #include "not-null-terminated-result-cxx.h"
5
6 #define __STDC_LIB_EXT1__ 1
7 #define __STDC_WANT_LIB_EXT1__ 1
8
9 //===----------------------------------------------------------------------===//
10 // wmemcpy() - destination array tests
11 //===----------------------------------------------------------------------===//
12
bad_wmemcpy_known_dest(const wchar_t * src)13 void bad_wmemcpy_known_dest(const wchar_t *src) {
14 wchar_t dest01[13];
15 wmemcpy(dest01, src, wcslen(src));
16 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'wmemcpy' is not null-terminated [bugprone-not-null-terminated-result]
17 // CHECK-FIXES: wchar_t dest01[14];
18 // CHECK-FIXES-NEXT: wcscpy_s(dest01, src);
19 }
20
good_wmemcpy_known_dest(const wchar_t * src)21 void good_wmemcpy_known_dest(const wchar_t *src) {
22 wchar_t dst01[14];
23 wcscpy_s(dst01, src);
24 }
25
26 //===----------------------------------------------------------------------===//
27 // wmemcpy() - length tests
28 //===----------------------------------------------------------------------===//
29
bad_wmemcpy_full_source_length(const wchar_t * src)30 void bad_wmemcpy_full_source_length(const wchar_t *src) {
31 wchar_t dest20[13];
32 wmemcpy(dest20, src, wcslen(src));
33 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'wmemcpy' is not null-terminated [bugprone-not-null-terminated-result]
34 // CHECK-FIXES: wchar_t dest20[14];
35 // CHECK-FIXES-NEXT: wcscpy_s(dest20, src);
36 }
37
good_wmemcpy_full_source_length(const wchar_t * src)38 void good_wmemcpy_full_source_length(const wchar_t *src) {
39 wchar_t dst20[14];
40 wcscpy_s(dst20, src);
41 }
42
bad_wmemcpy_partial_source_length(const wchar_t * src)43 void bad_wmemcpy_partial_source_length(const wchar_t *src) {
44 wchar_t dest21[13];
45 wmemcpy(dest21, src, wcslen(src) - 1);
46 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'wmemcpy' is not null-terminated [bugprone-not-null-terminated-result]
47 // CHECK-FIXES: wchar_t dest21[14];
48 // CHECK-FIXES-NEXT: wcsncpy_s(dest21, src, wcslen(src) - 1);
49 }
50
good_wmemcpy_partial_source_length(const wchar_t * src)51 void good_wmemcpy_partial_source_length(const wchar_t *src) {
52 wchar_t dst21[14];
53 wcsncpy_s(dst21, src, wcslen(src) - 1);
54 }
55
56 //===----------------------------------------------------------------------===//
57 // wmemcpy_s() - destination array tests
58 //===----------------------------------------------------------------------===//
59
bad_wmemcpy_s_unknown_dest(wchar_t * dest40,const wchar_t * src)60 void bad_wmemcpy_s_unknown_dest(wchar_t *dest40, const wchar_t *src) {
61 wmemcpy_s(dest40, 13, src, wcslen(src));
62 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'wmemcpy_s' is not null-terminated [bugprone-not-null-terminated-result]
63 // CHECK-FIXES: wcscpy_s(dest40, 13, src);
64 }
65
good_wmemcpy_s_unknown_dest(wchar_t * dst40,const wchar_t * src)66 void good_wmemcpy_s_unknown_dest(wchar_t *dst40, const wchar_t *src) {
67 wcscpy_s(dst40, 13, src);
68 }
69
bad_wmemcpy_s_known_dest(const wchar_t * src)70 void bad_wmemcpy_s_known_dest(const wchar_t *src) {
71 wchar_t dest41[13];
72 wmemcpy_s(dest41, 13, src, wcslen(src));
73 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'wmemcpy_s' is not null-terminated [bugprone-not-null-terminated-result]
74 // CHECK-FIXES: wchar_t dest41[14];
75 // CHECK-FIXES-NEXT: wcscpy_s(dest41, src);
76 }
77
good_wmemcpy_s_known_dest(const wchar_t * src)78 void good_wmemcpy_s_known_dest(const wchar_t *src) {
79 wchar_t dst41[13];
80 wcscpy_s(dst41, src);
81 }
82
83 //===----------------------------------------------------------------------===//
84 // wmemcpy_s() - length tests
85 //===----------------------------------------------------------------------===//
86
bad_wmemcpy_s_full_source_length(const wchar_t * src)87 void bad_wmemcpy_s_full_source_length(const wchar_t *src) {
88 wchar_t dest60[13];
89 wmemcpy_s(dest60, 13, src, wcslen(src));
90 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'wmemcpy_s' is not null-terminated [bugprone-not-null-terminated-result]
91 // CHECK-FIXES: wchar_t dest60[14];
92 // CHECK-FIXES-NEXT: wcscpy_s(dest60, src);
93 }
94
good_wmemcpy_s_full_source_length(const wchar_t * src)95 void good_wmemcpy_s_full_source_length(const wchar_t *src) {
96 wchar_t dst60[13];
97 wcscpy_s(dst60, src);
98 }
99
bad_wmemcpy_s_partial_source_length(const wchar_t * src)100 void bad_wmemcpy_s_partial_source_length(const wchar_t *src) {
101 wchar_t dest61[13];
102 wmemcpy_s(dest61, 13, src, wcslen(src) - 1);
103 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'wmemcpy_s' is not null-terminated [bugprone-not-null-terminated-result]
104 // CHECK-FIXES: wchar_t dest61[14];
105 // CHECK-FIXES-NEXT: wcsncpy_s(dest61, src, wcslen(src) - 1);
106 }
107
good_wmemcpy_s_partial_source_length(const wchar_t * src)108 void good_wmemcpy_s_partial_source_length(const wchar_t *src) {
109 wchar_t dst61[13];
110 wcsncpy_s(dst61, src, wcslen(src) - 1);
111 }
112