diff options
author | Jordy Rose <jediknil@belkadan.com> | 2011-06-16 07:13:34 +0000 |
---|---|---|
committer | Jordy Rose <jediknil@belkadan.com> | 2011-06-16 07:13:34 +0000 |
commit | c026370858e31e99a8190e4c945676fb2f3e941f (patch) | |
tree | 08c91c5415c7025c7c28634f99b1a9c5a458ad74 /clang/test/Analysis/string.c | |
parent | bbf2ab990f91a629ffa0d2b2fcc54398e522f36f (diff) | |
download | bcm5719-llvm-c026370858e31e99a8190e4c945676fb2f3e941f.tar.gz bcm5719-llvm-c026370858e31e99a8190e4c945676fb2f3e941f.zip |
[analyzer] Clean up modeling of strcmp, including cases where a string literal has an embedded null character, and where both arguments are the same buffer. Also use nested ifs rather than early returns; in this case early returns will lose any assumptions we've made earlier in the function.
llvm-svn: 133154
Diffstat (limited to 'clang/test/Analysis/string.c')
-rw-r--r-- | clang/test/Analysis/string.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/clang/test/Analysis/string.c b/clang/test/Analysis/string.c index 98fd8c09c41..4b6a0665d91 100644 --- a/clang/test/Analysis/string.c +++ b/clang/test/Analysis/string.c @@ -542,7 +542,7 @@ void strncat_no_overflow_2(char *y) { //===----------------------------------------------------------------------=== #define strcmp BUILTIN(strcmp) -int strcmp(const char *restrict s1, const char *restrict s2); +int strcmp(const char * s1, const char * s2); void strcmp_constant0() { if (strcmp("123", "123") != 0) @@ -622,12 +622,22 @@ void strcmp_diff_length_3() { (void)*(char*)0; // no-warning } +void strcmp_embedded_null () { + if (strcmp("\0z", "\0y") != 0) + (void)*(char*)0; // no-warning +} + +void strcmp_unknown_arg (char *unknown) { + if (strcmp(unknown, unknown) != 0) + (void)*(char*)0; // no-warning +} + //===----------------------------------------------------------------------=== // strncmp() //===----------------------------------------------------------------------=== #define strncmp BUILTIN(strncmp) -int strncmp(const char *restrict s1, const char *restrict s2, size_t n); +int strncmp(const char *s1, const char *s2, size_t n); void strncmp_constant0() { if (strncmp("123", "123", 3) != 0) @@ -728,12 +738,17 @@ void strncmp_diff_length_6() { (void)*(char*)0; // no-warning } +void strncmp_embedded_null () { + if (strncmp("ab\0zz", "ab\0yy", 4) != 0) + (void)*(char*)0; // no-warning +} + //===----------------------------------------------------------------------=== // strcasecmp() //===----------------------------------------------------------------------=== #define strcasecmp BUILTIN(strcasecmp) -int strcasecmp(const char *restrict s1, const char *restrict s2); +int strcasecmp(const char *s1, const char *s2); void strcasecmp_constant0() { if (strcasecmp("abc", "Abc") != 0) @@ -813,12 +828,17 @@ void strcasecmp_diff_length_3() { (void)*(char*)0; // no-warning } +void strcasecmp_embedded_null () { + if (strcasecmp("ab\0zz", "ab\0yy") != 0) + (void)*(char*)0; // no-warning +} + //===----------------------------------------------------------------------=== // strncasecmp() //===----------------------------------------------------------------------=== #define strncasecmp BUILTIN(strncasecmp) -int strncasecmp(const char *restrict s1, const char *restrict s2, size_t n); +int strncasecmp(const char *s1, const char *s2, size_t n); void strncasecmp_constant0() { if (strncasecmp("abc", "Abc", 3) != 0) @@ -918,3 +938,8 @@ void strncasecmp_diff_length_6() { if (strncasecmp(x, y, 3) != 1) (void)*(char*)0; // no-warning } + +void strncasecmp_embedded_null () { + if (strncasecmp("ab\0zz", "ab\0yy", 4) != 0) + (void)*(char*)0; // no-warning +} |