1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.cstring.NullArg,alpha.unix.cstring,debug.ExprInspection -analyzer-store=region -verify %s 2 3 #define NULL ((void *)0) 4 5 typedef __typeof(sizeof(int)) size_t; 6 size_t strlcpy(char *dst, const char *src, size_t n); 7 size_t strlcat(char *dst, const char *src, size_t n); 8 void clang_analyzer_eval(int); 9 10 void f1() { 11 char overlap[] = "123456789"; 12 strlcpy(overlap, overlap + 1, 3); // expected-warning{{Arguments must not be overlapping buffers}} 13 } 14 15 void f2() { 16 char buf[5]; 17 strlcpy(buf, "abcd", sizeof(buf)); // expected-no-warning 18 strlcat(buf, "efgh", sizeof(buf)); // expected-warning{{Size argument is greater than the free space in the destination buffer}} 19 } 20 21 void f3() { 22 char dst[2]; 23 const char *src = "abdef"; 24 strlcpy(dst, src, 5); // expected-warning{{Size argument is greater than the length of the destination buffer}} 25 } 26 27 void f4() { 28 strlcpy(NULL, "abcdef", 6); // expected-warning{{Null pointer argument in call to string copy function}} 29 } 30 31 void f5() { 32 strlcat(NULL, "abcdef", 6); // expected-warning{{Null pointer argument in call to string copy function}} 33 } 34 35 void f6() { 36 char buf[8]; 37 strlcpy(buf, "abc", 3); 38 size_t len = strlcat(buf, "defg", 4); 39 clang_analyzer_eval(len == 7); // expected-warning{{TRUE}} 40 } 41 42 int f7() { 43 char buf[8]; 44 return strlcpy(buf, "1234567", 0); // no-crash 45 } 46