string.c revision 9e49d9fbdc861c25c2480233147dee07f5fa9660
1467f7c8ba2b3c3b65065d05323696ded5d8a93a9Jordy Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.experimental.CString,deadcode.experimental.UnreachableCode -analyzer-store=region -Wno-null-dereference -verify %s 2467f7c8ba2b3c3b65065d05323696ded5d8a93a9Jordy Rose// RUN: %clang_cc1 -analyze -DUSE_BUILTINS -analyzer-checker=core,unix.experimental.CString,deadcode.experimental.UnreachableCode -analyzer-store=region -Wno-null-dereference -verify %s 3467f7c8ba2b3c3b65065d05323696ded5d8a93a9Jordy Rose// RUN: %clang_cc1 -analyze -DVARIANT -analyzer-checker=core,unix.experimental.CString,deadcode.experimental.UnreachableCode -analyzer-store=region -Wno-null-dereference -verify %s 4467f7c8ba2b3c3b65065d05323696ded5d8a93a9Jordy Rose// RUN: %clang_cc1 -analyze -DUSE_BUILTINS -DVARIANT -analyzer-checker=core,unix.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() { 589e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose return strlen(0); // expected-warning{{Null pointer argument in call to string length function}} 5919c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose} 6019c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rose 6119c5dd120e42b1ba0642309a185c70f4a41aadbdJordy Rosesize_t strlen_fn() { 629e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose return strlen((char*)&strlen_fn); // expected-warning{{Argument to string length 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: 679e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose return strlen((char*)&&label); // expected-warning{{Argument to string length 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() { 1909e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose return strnlen(0, 3); // expected-warning{{Null pointer argument in call to string length function}} 191be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 192be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 193be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremeneksize_t strnlen_fn() { 1949e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose return strnlen((char*)&strlen_fn, 3); // expected-warning{{Argument to string length 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: 1999e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose return strnlen((char*)&&label, 3); // expected-warning{{Argument to string length function is the address of the label 'label', which is not a null-terminated string}} 200be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 201be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 202793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rosevoid strnlen_zero() { 203793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (strnlen("abc", 0) != 0) 204793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose (void)*(char*)0; // no-warning 205793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (strnlen(NULL, 0) != 0) // no-warning 206793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose (void)*(char*)0; // no-warning 207793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose} 208be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 209793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rosesize_t strnlen_compound_literal() { 210793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose // This used to crash because we don't model the string lengths of 211793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose // compound literals. 212793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose return strnlen((char[]) { 'a', 'b', 0 }, 1); 213793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose} 214be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 215793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rosesize_t strnlen_unknown_limit(float f) { 216793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose // This used to crash because we don't model the integer values of floats. 217793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose return strnlen("abc", (int)f); 218793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose} 219be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 220793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rosevoid strnlen_is_not_strlen(char *x) { 221793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (strnlen(x, 10) != strlen(x)) 222be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{null}} 223be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 224be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 225793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rosevoid strnlen_at_limit(char *x) { 226793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose size_t len = strnlen(x, 10); 227793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (len > 10) 228be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{never executed}} 229793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (len == 10) 230793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose (void)*(char*)0; // expected-warning{{null}} 231be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 232be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 233793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rosevoid strnlen_less_than_limit(char *x) { 234793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose size_t len = strnlen(x, 10); 235793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (len > 10) 236be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{never executed}} 237793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (len < 10) 238793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose (void)*(char*)0; // expected-warning{{null}} 239be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 240be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 241793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rosevoid strnlen_at_actual(size_t limit) { 242793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose size_t len = strnlen("abc", limit); 243793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (len > 3) 244be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{never executed}} 245793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (len == 3) 246be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek (void)*(char*)0; // expected-warning{{null}} 247be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 248be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 249793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rosevoid strnlen_less_than_actual(size_t limit) { 250793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose size_t len = strnlen("abc", limit); 251793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (len > 3) 252793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose (void)*(char*)0; // expected-warning{{never executed}} 253793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose if (len < 3) 254793bff3fb7ca2a31e81aa7f4f3f21f921459010bJordy Rose (void)*(char*)0; // expected-warning{{null}} 255be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek} 256be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek 257be4242ce039f0542ea0dd5f234aa0ee698f90c53Ted Kremenek//===----------------------------------------------------------------------=== 258e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose// strcpy() 259e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose//===----------------------------------------------------------------------=== 260e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 261e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#ifdef VARIANT 262e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 263e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define __strcpy_chk BUILTIN(__strcpy_chk) 264e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosechar *__strcpy_chk(char *restrict s1, const char *restrict s2, size_t destlen); 265e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 266e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define strcpy(a,b) __strcpy_chk(a,b,(size_t)-1) 267e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 268e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#else /* VARIANT */ 269e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 270e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define strcpy BUILTIN(strcpy) 271e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosechar *strcpy(char *restrict s1, const char *restrict s2); 272e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 273e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#endif /* VARIANT */ 274e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 275e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 276e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_null_dst(char *x) { 2779e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcpy(NULL, x); // expected-warning{{Null pointer argument in call to string copy function}} 278e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 279e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 280e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_null_src(char *x) { 2819e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcpy(x, NULL); // expected-warning{{Null pointer argument in call to string copy function}} 282e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 283e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 284e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_fn(char *x) { 2859e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcpy(x, (char*)&strcpy_fn); // expected-warning{{Argument to string copy function is the address of the function 'strcpy_fn', which is not a null-terminated string}} 286e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 287e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 288e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_effects(char *x, char *y) { 289e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char a = x[0]; 290e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 291e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strcpy(x, y) != x) 292e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // no-warning 293e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 294e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(x) != strlen(y)) 295e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // no-warning 296e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 297e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (a != x[0]) 298e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // expected-warning{{null}} 299e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 300e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 301e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_overflow(char *y) { 302e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char x[4]; 303e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(y) == 4) 3049e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcpy(x, y); // expected-warning{{String copy function overflows destination buffer}} 305e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 306e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 307e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid strcpy_no_overflow(char *y) { 308e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char x[4]; 309e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(y) == 3) 310e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose strcpy(x, y); // no-warning 311e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 312e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 313e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose//===----------------------------------------------------------------------=== 314e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose// stpcpy() 315e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose//===----------------------------------------------------------------------=== 316e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 317e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#ifdef VARIANT 318e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 319e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define __stpcpy_chk BUILTIN(__stpcpy_chk) 320e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosechar *__stpcpy_chk(char *restrict s1, const char *restrict s2, size_t destlen); 321e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 322e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define stpcpy(a,b) __stpcpy_chk(a,b,(size_t)-1) 323e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 324e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#else /* VARIANT */ 325e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 326e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#define stpcpy BUILTIN(stpcpy) 327e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosechar *stpcpy(char *restrict s1, const char *restrict s2); 328e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 329e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose#endif /* VARIANT */ 330e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 331e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 332e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid stpcpy_effect(char *x, char *y) { 333e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char a = x[0]; 334e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 335e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (stpcpy(x, y) != &x[strlen(y)]) 336e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // no-warning 337e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 338e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(x) != strlen(y)) 339e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // no-warning 340e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 341e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (a != x[0]) 342e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose (void)*(char*)0; // expected-warning{{null}} 343e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 344e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 345e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid stpcpy_overflow(char *y) { 346e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char x[4]; 347e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(y) == 4) 3489e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose stpcpy(x, y); // expected-warning{{String copy function overflows destination buffer}} 349e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 350e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose 351e64f311c11a8751867c2538807054f4817c1f5cbJordy Rosevoid stpcpy_no_overflow(char *y) { 352e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose char x[4]; 353e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose if (strlen(y) == 3) 354e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose stpcpy(x, y); // no-warning 355e64f311c11a8751867c2538807054f4817c1f5cbJordy Rose} 356067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 357067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani//===----------------------------------------------------------------------=== 358067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani// strcat() 359067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani//===----------------------------------------------------------------------=== 360067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 361067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#ifdef VARIANT 362067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 363067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define __strcat_chk BUILTIN(__strcat_chk) 364067bbd0e11c71a33b51832532e836971be697699Lenny Maioranichar *__strcat_chk(char *restrict s1, const char *restrict s2, size_t destlen); 365067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 366067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define strcat(a,b) __strcat_chk(a,b,(size_t)-1) 367067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 368067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#else /* VARIANT */ 369067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 370067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define strcat BUILTIN(strcat) 371067bbd0e11c71a33b51832532e836971be697699Lenny Maioranichar *strcat(char *restrict s1, const char *restrict s2); 372067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 373067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#endif /* VARIANT */ 374067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 375067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 376067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_null_dst(char *x) { 3779e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcat(NULL, x); // expected-warning{{Null pointer argument in call to string copy function}} 378067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 379067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 380067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_null_src(char *x) { 3819e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcat(x, NULL); // expected-warning{{Null pointer argument in call to string copy function}} 382067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 383067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 384067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_fn(char *x) { 3859e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcat(x, (char*)&strcat_fn); // expected-warning{{Argument to string copy function is the address of the function 'strcat_fn', which is not a null-terminated string}} 386067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 387067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 388067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_effects(char *y) { 389067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[8] = "123"; 390067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani size_t orig_len = strlen(x); 391067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char a = x[0]; 392067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 393067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) != 4) 394067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani return; 395067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 396067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strcat(x, y) != x) 397067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani (void)*(char*)0; // no-warning 398067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 399067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if ((int)strlen(x) != (orig_len + strlen(y))) 400067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani (void)*(char*)0; // no-warning 401067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 402067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 403067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_overflow_0(char *y) { 404067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 405067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 4) 4069e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcat(x, y); // expected-warning{{String copy function overflows destination buffer}} 407067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 408067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 409067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_overflow_1(char *y) { 410067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 411067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 3) 4129e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcat(x, y); // expected-warning{{String copy function overflows destination buffer}} 413067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 414067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 415067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_overflow_2(char *y) { 416067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 417067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 2) 4189e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcat(x, y); // expected-warning{{String copy function overflows destination buffer}} 419067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 420067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 421067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strcat_no_overflow(char *y) { 422067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[5] = "12"; 423067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 2) 424067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strcat(x, y); // no-warning 425067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 426067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 427d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rosevoid strcat_symbolic_dst_length(char *dst) { 428d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose strcat(dst, "1234"); 429d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose if (strlen(dst) < 4) 430d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose (void)*(char*)0; // no-warning 431d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose} 432d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose 433d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rosevoid strcat_symbolic_src_length(char *src) { 434d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose char dst[8] = "1234"; 435d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose strcat(dst, src); 436d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose if (strlen(dst) < 4) 437d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose (void)*(char*)0; // no-warning 438d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose} 439d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose 440d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rosevoid strcat_unknown_src_length(char *src, int offset) { 441d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose char dst[8] = "1234"; 442d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose strcat(dst, &src[offset]); 443d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose if (strlen(dst) < 4) 444d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose (void)*(char*)0; // no-warning 445d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose} 446d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose 447d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose// There is no strcat_unknown_dst_length because if we can't get a symbolic 448d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose// length for the "before" strlen, we won't be able to set one for "after". 449d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose 450d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rosevoid strcat_too_big(char *dst, char *src) { 451d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose if (strlen(dst) != (((size_t)0) - 2)) 452d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose return; 453d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose if (strlen(src) != 2) 454d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose return; 455d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose strcat(dst, src); // expected-warning{{This expression will create a string whose length is too big to be represented as a size_t}} 456d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose} 457d5af0e17b00ab2ee6a8c1f352bb9eeb1cc5b2d07Jordy Rose 458067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 459067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani//===----------------------------------------------------------------------=== 460067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani// strncat() 461067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani//===----------------------------------------------------------------------=== 462067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 463067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#ifdef VARIANT 464067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 465067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define __strncat_chk BUILTIN(__strncat_chk) 466067bbd0e11c71a33b51832532e836971be697699Lenny Maioranichar *__strncat_chk(char *restrict s1, const char *restrict s2, size_t n, size_t destlen); 467067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 468067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define strncat(a,b,c) __strncat_chk(a,b,c, (size_t)-1) 469067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 470067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#else /* VARIANT */ 471067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 472067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#define strncat BUILTIN(strncat) 473067bbd0e11c71a33b51832532e836971be697699Lenny Maioranichar *strncat(char *restrict s1, const char *restrict s2, size_t n); 474067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 475067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani#endif /* VARIANT */ 476067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 477067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 478067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_null_dst(char *x) { 4799e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncat(NULL, x, 4); // expected-warning{{Null pointer argument in call to string copy function}} 480067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 481067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 482067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_null_src(char *x) { 4839e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncat(x, NULL, 4); // expected-warning{{Null pointer argument in call to string copy function}} 484067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 485067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 486067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_fn(char *x) { 4879e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncat(x, (char*)&strncat_fn, 4); // expected-warning{{Argument to string copy function is the address of the function 'strncat_fn', which is not a null-terminated string}} 488067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 489067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 490067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_effects(char *y) { 491067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[8] = "123"; 492067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani size_t orig_len = strlen(x); 493067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char a = x[0]; 494067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 495067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) != 4) 496067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani return; 497067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 498067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strncat(x, y, strlen(y)) != x) 499067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani (void)*(char*)0; // no-warning 500067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 501067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(x) != orig_len + strlen(y)) 502067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani (void)*(char*)0; // no-warning 503067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 504067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 505067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_overflow_0(char *y) { 506067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 507067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 4) 5089e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncat(x, y, strlen(y)); // expected-warning{{String copy function overflows destination buffer}} 509067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 510067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 511067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_overflow_1(char *y) { 512067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 513067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 3) 5149e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncat(x, y, strlen(y)); // expected-warning{{String copy function overflows destination buffer}} 515067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 516067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 517067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_overflow_2(char *y) { 518067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 519067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 2) 5209e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncat(x, y, strlen(y)); // expected-warning{{String copy function overflows destination buffer}} 521067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 522067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 523067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_overflow_3(char *y) { 524067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 525067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 4) 5269e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncat(x, y, 2); // expected-warning{{String copy function overflows destination buffer}} 527067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 528067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_no_overflow_1(char *y) { 529067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[5] = "12"; 530067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 2) 531067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(x, y, strlen(y)); // no-warning 532067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 533067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani 534067bbd0e11c71a33b51832532e836971be697699Lenny Maioranivoid strncat_no_overflow_2(char *y) { 535067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani char x[4] = "12"; 536067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani if (strlen(y) == 4) 537067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani strncat(x, y, 1); // no-warning 538067bbd0e11c71a33b51832532e836971be697699Lenny Maiorani} 539318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 540318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani//===----------------------------------------------------------------------=== 541318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani// strcmp() 542318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani//===----------------------------------------------------------------------=== 543318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 544318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani#define strcmp BUILTIN(strcmp) 545adc42d412d747391dbcee234610f00b0f087cf7bJordy Roseint strcmp(const char * s1, const char * s2); 546318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 547318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_constant0() { 548318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp("123", "123") != 0) 549318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 550318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 551318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 552318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_constant_and_var_0() { 553318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 554318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, "123") != 0) 555318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 556318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 557318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 558318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_constant_and_var_1() { 559318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 560318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp("123", x) != 0) 561318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 562318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 563318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 564318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_0() { 565318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 566318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "123"; 567318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != 0) 568318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 569318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 570318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 571318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_1() { 572318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "234"; 573318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "123"; 574318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != 1) 575318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 576318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 577318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 578318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_2() { 579318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 580318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "234"; 581318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != -1) 582318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 583318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 584318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 585318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_null_0() { 586318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = NULL; 587318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "123"; 5889e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcmp(x, y); // expected-warning{{Null pointer argument in call to string comparison function}} 589318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 590318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 591318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_null_1() { 592318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 593318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = NULL; 5949e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcmp(x, y); // expected-warning{{Null pointer argument in call to string comparison function}} 595318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 596318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 597318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_diff_length_0() { 598318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "12345"; 599318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "234"; 600318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != -1) 601318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 602318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 603318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 604318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_diff_length_1() { 605318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 606318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "23456"; 607318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != -1) 608318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 609318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 610318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 611318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_diff_length_2() { 612318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "12345"; 613318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "123"; 614318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != 1) 615318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 616318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 617318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 618318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maioranivoid strcmp_diff_length_3() { 619318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *x = "123"; 620318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani char *y = "12345"; 621318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani if (strcmp(x, y) != -1) 622318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani (void)*(char*)0; // no-warning 623318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani} 624318dd92ad834857ea5bb91de288c1eb56cdbec1aLenny Maiorani 625adc42d412d747391dbcee234610f00b0f087cf7bJordy Rosevoid strcmp_embedded_null () { 626adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose if (strcmp("\0z", "\0y") != 0) 627adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose (void)*(char*)0; // no-warning 628adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose} 629adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose 630adc42d412d747391dbcee234610f00b0f087cf7bJordy Rosevoid strcmp_unknown_arg (char *unknown) { 631adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose if (strcmp(unknown, unknown) != 0) 632adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose (void)*(char*)0; // no-warning 633adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose} 634adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose 635357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani//===----------------------------------------------------------------------=== 636357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani// strncmp() 637357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani//===----------------------------------------------------------------------=== 638357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 639357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani#define strncmp BUILTIN(strncmp) 640adc42d412d747391dbcee234610f00b0f087cf7bJordy Roseint strncmp(const char *s1, const char *s2, size_t n); 641357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 642357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_constant0() { 643357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp("123", "123", 3) != 0) 644357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 645357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 646357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 647357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_constant_and_var_0() { 648357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 649357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, "123", 3) != 0) 650357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 651357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 652357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 653357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_constant_and_var_1() { 654357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 655357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp("123", x, 3) != 0) 656357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 657357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 658357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 659357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_0() { 660357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 661357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "123"; 662357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != 0) 663357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 664357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 665357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 666357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_1() { 667357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "234"; 668357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "123"; 669357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != 1) 670357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 671357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 672357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 673357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_2() { 674357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 675357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "234"; 676357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != -1) 677357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 678357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 679357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 680357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_null_0() { 681357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = NULL; 682357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "123"; 6839e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncmp(x, y, 3); // expected-warning{{Null pointer argument in call to string comparison function}} 684357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 685357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 686357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_null_1() { 687357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 688357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = NULL; 6899e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncmp(x, y, 3); // expected-warning{{Null pointer argument in call to string comparison function}} 690357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 691357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 692357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_0() { 693357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "12345"; 694357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "234"; 695357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 5) != -1) 696357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 697357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 698357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 699357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_1() { 700357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 701357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "23456"; 702357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 5) != -1) 703357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 704357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 705357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 706357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_2() { 707357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "12345"; 708357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "123"; 709357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 5) != 1) 710357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 711357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 712357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 713357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_3() { 714357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 715357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "12345"; 716357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 5) != -1) 717357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 718357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 719357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 720357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_4() { 721357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "123"; 722357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "12345"; 723357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != 0) 724357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 725357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 726357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 727357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_5() { 728357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "012"; 729357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "12345"; 730357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != -1) 731357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 732357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 733357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 734357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maioranivoid strncmp_diff_length_6() { 735357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *x = "234"; 736357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani char *y = "12345"; 737357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani if (strncmp(x, y, 3) != 1) 738357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani (void)*(char*)0; // no-warning 739357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani} 740357f6ee9f1f6f8e5027377cb3e5907c62c4fe3dfLenny Maiorani 741adc42d412d747391dbcee234610f00b0f087cf7bJordy Rosevoid strncmp_embedded_null () { 742adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose if (strncmp("ab\0zz", "ab\0yy", 4) != 0) 743adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose (void)*(char*)0; // no-warning 744adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose} 745adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose 746bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani//===----------------------------------------------------------------------=== 747bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani// strcasecmp() 748bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani//===----------------------------------------------------------------------=== 749bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 750bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani#define strcasecmp BUILTIN(strcasecmp) 751adc42d412d747391dbcee234610f00b0f087cf7bJordy Roseint strcasecmp(const char *s1, const char *s2); 752bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 753bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_constant0() { 754bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp("abc", "Abc") != 0) 755bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 756bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 757bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 758bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_constant_and_var_0() { 759bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abc"; 760bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, "Abc") != 0) 761bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 762bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 763bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 764bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_constant_and_var_1() { 765bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abc"; 766bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp("Abc", x) != 0) 767bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 768bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 769bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 770bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_0() { 771bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abc"; 772bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "Abc"; 773bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != 0) 774bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 775bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 776bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 777bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_1() { 778bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "Bcd"; 779bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "abc"; 780bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != 1) 781bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 782bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 783bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 784bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_2() { 785bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abc"; 786bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "Bcd"; 787bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != -1) 788bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 789bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 790bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 791bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_null_0() { 792bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = NULL; 793bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "123"; 7949e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcasecmp(x, y); // expected-warning{{Null pointer argument in call to string comparison function}} 795bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 796bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 797bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_null_1() { 798bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "123"; 799bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = NULL; 8009e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strcasecmp(x, y); // expected-warning{{Null pointer argument in call to string comparison function}} 801bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 802bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 803bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_diff_length_0() { 804bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abcde"; 805bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "aBd"; 806bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != -1) 807bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 808bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 809bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 810bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_diff_length_1() { 811bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "abc"; 812bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "aBdef"; 813bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != -1) 814bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 815bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 816bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 817bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_diff_length_2() { 818bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "aBcDe"; 819bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "abc"; 820bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != 1) 821bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 822bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 823bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani 824bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maioranivoid strcasecmp_diff_length_3() { 825bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *x = "aBc"; 826bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani char *y = "abcde"; 827bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani if (strcasecmp(x, y) != -1) 828bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani (void)*(char*)0; // no-warning 829bd1d16a1792cd6ea5ede9869e18d781e3fc1a8c3Lenny Maiorani} 830454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 831adc42d412d747391dbcee234610f00b0f087cf7bJordy Rosevoid strcasecmp_embedded_null () { 832adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose if (strcasecmp("ab\0zz", "ab\0yy") != 0) 833adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose (void)*(char*)0; // no-warning 834adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose} 835adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose 836454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani//===----------------------------------------------------------------------=== 837454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani// strncasecmp() 838454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani//===----------------------------------------------------------------------=== 839454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 840454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani#define strncasecmp BUILTIN(strncasecmp) 841adc42d412d747391dbcee234610f00b0f087cf7bJordy Roseint strncasecmp(const char *s1, const char *s2, size_t n); 842454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 843454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_constant0() { 844454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp("abc", "Abc", 3) != 0) 845454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 846454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 847454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 848454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_constant_and_var_0() { 849454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "abc"; 850454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, "Abc", 3) != 0) 851454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 852454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 853454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 854454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_constant_and_var_1() { 855454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "abc"; 856454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp("Abc", x, 3) != 0) 857454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 858454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 859454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 860454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_0() { 861454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "abc"; 862454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "Abc"; 863454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, y, 3) != 0) 864454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 865454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 866454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 867454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_1() { 868454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "Bcd"; 869454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "abc"; 870454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, y, 3) != 1) 871454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 872454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 873454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 874454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_2() { 875454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "abc"; 876454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "Bcd"; 877454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, y, 3) != -1) 878454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 879454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 880454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 881454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_null_0() { 882454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = NULL; 883454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "123"; 8849e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncasecmp(x, y, 3); // expected-warning{{Null pointer argument in call to string comparison function}} 885454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 886454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 887454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_null_1() { 888454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "123"; 889454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = NULL; 8909e49d9fbdc861c25c2480233147dee07f5fa9660Jordy Rose strncasecmp(x, y, 3); // expected-warning{{Null pointer argument in call to string comparison function}} 891454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 892454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 893454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_diff_length_0() { 894454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "abcde"; 895454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "aBd"; 896454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, y, 5) != -1) 897454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 898454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 899454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 900454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_diff_length_1() { 901454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "abc"; 902454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "aBdef"; 903454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, y, 5) != -1) 904454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 905454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 906454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 907454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_diff_length_2() { 908454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "aBcDe"; 909454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "abc"; 910454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, y, 5) != 1) 911454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 912454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 913454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 914454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_diff_length_3() { 915454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "aBc"; 916454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "abcde"; 917454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, y, 5) != -1) 918454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 919454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 920454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 921454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_diff_length_4() { 922454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "abcde"; 923454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "aBc"; 924454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, y, 3) != 0) 925454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 926454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 927454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 928454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_diff_length_5() { 929454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "abcde"; 930454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "aBd"; 931454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, y, 3) != -1) 932454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 933454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 934454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani 935454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maioranivoid strncasecmp_diff_length_6() { 936454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *x = "aBDe"; 937454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani char *y = "abc"; 938454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani if (strncasecmp(x, y, 3) != 1) 939454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani (void)*(char*)0; // no-warning 940454fd2d3a1b6d0ef225c5d3927c1ad3b97510d1aLenny Maiorani} 941adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose 942adc42d412d747391dbcee234610f00b0f087cf7bJordy Rosevoid strncasecmp_embedded_null () { 943adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose if (strncasecmp("ab\0zz", "ab\0yy", 4) != 0) 944adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose (void)*(char*)0; // no-warning 945adc42d412d747391dbcee234610f00b0f087cf7bJordy Rose} 946