string.c revision 0ef473f75426f0a95635d0a9dd567d27b07dbd5b
1a0decc9a2481f938e1675b4f7bbd58761a882a36Argyrios Kyrtzidis// RUN: %clang_cc1 -analyze -analyzer-checker=core.experimental.CString -analyzer-checker=core.experimental.UnreachableCode -analyzer-check-objc-mem -analyzer-store=region -verify %s 2a0decc9a2481f938e1675b4f7bbd58761a882a36Argyrios Kyrtzidis// RUN: %clang_cc1 -analyze -DUSE_BUILTINS -analyzer-checker=core.experimental.CString -analyzer-checker=core.experimental.UnreachableCode -analyzer-check-objc-mem -analyzer-store=region -verify %s 3a0decc9a2481f938e1675b4f7bbd58761a882a36Argyrios Kyrtzidis// RUN: %clang_cc1 -analyze -DVARIANT -analyzer-checker=core.experimental.CString -analyzer-checker=core.experimental.UnreachableCode -analyzer-check-objc-mem -analyzer-store=region -verify %s 4a0decc9a2481f938e1675b4f7bbd58761a882a36Argyrios Kyrtzidis// RUN: %clang_cc1 -analyze -DUSE_BUILTINS -DVARIANT -analyzer-checker=core.experimental.CString -analyzer-checker=core.experimental.UnreachableCode -analyzer-check-objc-mem -analyzer-store=region -verify %s 519c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 619c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose//===----------------------------------------------------------------------=== 719c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose// Declarations 819c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose//===----------------------------------------------------------------------=== 919c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 1019c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose// Some functions are so similar to each other that they follow the same code 1119c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose// path, such as memcpy and __memcpy_chk, or memcmp and bcmp. If VARIANT is 1219c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose// defined, make sure to use the variants instead to make sure they are still 1319c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose// checked by the analyzer. 1419c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 1519c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose// Some functions are implemented as builtins. These should be #defined as 1619c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose// BUILTIN(f), which will prepend "__builtin_" if USE_BUILTINS is defined. 1719c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 1819c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose// Functions that have variants and are also availabe as builtins should be 1919c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose// declared carefully! See memcpy() for an example. 2019c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 2119c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose#ifdef USE_BUILTINS 2219c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose# define BUILTIN(f) __builtin_ ## f 2319c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose#else /* USE_BUILTINS */ 2419c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose# define BUILTIN(f) f 2519c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose#endif /* USE_BUILTINS */ 2619c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 27e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define NULL 0 2819c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rosetypedef typeof(sizeof(int)) size_t; 2919c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 3019c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose//===----------------------------------------------------------------------=== 3119c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose// strlen() 3219c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose//===----------------------------------------------------------------------=== 3319c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 3419c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose#define strlen BUILTIN(strlen) 3519c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rosesize_t strlen(const char *s); 3619c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 3719c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rosevoid strlen_constant0() { 3819c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose if (strlen("123") != 3) 39a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // no-warning 4019c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose} 4119c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 4219c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rosevoid strlen_constant1() { 4319c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose const char *a = "123"; 4419c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose if (strlen(a) != 3) 45a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // no-warning 4619c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose} 4719c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 4819c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rosevoid strlen_constant2(char x) { 4919c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose char a[] = "123"; 50a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (strlen(a) != 3) 51a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // no-warning 5219c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose a[0] = x; 5319c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose if (strlen(a) != 3) 5419c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose (void)*(char*)0; // expected-warning{{null}} 5519c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose} 5619c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 5719c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rosesize_t strlen_null() { 5819c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose return strlen(0); // expected-warning{{Null pointer argument in call to byte string function}} 5919c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose} 6019c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 6119c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rosesize_t strlen_fn() { 6219c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose return strlen((char*)&strlen_fn); // expected-warning{{Argument to byte string function is the address of the function 'strlen_fn', which is not a null-terminated string}} 6319c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose} 6419c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 6519c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rosesize_t strlen_nonloc() { 6619c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Roselabel: 6719c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose return strlen((char*)&&label); // expected-warning{{Argument to byte string function is the address of the label 'label', which is not a null-terminated string}} 6819c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose} 69a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 70a5261549754fab80e30e893d8fa706bfb31e430aJordy Rosevoid strlen_subregion() { 71a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose struct two_strings { char a[2], b[2] }; 72a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose extern void use_two_strings(struct two_strings *); 73a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 74a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose struct two_strings z; 75a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose use_two_strings(&z); 76a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 77a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t a = strlen(z.a); 78a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose z.b[0] = 5; 79a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t b = strlen(z.a); 80a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (a == 0 && b != 0) 81a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // expected-warning{{never executed}} 82a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 83a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose use_two_strings(&z); 84a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 85a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t c = strlen(z.a); 86a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (a == 0 && c != 0) 87a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // expected-warning{{null}} 88a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose} 89a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 90a5261549754fab80e30e893d8fa706bfb31e430aJordy Roseextern void use_string(char *); 91a5261549754fab80e30e893d8fa706bfb31e430aJordy Rosevoid strlen_argument(char *x) { 92a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t a = strlen(x); 93a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t b = strlen(x); 94a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (a == 0 && b != 0) 95a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // expected-warning{{never executed}} 96a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 97a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose use_string(x); 98a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 99a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t c = strlen(x); 100a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (a == 0 && c != 0) 101a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // expected-warning{{null}} 102a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose} 103a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 104a5261549754fab80e30e893d8fa706bfb31e430aJordy Roseextern char global_str[]; 105a5261549754fab80e30e893d8fa706bfb31e430aJordy Rosevoid strlen_global() { 106a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t a = strlen(global_str); 107a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t b = strlen(global_str); 108a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (a == 0 && b != 0) 109a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // expected-warning{{never executed}} 110a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 111a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose // Call a function with unknown effects, which should invalidate globals. 112a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose use_string(0); 113a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 114a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t c = strlen(global_str); 115a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (a == 0 && c != 0) 116a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // expected-warning{{null}} 117a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose} 118a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 119a5261549754fab80e30e893d8fa706bfb31e430aJordy Rosevoid strlen_indirect(char *x) { 120a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t a = strlen(x); 121a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose char *p = x; 122a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose char **p2 = &p; 123a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t b = strlen(x); 124a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (a == 0 && b != 0) 125a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // expected-warning{{never executed}} 126a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 127a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose extern void use_string_ptr(char*const*); 128a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose use_string_ptr(p2); 129a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 130a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose size_t c = strlen(x); 131a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (a == 0 && c != 0) 132a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // expected-warning{{null}} 133a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose} 134a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose 135a5261549754fab80e30e893d8fa706bfb31e430aJordy Rosevoid strlen_liveness(const char *x) { 136a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (strlen(x) < 5) 137a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose return; 138a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose if (strlen(x) < 5) 139a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose (void)*(char*)0; // no-warning 140a5261549754fab80e30e893d8fa706bfb31e430aJordy Rose} 141e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 142e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose//===----------------------------------------------------------------------=== 143be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek// strnlen() 144be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek//===----------------------------------------------------------------------=== 145be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 146be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek#define strnlen BUILTIN(strnlen) 147be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremeneksize_t strnlen(const char *s, size_t maxlen); 148be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 149be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_constant0() { 150be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (strnlen("123", 10) != 3) 151be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // no-warning 152be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 153be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 154be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_constant1() { 155be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek const char *a = "123"; 156be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (strnlen(a, 10) != 3) 157be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // no-warning 158be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 159be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 160be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_constant2(char x) { 161be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek char a[] = "123"; 162be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (strnlen(a, 10) != 3) 163be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // no-warning 164be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek a[0] = x; 165be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (strnlen(a, 10) != 3) 166be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{null}} 167be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 168be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 169be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_constant4() { 170be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (strnlen("123456", 3) != 3) 171be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // no-warning 172be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 173be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 174be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_constant5() { 175be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek const char *a = "123456"; 176be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (strnlen(a, 3) != 3) 177be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // no-warning 178be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 179be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 180be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_constant6(char x) { 181be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek char a[] = "123456"; 182be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (strnlen(a, 3) != 3) 183be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // no-warning 184be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek a[0] = x; 185be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (strnlen(a, 3) != 3) 186be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{null}} 187be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 188be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 189be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremeneksize_t strnlen_null() { 190be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek return strnlen(0, 3); // expected-warning{{Null pointer argument in call to byte string function}} 191be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 192be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 193be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremeneksize_t strnlen_fn() { 194be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek return strnlen((char*)&strlen_fn, 3); // expected-warning{{Argument to byte string function is the address of the function 'strlen_fn', which is not a null-terminated string}} 195be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 196be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 197be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremeneksize_t strnlen_nonloc() { 198be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremeneklabel: 199be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek return strnlen((char*)&&label, 3); // expected-warning{{Argument to byte string function is the address of the label 'label', which is not a null-terminated string}} 200be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 201be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 202be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_subregion() { 203be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek struct two_stringsn { char a[2], b[2] }; 204be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek extern void use_two_stringsn(struct two_stringsn *); 205be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 206be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek struct two_stringsn z; 207be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek use_two_stringsn(&z); 208be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 209be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t a = strnlen(z.a, 10); 210be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek z.b[0] = 5; 211be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t b = strnlen(z.a, 10); 212be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (a == 0 && b != 0) 213be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{never executed}} 214be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 215be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek use_two_stringsn(&z); 216be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 217be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t c = strnlen(z.a, 10); 218be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (a == 0 && c != 0) 219be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{null}} 220be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 221be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 222be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekextern void use_stringn(char *); 223be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_argument(char *x) { 224be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t a = strnlen(x, 10); 225be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t b = strnlen(x, 10); 226be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (a == 0 && b != 0) 227be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{never executed}} 228be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 229be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek use_stringn(x); 230be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 231be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t c = strnlen(x, 10); 232be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (a == 0 && c != 0) 233be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{null}} 234be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 235be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 236be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekextern char global_strn[]; 237be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_global() { 238be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t a = strnlen(global_strn, 10); 239be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t b = strnlen(global_strn, 10); 240be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (a == 0 && b != 0) 241be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{never executed}} 242be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 243be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek // Call a function with unknown effects, which should invalidate globals. 244be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek use_stringn(0); 245be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 246be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t c = strnlen(global_str, 10); 247be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (a == 0 && c != 0) 248be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{null}} 249be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 250be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 251be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_indirect(char *x) { 252be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t a = strnlen(x, 10); 253be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek char *p = x; 254be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek char **p2 = &p; 255be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t b = strnlen(x, 10); 256be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (a == 0 && b != 0) 257be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{never executed}} 258be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 259be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek extern void use_stringn_ptr(char*const*); 260be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek use_stringn_ptr(p2); 261be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 262be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek size_t c = strnlen(x, 10); 263be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (a == 0 && c != 0) 264be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{null}} 265be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 266be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 267be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenekvoid strnlen_liveness(const char *x) { 268be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (strnlen(x, 10) < 5) 269be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek return; 270be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek if (strnlen(x, 10) < 5) 271be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // no-warning 272be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 273be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 274be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek//===----------------------------------------------------------------------=== 275e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose// strcpy() 276e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose//===----------------------------------------------------------------------=== 277e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 278e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#ifdef VARIANT 279e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 280e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define __strcpy_chk BUILTIN(__strcpy_chk) 281e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosechar *__strcpy_chk(char *restrict s1, const char *restrict s2, size_t destlen); 282e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 283e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define strcpy(a,b) __strcpy_chk(a,b,(size_t)-1) 284e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 285e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#else /* VARIANT */ 286e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 287e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define strcpy BUILTIN(strcpy) 288e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosechar *strcpy(char *restrict s1, const char *restrict s2); 289e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 290e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#endif /* VARIANT */ 291e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 292e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 293e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_null_dst(char *x) { 294e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose strcpy(NULL, x); // expected-warning{{Null pointer argument in call to byte string function}} 295e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 296e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 297e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_null_src(char *x) { 298e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose strcpy(x, NULL); // expected-warning{{Null pointer argument in call to byte string function}} 299e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 300e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 301e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_fn(char *x) { 302e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose strcpy(x, (char*)&strcpy_fn); // expected-warning{{Argument to byte string function is the address of the function 'strcpy_fn', which is not a null-terminated string}} 303e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 304e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 305e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_effects(char *x, char *y) { 306e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char a = x[0]; 307e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 308e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strcpy(x, y) != x) 309e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // no-warning 310e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 311e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(x) != strlen(y)) 312e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // no-warning 313e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 314e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (a != x[0]) 315e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // expected-warning{{null}} 316e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 317e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 318e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_overflow(char *y) { 319e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char x[4]; 320e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(y) == 4) 321e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose strcpy(x, y); // expected-warning{{Byte string function overflows destination buffer}} 322e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 323e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 324e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_no_overflow(char *y) { 325e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char x[4]; 326e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(y) == 3) 327e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose strcpy(x, y); // no-warning 328e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 329e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 330e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose//===----------------------------------------------------------------------=== 3310ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek// strncpy() 3320ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek//===----------------------------------------------------------------------=== 3330ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3340ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek#ifdef VARIANT 3350ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3360ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek#define __strncpy_chk BUILTIN(__strncpy_chk) 3370ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenekchar *__strncpy_chk(char *restrict s1, const char *restrict s2, size_t n, size_t destlen); 3380ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3390ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek#define strncpy(a,b,c) __strncpy_chk(a,b,c, (size_t)-1) 3400ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3410ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek#else /* VARIANT */ 3420ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3430ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek#define strncpy BUILTIN(strncpy) 3440ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenekchar *strncpy(char *restrict s1, const char *restrict s2, size_t n); 3450ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3460ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek#endif /* VARIANT */ 3470ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3480ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3490ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenekvoid strncpy_null_dst(char *x) { 3500ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek strncpy(NULL, x, 1); // expected-warning{{Null pointer argument in call to byte string function}} 3510ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek} 3520ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3530ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenekvoid strncpy_null_src(char *x) { 3540ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek strncpy(x, NULL, 1); // expected-warning{{Null pointer argument in call to byte string function}} 3550ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek} 3560ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3570ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenekvoid strncpy_fn(char *x) { 3580ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek strncpy(x, (char*)&strncpy_fn, 1); // expected-warning{{Argument to byte string function is the address of the function 'strncpy_fn', which is not a null-terminated string}} 3590ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek} 3600ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3610ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenekvoid strncpy_effects(char *x, char *y) { 3620ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek char a = x[0]; 3630ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3640ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek if (strncpy(x, y, strlen(y)) != x) 3650ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek (void)*(char*)0; // no-warning 3660ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3670ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek if (strlen(x) != strlen(y)) 3680ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek (void)*(char*)0; // no-warning 3690ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3700ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek if (a != x[0]) 3710ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek (void)*(char*)0; // expected-warning{{null}} 3720ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek} 3730ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3740ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenekvoid strncpy_overflow(char *y) { 3750ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek char x[4]; 3760ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek if (strlen(y) == 4) 3770ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek strncpy(x, y, strlen(y)); // expected-warning{{Byte string function overflows destination buffer}} 3780ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek} 3790ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3800ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenekvoid strncpy_len_overflow(char *y) { 3810ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek char x[4]; 3820ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek if (strlen(y) == 3) 3830ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek strncpy(x, y, sizeof(x)); // no-warning 3840ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek} 3850ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3860ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenekvoid strncpy_no_overflow(char *y) { 3870ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek char x[4]; 3880ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek if (strlen(y) == 3) 3890ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek strncpy(x, y, strlen(y)); // no-warning 3900ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek} 3910ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3920ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenekvoid strncpy_no_len_overflow(char *y) { 3930ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek char x[4]; 3940ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek if (strlen(y) == 4) 3950ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek strncpy(x, y, sizeof(x)-1); // no-warning 3960ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek} 3970ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek 3980ef473f75426f0a95635d0a9dd567d27b07dbd5bTed Kremenek//===----------------------------------------------------------------------=== 399e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose// stpcpy() 400e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose//===----------------------------------------------------------------------=== 401e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 402e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#ifdef VARIANT 403e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 404e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define __stpcpy_chk BUILTIN(__stpcpy_chk) 405e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosechar *__stpcpy_chk(char *restrict s1, const char *restrict s2, size_t destlen); 406e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 407e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define stpcpy(a,b) __stpcpy_chk(a,b,(size_t)-1) 408e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 409e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#else /* VARIANT */ 410e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 411e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define stpcpy BUILTIN(stpcpy) 412e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosechar *stpcpy(char *restrict s1, const char *restrict s2); 413e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 414e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#endif /* VARIANT */ 415e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 416e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 417e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid stpcpy_effect(char *x, char *y) { 418e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char a = x[0]; 419e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 420e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (stpcpy(x, y) != &x[strlen(y)]) 421e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // no-warning 422e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 423e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(x) != strlen(y)) 424e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // no-warning 425e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 426e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (a != x[0]) 427e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // expected-warning{{null}} 428e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 429e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 430e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid stpcpy_overflow(char *y) { 431e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char x[4]; 432e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(y) == 4) 433e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose stpcpy(x, y); // expected-warning{{Byte string function overflows destination buffer}} 434e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 435e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 436e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid stpcpy_no_overflow(char *y) { 437e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char x[4]; 438e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(y) == 3) 439e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose stpcpy(x, y); // no-warning 440e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 441