arphaman created this revision.
arphaman added reviewers: rsmith, manmanren.
arphaman added a subscriber: cfe-commits.
arphaman set the repository for this revision to rL LLVM.

This patch teaches clang that it has to emit a warning when NULL is passed as 
the 'expected' pointer parameter into an atomic compare exchange call.


Repository:
  rL LLVM

https://reviews.llvm.org/D26978

Files:
  lib/Sema/SemaChecking.cpp
  test/Sema/atomic-ops.c


Index: test/Sema/atomic-ops.c
===================================================================
--- test/Sema/atomic-ops.c
+++ test/Sema/atomic-ops.c
@@ -174,14 +174,14 @@
   __atomic_fetch_or(D, 3, memory_order_seq_cst); // expected-error {{must be a 
pointer to integer}}
   __atomic_fetch_and(s1, 3, memory_order_seq_cst); // expected-error {{must be 
a pointer to integer}}
 
-  _Bool cmpexch_1 = __c11_atomic_compare_exchange_strong(i, 0, 1, 
memory_order_seq_cst, memory_order_seq_cst);
-  _Bool cmpexch_2 = __c11_atomic_compare_exchange_strong(p, 0, (int*)1, 
memory_order_seq_cst, memory_order_seq_cst);
-  _Bool cmpexch_3 = __c11_atomic_compare_exchange_strong(d, (int*)0, 1, 
memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{incompatible 
pointer types}}
+  _Bool cmpexch_1 = __c11_atomic_compare_exchange_strong(i, I, 1, 
memory_order_seq_cst, memory_order_seq_cst);
+  _Bool cmpexch_2 = __c11_atomic_compare_exchange_strong(p, P, (int*)1, 
memory_order_seq_cst, memory_order_seq_cst);
+  _Bool cmpexch_3 = __c11_atomic_compare_exchange_strong(d, I, 1, 
memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{incompatible 
pointer types}}
   (void)__c11_atomic_compare_exchange_strong(i, CI, 1, memory_order_seq_cst, 
memory_order_seq_cst); // expected-warning {{passing 'const int *' to parameter 
of type 'int *' discards qualifiers}}
 
-  _Bool cmpexchw_1 = __c11_atomic_compare_exchange_weak(i, 0, 1, 
memory_order_seq_cst, memory_order_seq_cst);
-  _Bool cmpexchw_2 = __c11_atomic_compare_exchange_weak(p, 0, (int*)1, 
memory_order_seq_cst, memory_order_seq_cst);
-  _Bool cmpexchw_3 = __c11_atomic_compare_exchange_weak(d, (int*)0, 1, 
memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{incompatible 
pointer types}}
+  _Bool cmpexchw_1 = __c11_atomic_compare_exchange_weak(i, I, 1, 
memory_order_seq_cst, memory_order_seq_cst);
+  _Bool cmpexchw_2 = __c11_atomic_compare_exchange_weak(p, P, (int*)1, 
memory_order_seq_cst, memory_order_seq_cst);
+  _Bool cmpexchw_3 = __c11_atomic_compare_exchange_weak(d, I, 1, 
memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{incompatible 
pointer types}}
   (void)__c11_atomic_compare_exchange_weak(i, CI, 1, memory_order_seq_cst, 
memory_order_seq_cst); // expected-warning {{passing 'const int *' to parameter 
of type 'int *' discards qualifiers}}
 
   _Bool cmpexch_4 = __atomic_compare_exchange_n(I, I, 5, 1, 
memory_order_seq_cst, memory_order_seq_cst);
@@ -503,4 +503,9 @@
   (void)__atomic_compare_exchange_n(p, p, val, 0, memory_order_seq_cst, 
memory_order_relaxed);
 }
 
-
+void nullPointerWarning(_Atomic(int) *Ap, int *p, int val) {
+  // The 'expected' pointer shouldn't be NULL.
+  (void)__c11_atomic_compare_exchange_strong(Ap, NULL, val, 
memory_order_relaxed, memory_order_relaxed); // expected-warning {{null passed 
to a callee that requires a non-null argument}}
+  (void)atomic_compare_exchange_weak(Ap, ((void*)0), val); // expected-warning 
{{null passed to a callee that requires a non-null argument}}
+  (void)__atomic_compare_exchange_n(p, NULL, val, 0, memory_order_relaxed, 
memory_order_relaxed); // expected-warning {{null passed to a callee that 
requires a non-null argument}}
+}
Index: lib/Sema/SemaChecking.cpp
===================================================================
--- lib/Sema/SemaChecking.cpp
+++ lib/Sema/SemaChecking.cpp
@@ -2874,6 +2874,9 @@
           Ty = Context.getPointerDiffType();
         else {
           Expr *ValArg = TheCall->getArg(i);
+          // Treat this argument as _Nonnull as we want to show a warning if
+          // NULL is passed into it.
+          CheckNonNullArgument(*this, ValArg, DRE->getLocStart());
           unsigned AS = 0;
           // Keep address space of non-atomic pointer type.
           if (const PointerType *PtrTy =


Index: test/Sema/atomic-ops.c
===================================================================
--- test/Sema/atomic-ops.c
+++ test/Sema/atomic-ops.c
@@ -174,14 +174,14 @@
   __atomic_fetch_or(D, 3, memory_order_seq_cst); // expected-error {{must be a pointer to integer}}
   __atomic_fetch_and(s1, 3, memory_order_seq_cst); // expected-error {{must be a pointer to integer}}
 
-  _Bool cmpexch_1 = __c11_atomic_compare_exchange_strong(i, 0, 1, memory_order_seq_cst, memory_order_seq_cst);
-  _Bool cmpexch_2 = __c11_atomic_compare_exchange_strong(p, 0, (int*)1, memory_order_seq_cst, memory_order_seq_cst);
-  _Bool cmpexch_3 = __c11_atomic_compare_exchange_strong(d, (int*)0, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{incompatible pointer types}}
+  _Bool cmpexch_1 = __c11_atomic_compare_exchange_strong(i, I, 1, memory_order_seq_cst, memory_order_seq_cst);
+  _Bool cmpexch_2 = __c11_atomic_compare_exchange_strong(p, P, (int*)1, memory_order_seq_cst, memory_order_seq_cst);
+  _Bool cmpexch_3 = __c11_atomic_compare_exchange_strong(d, I, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{incompatible pointer types}}
   (void)__c11_atomic_compare_exchange_strong(i, CI, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{passing 'const int *' to parameter of type 'int *' discards qualifiers}}
 
-  _Bool cmpexchw_1 = __c11_atomic_compare_exchange_weak(i, 0, 1, memory_order_seq_cst, memory_order_seq_cst);
-  _Bool cmpexchw_2 = __c11_atomic_compare_exchange_weak(p, 0, (int*)1, memory_order_seq_cst, memory_order_seq_cst);
-  _Bool cmpexchw_3 = __c11_atomic_compare_exchange_weak(d, (int*)0, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{incompatible pointer types}}
+  _Bool cmpexchw_1 = __c11_atomic_compare_exchange_weak(i, I, 1, memory_order_seq_cst, memory_order_seq_cst);
+  _Bool cmpexchw_2 = __c11_atomic_compare_exchange_weak(p, P, (int*)1, memory_order_seq_cst, memory_order_seq_cst);
+  _Bool cmpexchw_3 = __c11_atomic_compare_exchange_weak(d, I, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{incompatible pointer types}}
   (void)__c11_atomic_compare_exchange_weak(i, CI, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{passing 'const int *' to parameter of type 'int *' discards qualifiers}}
 
   _Bool cmpexch_4 = __atomic_compare_exchange_n(I, I, 5, 1, memory_order_seq_cst, memory_order_seq_cst);
@@ -503,4 +503,9 @@
   (void)__atomic_compare_exchange_n(p, p, val, 0, memory_order_seq_cst, memory_order_relaxed);
 }
 
-
+void nullPointerWarning(_Atomic(int) *Ap, int *p, int val) {
+  // The 'expected' pointer shouldn't be NULL.
+  (void)__c11_atomic_compare_exchange_strong(Ap, NULL, val, memory_order_relaxed, memory_order_relaxed); // expected-warning {{null passed to a callee that requires a non-null argument}}
+  (void)atomic_compare_exchange_weak(Ap, ((void*)0), val); // expected-warning {{null passed to a callee that requires a non-null argument}}
+  (void)__atomic_compare_exchange_n(p, NULL, val, 0, memory_order_relaxed, memory_order_relaxed); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
Index: lib/Sema/SemaChecking.cpp
===================================================================
--- lib/Sema/SemaChecking.cpp
+++ lib/Sema/SemaChecking.cpp
@@ -2874,6 +2874,9 @@
           Ty = Context.getPointerDiffType();
         else {
           Expr *ValArg = TheCall->getArg(i);
+          // Treat this argument as _Nonnull as we want to show a warning if
+          // NULL is passed into it.
+          CheckNonNullArgument(*this, ValArg, DRE->getLocStart());
           unsigned AS = 0;
           // Keep address space of non-atomic pointer type.
           if (const PointerType *PtrTy =
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to