From 6e3cf2ba8561415c40d1eba8c4cbd850637d4147 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Mon, 22 Apr 2013 23:18:42 +0000 Subject: [analyzer] Model strsep(), particularly that it returns its input. This handles the false positive leak warning in PR15374, and also serves as a basic model for the strsep() function. llvm-svn: 180069 --- clang/test/Analysis/string.c | 51 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'clang/test/Analysis/string.c') diff --git a/clang/test/Analysis/string.c b/clang/test/Analysis/string.c index 74cf33c4bc2..6cf52f7a557 100644 --- a/clang/test/Analysis/string.c +++ b/clang/test/Analysis/string.c @@ -1027,6 +1027,57 @@ void strncasecmp_embedded_null () { clang_analyzer_eval(strncasecmp("ab\0zz", "ab\0yy", 4) == 0); // expected-warning{{TRUE}} } +//===----------------------------------------------------------------------=== +// strsep() +//===----------------------------------------------------------------------=== + +char *strsep(char **stringp, const char *delim); + +void strsep_null_delim(char *s) { + strsep(&s, NULL); // expected-warning{{Null pointer argument in call to strsep()}} +} + +void strsep_null_search() { + strsep(NULL, ""); // expected-warning{{Null pointer argument in call to strsep()}} +} + +void strsep_return_original_pointer(char *s) { + char *original = s; + char *result = strsep(&s, ""); // no-warning + clang_analyzer_eval(original == result); // expected-warning{{TRUE}} +} + +void strsep_null_string() { + char *s = NULL; + char *result = strsep(&s, ""); // no-warning + clang_analyzer_eval(result == NULL); // expected-warning{{TRUE}} +} + +void strsep_changes_input_pointer(char *s) { + char *original = s; + strsep(&s, ""); // no-warning + clang_analyzer_eval(s == original); // expected-warning{{UNKNOWN}} + clang_analyzer_eval(s == NULL); // expected-warning{{UNKNOWN}} + + // Check that the value is symbolic. + if (s == NULL) { + clang_analyzer_eval(s == NULL); // expected-warning{{TRUE}} + } +} + +void strsep_changes_input_string() { + char str[] = "abc"; + + clang_analyzer_eval(str[1] == 'b'); // expected-warning{{TRUE}} + + char *s = str; + strsep(&s, "b"); // no-warning + + // The real strsep will change the first delimiter it finds into a NUL + // character. For now, we just model the invalidation. + clang_analyzer_eval(str[1] == 'b'); // expected-warning{{UNKNOWN}} +} + //===----------------------------------------------------------------------=== // FIXMEs //===----------------------------------------------------------------------=== -- cgit v1.2.3