1*89a1d03eSRichard // RUN: %check_clang_tidy %s bugprone-not-null-terminated-result %t -- \
2*89a1d03eSRichard // RUN: -- -std=c11 -I %S/Inputs/not-null-terminated-result
3*89a1d03eSRichard
4*89a1d03eSRichard #include "not-null-terminated-result-c.h"
5*89a1d03eSRichard
6*89a1d03eSRichard #define __STDC_LIB_EXT1__ 1
7*89a1d03eSRichard #define __STDC_WANT_LIB_EXT1__ 1
8*89a1d03eSRichard
9*89a1d03eSRichard //===----------------------------------------------------------------------===//
10*89a1d03eSRichard // memcpy() - destination array tests
11*89a1d03eSRichard //===----------------------------------------------------------------------===//
12*89a1d03eSRichard
bad_memcpy_not_just_char_dest(const char * src)13*89a1d03eSRichard void bad_memcpy_not_just_char_dest(const char *src) {
14*89a1d03eSRichard unsigned char dest00[13];
15*89a1d03eSRichard memcpy(dest00, src, strlen(src));
16*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'memcpy' is not null-terminated [bugprone-not-null-terminated-result]
17*89a1d03eSRichard // CHECK-FIXES: unsigned char dest00[14];
18*89a1d03eSRichard // CHECK-FIXES-NEXT: strcpy_s((char *)dest00, 14, src);
19*89a1d03eSRichard }
20*89a1d03eSRichard
good_memcpy_not_just_char_dest(const char * src)21*89a1d03eSRichard void good_memcpy_not_just_char_dest(const char *src) {
22*89a1d03eSRichard unsigned char dst00[14];
23*89a1d03eSRichard strcpy_s((char *)dst00, 14, src);
24*89a1d03eSRichard }
25*89a1d03eSRichard
bad_memcpy_known_dest(const char * src)26*89a1d03eSRichard void bad_memcpy_known_dest(const char *src) {
27*89a1d03eSRichard char dest01[13];
28*89a1d03eSRichard memcpy(dest01, src, strlen(src));
29*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'memcpy' is not null-terminated [bugprone-not-null-terminated-result]
30*89a1d03eSRichard // CHECK-FIXES: char dest01[14];
31*89a1d03eSRichard // CHECK-FIXES: strcpy_s(dest01, 14, src);
32*89a1d03eSRichard }
33*89a1d03eSRichard
good_memcpy_known_dest(const char * src)34*89a1d03eSRichard void good_memcpy_known_dest(const char *src) {
35*89a1d03eSRichard char dst01[14];
36*89a1d03eSRichard strcpy_s(dst01, 14, src);
37*89a1d03eSRichard }
38*89a1d03eSRichard
39*89a1d03eSRichard //===----------------------------------------------------------------------===//
40*89a1d03eSRichard // memcpy() - length tests
41*89a1d03eSRichard //===----------------------------------------------------------------------===//
42*89a1d03eSRichard
bad_memcpy_full_source_length(const char * src)43*89a1d03eSRichard void bad_memcpy_full_source_length(const char *src) {
44*89a1d03eSRichard char dest20[13];
45*89a1d03eSRichard memcpy(dest20, src, strlen(src));
46*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'memcpy' is not null-terminated [bugprone-not-null-terminated-result]
47*89a1d03eSRichard // CHECK-FIXES: char dest20[14];
48*89a1d03eSRichard // CHECK-FIXES-NEXT: strcpy_s(dest20, 14, src);
49*89a1d03eSRichard }
50*89a1d03eSRichard
good_memcpy_full_source_length(const char * src)51*89a1d03eSRichard void good_memcpy_full_source_length(const char *src) {
52*89a1d03eSRichard char dst20[14];
53*89a1d03eSRichard strcpy_s(dst20, 14, src);
54*89a1d03eSRichard }
55*89a1d03eSRichard
bad_memcpy_partial_source_length(const char * src)56*89a1d03eSRichard void bad_memcpy_partial_source_length(const char *src) {
57*89a1d03eSRichard char dest21[13];
58*89a1d03eSRichard memcpy(dest21, src, strlen(src) - 1);
59*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'memcpy' is not null-terminated [bugprone-not-null-terminated-result]
60*89a1d03eSRichard // CHECK-FIXES: char dest21[14];
61*89a1d03eSRichard // CHECK-FIXES-NEXT: strncpy_s(dest21, 14, src, strlen(src) - 1);
62*89a1d03eSRichard }
63*89a1d03eSRichard
good__memcpy_partial_source_length(const char * src)64*89a1d03eSRichard void good__memcpy_partial_source_length(const char *src) {
65*89a1d03eSRichard char dst21[14];
66*89a1d03eSRichard strncpy_s(dst21, 14, src, strlen(src) - 1);
67*89a1d03eSRichard }
68*89a1d03eSRichard
69*89a1d03eSRichard //===----------------------------------------------------------------------===//
70*89a1d03eSRichard // memcpy_s() - destination array tests
71*89a1d03eSRichard //===----------------------------------------------------------------------===//
72*89a1d03eSRichard
bad_memcpy_s_unknown_dest(char * dest40,const char * src)73*89a1d03eSRichard void bad_memcpy_s_unknown_dest(char *dest40, const char *src) {
74*89a1d03eSRichard memcpy_s(dest40, 13, src, strlen(src));
75*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'memcpy_s' is not null-terminated [bugprone-not-null-terminated-result]
76*89a1d03eSRichard // CHECK-FIXES: strcpy_s(dest40, 13, src);
77*89a1d03eSRichard }
78*89a1d03eSRichard
good_memcpy_s_unknown_dest(char * dst40,const char * src)79*89a1d03eSRichard void good_memcpy_s_unknown_dest(char *dst40, const char *src) {
80*89a1d03eSRichard strcpy_s(dst40, 13, src);
81*89a1d03eSRichard }
82*89a1d03eSRichard
bad_memcpy_s_known_dest(const char * src)83*89a1d03eSRichard void bad_memcpy_s_known_dest(const char *src) {
84*89a1d03eSRichard char dest41[13];
85*89a1d03eSRichard memcpy_s(dest41, 13, src, strlen(src));
86*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'memcpy_s' is not null-terminated [bugprone-not-null-terminated-result]
87*89a1d03eSRichard // CHECK-FIXES: char dest41[14];
88*89a1d03eSRichard // CHECK-FIXES-NEXT: strcpy_s(dest41, 14, src);
89*89a1d03eSRichard }
90*89a1d03eSRichard
good_memcpy_s_known_dest(const char * src)91*89a1d03eSRichard void good_memcpy_s_known_dest(const char *src) {
92*89a1d03eSRichard char dst41[14];
93*89a1d03eSRichard strcpy_s(dst41, 14, src);
94*89a1d03eSRichard }
95*89a1d03eSRichard
96*89a1d03eSRichard //===----------------------------------------------------------------------===//
97*89a1d03eSRichard // memcpy_s() - length tests
98*89a1d03eSRichard //===----------------------------------------------------------------------===//
99*89a1d03eSRichard
bad_memcpy_s_full_source_length(const char * src)100*89a1d03eSRichard void bad_memcpy_s_full_source_length(const char *src) {
101*89a1d03eSRichard char dest60[13];
102*89a1d03eSRichard memcpy_s(dest60, 13, src, strlen(src));
103*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'memcpy_s' is not null-terminated [bugprone-not-null-terminated-result]
104*89a1d03eSRichard // CHECK-FIXES: char dest60[14];
105*89a1d03eSRichard // CHECK-FIXES-NEXT: strcpy_s(dest60, 14, src);
106*89a1d03eSRichard }
107*89a1d03eSRichard
good_memcpy_s_full_source_length(const char * src)108*89a1d03eSRichard void good_memcpy_s_full_source_length(const char *src) {
109*89a1d03eSRichard char dst60[14];
110*89a1d03eSRichard strcpy_s(dst60, 14, src);
111*89a1d03eSRichard }
112*89a1d03eSRichard
bad_memcpy_s_partial_source_length(const char * src)113*89a1d03eSRichard void bad_memcpy_s_partial_source_length(const char *src) {
114*89a1d03eSRichard char dest61[13];
115*89a1d03eSRichard memcpy_s(dest61, 13, src, strlen(src) - 1);
116*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the result from calling 'memcpy_s' is not null-terminated [bugprone-not-null-terminated-result]
117*89a1d03eSRichard // CHECK-FIXES: char dest61[14];
118*89a1d03eSRichard // CHECK-FIXES-NEXT: strncpy_s(dest61, 14, src, strlen(src) - 1);
119*89a1d03eSRichard }
120*89a1d03eSRichard
good_memcpy_s_partial_source_length(const char * src)121*89a1d03eSRichard void good_memcpy_s_partial_source_length(const char *src) {
122*89a1d03eSRichard char dst61[14];
123*89a1d03eSRichard strncpy_s(dst61, 14, src, strlen(src) - 1);
124*89a1d03eSRichard }
125