aboutsummaryrefslogtreecommitdiff
path: root/test/Analysis/inlining/inline-defensive-checks.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/Analysis/inlining/inline-defensive-checks.c')
-rw-r--r--test/Analysis/inlining/inline-defensive-checks.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/test/Analysis/inlining/inline-defensive-checks.c b/test/Analysis/inlining/inline-defensive-checks.c
new file mode 100644
index 000000000000..df3a8f22811e
--- /dev/null
+++ b/test/Analysis/inlining/inline-defensive-checks.c
@@ -0,0 +1,99 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config suppress-inlined-defensive-checks=true -verify %s
+
+// Perform inline defensive checks.
+void idc(int *p) {
+ if (p)
+ ;
+}
+
+int test01(int *p) {
+ if (p)
+ ;
+ return *p; // expected-warning {{Dereference of null pointer}}
+}
+
+int test02(int *p, int *x) {
+ if (p)
+ ;
+ idc(p);
+ if (x)
+ ;
+ return *p; // expected-warning {{Dereference of null pointer}}
+}
+
+int test03(int *p, int *x) {
+ idc(p);
+ if (p)
+ ;
+ return *p; // False negative
+}
+
+int deref04(int *p) {
+ return *p; // expected-warning {{Dereference of null pointer}}
+}
+
+int test04(int *p) {
+ if (p)
+ ;
+ idc(p);
+ return deref04(p);
+}
+
+int test11(int *q, int *x) {
+ int *p = q;
+ if (q)
+ ;
+ if (x)
+ ;
+ return *p; // expected-warning{{Dereference of null pointer}}
+}
+
+int test12(int *q) {
+ int *p = q;
+ idc(q);
+ return *p;
+}
+
+int test13(int *q) {
+ int *p = q;
+ idc(p);
+ return *p;
+}
+
+int test21(int *q, int *x) {
+ if (q)
+ ;
+ if (x)
+ ;
+ int *p = q;
+ return *p; // expected-warning{{Dereference of null pointer}}
+}
+
+int test22(int *q, int *x) {
+ idc(q);
+ if (x)
+ ;
+ int *p = q;
+ return *p;
+}
+
+int test23(int *q, int *x) {
+ idc(q);
+ if (x)
+ ;
+ int *p = q;
+ if (!p)
+ ;
+ return *p; // False negative
+}
+
+void use(char *p) {
+ if (!p)
+ return;
+ p[0] = 'a';
+}
+
+void test24(char *buffer) {
+ use(buffer);
+ buffer[1] = 'b';
+}