summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/string.c
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2013-04-22 23:18:42 +0000
committerJordan Rose <jordan_rose@apple.com>2013-04-22 23:18:42 +0000
commit6e3cf2ba8561415c40d1eba8c4cbd850637d4147 (patch)
tree6f1b65bdd39c6ea6b9232a84e683c7bf18949ad0 /clang/test/Analysis/string.c
parent4a4970ec6a6f3cd56433905f7c8b5d20be52bd40 (diff)
downloadbcm5719-llvm-6e3cf2ba8561415c40d1eba8c4cbd850637d4147.tar.gz
bcm5719-llvm-6e3cf2ba8561415c40d1eba8c4cbd850637d4147.zip
[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
Diffstat (limited to 'clang/test/Analysis/string.c')
-rw-r--r--clang/test/Analysis/string.c51
1 files changed, 51 insertions, 0 deletions
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
@@ -1028,6 +1028,57 @@ void strncasecmp_embedded_null () {
}
//===----------------------------------------------------------------------===
+// 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
//===----------------------------------------------------------------------===
OpenPOWER on IntegriCloud