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