string.c revision bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3
18a285ae6fc4926cc4e419025eec63e2d6696e13fArgyrios Kyrtzidis// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.experimental.CString,deadcode.experimental.UnreachableCode -analyzer-store=region -Wno-null-dereference -verify %s 28a285ae6fc4926cc4e419025eec63e2d6696e13fArgyrios Kyrtzidis// RUN: %clang_cc1 -analyze -DUSE_BUILTINS -analyzer-checker=core,cplusplus.experimental.CString,deadcode.experimental.UnreachableCode -analyzer-store=region -Wno-null-dereference -verify %s 38a285ae6fc4926cc4e419025eec63e2d6696e13fArgyrios Kyrtzidis// RUN: %clang_cc1 -analyze -DVARIANT -analyzer-checker=core,cplusplus.experimental.CString,deadcode.experimental.UnreachableCode -analyzer-store=region -Wno-null-dereference -verify %s 48a285ae6fc4926cc4e419025eec63e2d6696e13fArgyrios Kyrtzidis// RUN: %clang_cc1 -analyze -DUSE_BUILTINS -DVARIANT -analyzer-checker=core,cplusplus.experimental.CString,deadcode.experimental.UnreachableCode -analyzer-store=region -Wno-null-dereference -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 18fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Functions that have variants and are also available 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() { 71e224ba7e3e604113aa160c379293bcb6425e8f36Carl Norum 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() { 203e224ba7e3e604113aa160c379293bcb6425e8f36Carl Norum 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} 441067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 442067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani//===----------------------------------------------------------------------=== 443067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani// strcat() 444067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani//===----------------------------------------------------------------------=== 445067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 446067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#ifdef VARIANT 447067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 448067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define __strcat_chk BUILTIN(__strcat_chk) 449067bbd0e11c71a33b51832532e836971be697699Lenny Maioranichar *__strcat_chk(char *restrict s1, const char *restrict s2, size_t destlen); 450067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 451067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define strcat(a,b) __strcat_chk(a,b,(size_t)-1) 452067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 453067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#else /* VARIANT */ 454067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 455067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define strcat BUILTIN(strcat) 456067bbd0e11c71a33b51832532e836971be697699Lenny Maioranichar *strcat(char *restrict s1, const char *restrict s2); 457067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 458067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#endif /* VARIANT */ 459067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 460067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 461067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_null_dst(char *x) { 462067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strcat(NULL, x); // expected-warning{{Null pointer argument in call to byte string function}} 463067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 464067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 465067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_null_src(char *x) { 466067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strcat(x, NULL); // expected-warning{{Null pointer argument in call to byte string function}} 467067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 468067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 469067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_fn(char *x) { 470067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strcat(x, (char*)&strcat_fn); // expected-warning{{Argument to byte string function is the address of the function 'strcat_fn', which is not a null-terminated string}} 471067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 472067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 473067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_effects(char *y) { 474067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[8] = "123"; 475067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani size_t orig_len = strlen(x); 476067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char a = x[0]; 477067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 478067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) != 4) 479067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani return; 480067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 481067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strcat(x, y) != x) 482067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani (void)*(char*)0; // no-warning 483067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 484067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if ((int)strlen(x) != (orig_len + strlen(y))) 485067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani (void)*(char*)0; // no-warning 486067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 487067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (a != x[0]) 488067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani (void)*(char*)0; // expected-warning{{null}} 489067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 490067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 491067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_overflow_0(char *y) { 492067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 493067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 4) 494067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strcat(x, y); // expected-warning{{Byte string function overflows destination buffer}} 495067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 496067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 497067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_overflow_1(char *y) { 498067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 499067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 3) 500067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strcat(x, y); // expected-warning{{Byte string function overflows destination buffer}} 501067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 502067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 503067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_overflow_2(char *y) { 504067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 505067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 2) 506067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strcat(x, y); // expected-warning{{Byte string function overflows destination buffer}} 507067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 508067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 509067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_no_overflow(char *y) { 510067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[5] = "12"; 511067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 2) 512067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strcat(x, y); // no-warning 513067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 514067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 515067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 516067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani//===----------------------------------------------------------------------=== 517067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani// strncat() 518067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani//===----------------------------------------------------------------------=== 519067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 520067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#ifdef VARIANT 521067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 522067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define __strncat_chk BUILTIN(__strncat_chk) 523067bbd0e11c71a33b51832532e836971be697699Lenny Maioranichar *__strncat_chk(char *restrict s1, const char *restrict s2, size_t n, size_t destlen); 524067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 525067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define strncat(a,b,c) __strncat_chk(a,b,c, (size_t)-1) 526067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 527067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#else /* VARIANT */ 528067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 529067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define strncat BUILTIN(strncat) 530067bbd0e11c71a33b51832532e836971be697699Lenny Maioranichar *strncat(char *restrict s1, const char *restrict s2, size_t n); 531067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 532067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#endif /* VARIANT */ 533067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 534067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 535067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_null_dst(char *x) { 536067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(NULL, x, 4); // expected-warning{{Null pointer argument in call to byte string function}} 537067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 538067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 539067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_null_src(char *x) { 540067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(x, NULL, 4); // expected-warning{{Null pointer argument in call to byte string function}} 541067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 542067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 543067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_fn(char *x) { 544067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(x, (char*)&strncat_fn, 4); // expected-warning{{Argument to byte string function is the address of the function 'strncat_fn', which is not a null-terminated string}} 545067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 546067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 547067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_effects(char *y) { 548067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[8] = "123"; 549067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani size_t orig_len = strlen(x); 550067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char a = x[0]; 551067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 552067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) != 4) 553067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani return; 554067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 555067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strncat(x, y, strlen(y)) != x) 556067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani (void)*(char*)0; // no-warning 557067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 558067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(x) != orig_len + strlen(y)) 559067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani (void)*(char*)0; // no-warning 560067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 561067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (a != x[0]) 562067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani (void)*(char*)0; // expected-warning{{null}} 563067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 564067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 565067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_overflow_0(char *y) { 566067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 567067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 4) 568067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(x, y, strlen(y)); // expected-warning{{Byte string function overflows destination buffer}} 569067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 570067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 571067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_overflow_1(char *y) { 572067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 573067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 3) 574067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(x, y, strlen(y)); // expected-warning{{Byte string function overflows destination buffer}} 575067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 576067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 577067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_overflow_2(char *y) { 578067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 579067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 2) 580067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(x, y, strlen(y)); // expected-warning{{Byte string function overflows destination buffer}} 581067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 582067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 583067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_overflow_3(char *y) { 584067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 585067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 4) 586067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(x, y, 2); // expected-warning{{Byte string function overflows destination buffer}} 587067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 588067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_no_overflow_1(char *y) { 589067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[5] = "12"; 590067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 2) 591067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(x, y, strlen(y)); // no-warning 592067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 593067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 594067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_no_overflow_2(char *y) { 595067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 596067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 4) 597067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(x, y, 1); // no-warning 598067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 599318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 600318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani//===----------------------------------------------------------------------=== 601318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani// strcmp() 602318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani//===----------------------------------------------------------------------=== 603318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 604318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani#define strcmp BUILTIN(strcmp) 605318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioraniint strcmp(const char *restrict s1, const char *restrict s2); 606318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 607318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_constant0() { 608318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp("123", "123") != 0) 609318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 610318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 611318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 612318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_constant_and_var_0() { 613318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 614318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, "123") != 0) 615318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 616318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 617318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 618318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_constant_and_var_1() { 619318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 620318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp("123", x) != 0) 621318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 622318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 623318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 624318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_0() { 625318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 626318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "123"; 627318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != 0) 628318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 629318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 630318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 631318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_1() { 632318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "234"; 633318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "123"; 634318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != 1) 635318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 636318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 637318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 638318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_2() { 639318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 640318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "234"; 641318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != -1) 642318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 643318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 644318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 645318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_null_0() { 646318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = NULL; 647318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "123"; 648318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani strcmp(x, y); // expected-warning{{Null pointer argument in call to byte string function}} 649318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 650318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 651318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_null_1() { 652318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 653318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = NULL; 654318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani strcmp(x, y); // expected-warning{{Null pointer argument in call to byte string function}} 655318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 656318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 657318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_diff_length_0() { 658318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "12345"; 659318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "234"; 660318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != -1) 661318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 662318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 663318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 664318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_diff_length_1() { 665318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 666318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "23456"; 667318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != -1) 668318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 669318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 670318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 671318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_diff_length_2() { 672318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "12345"; 673318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "123"; 674318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != 1) 675318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 676318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 677318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 678318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_diff_length_3() { 679318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 680318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "12345"; 681318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != -1) 682318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 683318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 684318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 685357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani//===----------------------------------------------------------------------=== 686357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani// strncmp() 687357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani//===----------------------------------------------------------------------=== 688357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 689357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani#define strncmp BUILTIN(strncmp) 690357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioraniint strncmp(const char *restrict s1, const char *restrict s2, size_t n); 691357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 692357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_constant0() { 693357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp("123", "123", 3) != 0) 694357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 695357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 696357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 697357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_constant_and_var_0() { 698357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 699357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, "123", 3) != 0) 700357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 701357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 702357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 703357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_constant_and_var_1() { 704357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 705357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp("123", x, 3) != 0) 706357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 707357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 708357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 709357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_0() { 710357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 711357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "123"; 712357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != 0) 713357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 714357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 715357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 716357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_1() { 717357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "234"; 718357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "123"; 719357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != 1) 720357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 721357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 722357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 723357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_2() { 724357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 725357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "234"; 726357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != -1) 727357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 728357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 729357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 730357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_null_0() { 731357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = NULL; 732357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "123"; 733357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani strncmp(x, y, 3); // expected-warning{{Null pointer argument in call to byte string function}} 734357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 735357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 736357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_null_1() { 737357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 738357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = NULL; 739357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani strncmp(x, y, 3); // expected-warning{{Null pointer argument in call to byte string function}} 740357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 741357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 742357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_0() { 743357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "12345"; 744357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "234"; 745357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 5) != -1) 746357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 747357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 748357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 749357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_1() { 750357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 751357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "23456"; 752357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 5) != -1) 753357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 754357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 755357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 756357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_2() { 757357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "12345"; 758357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "123"; 759357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 5) != 1) 760357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 761357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 762357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 763357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_3() { 764357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 765357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "12345"; 766357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 5) != -1) 767357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 768357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 769357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 770357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_4() { 771357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 772357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "12345"; 773357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != 0) 774357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 775357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 776357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 777357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_5() { 778357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "012"; 779357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "12345"; 780357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != -1) 781357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 782357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 783357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 784357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_6() { 785357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "234"; 786357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "12345"; 787357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != 1) 788357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 789357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 790357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 791bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani//===----------------------------------------------------------------------=== 792bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani// strcasecmp() 793bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani//===----------------------------------------------------------------------=== 794bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 795bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani#define strcasecmp BUILTIN(strcasecmp) 796bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioraniint strcasecmp(const char *restrict s1, const char *restrict s2); 797bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 798bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_constant0() { 799bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp("abc", "Abc") != 0) 800bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 801bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 802bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 803bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_constant_and_var_0() { 804bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abc"; 805bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, "Abc") != 0) 806bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 807bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 808bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 809bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_constant_and_var_1() { 810bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abc"; 811bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp("Abc", x) != 0) 812bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 813bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 814bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 815bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_0() { 816bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abc"; 817bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "Abc"; 818bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != 0) 819bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 820bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 821bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 822bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_1() { 823bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "Bcd"; 824bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "abc"; 825bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != 1) 826bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 827bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 828bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 829bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_2() { 830bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abc"; 831bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "Bcd"; 832bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != -1) 833bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 834bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 835bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 836bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_null_0() { 837bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = NULL; 838bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "123"; 839bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani strcasecmp(x, y); // expected-warning{{Null pointer argument in call to byte string function}} 840bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 841bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 842bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_null_1() { 843bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "123"; 844bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = NULL; 845bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani strcasecmp(x, y); // expected-warning{{Null pointer argument in call to byte string function}} 846bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 847bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 848bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_diff_length_0() { 849bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abcde"; 850bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "aBd"; 851bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != -1) 852bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 853bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 854bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 855bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_diff_length_1() { 856bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abc"; 857bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "aBdef"; 858bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != -1) 859bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 860bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 861bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 862bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_diff_length_2() { 863bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "aBcDe"; 864bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "abc"; 865bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != 1) 866bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 867bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 868bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 869bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_diff_length_3() { 870bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "aBc"; 871bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "abcde"; 872bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != -1) 873bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 874bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 875