[PATCH] D47229: Make atomic non-member functions as nonnull

JF Bastien via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri May 25 10:15:57 PDT 2018

jfb added a comment.

In https://reviews.llvm.org/D47229#1112549, @jakehehrlich wrote:

> This is causing breaks in fuchsia,
> Code that looks like this
>   uintptr_t last_unlogged =
>        atomic_load_explicit(&unlogged_tail, memory_order_acquire);
>    do { 
>        if (last_unlogged == 0)
>            return;
>    } while (!atomic_compare_exchange_weak_explicit(&unlogged_tail,
>                                                    &last_unlogged, 0,
>                                                    memory_order_acq_rel,
>                                                    memory_order_relaxed));
> Where unlogged_tail is somewhere on the stack. And 'atomic_compare_exchange_weak_explicit' is an #define alias for '__c11_atomic_compare_exchange_weak'
> Full context here: https://fuchsia.googlesource.com/zircon/+/master/third_party/ulib/musl/ldso/dynlink.c#822

Here's a repro for what seems to be happening:

  #include <stdatomic.h>
  void foo() {
    atomic_int s;
    int a;
    atomic_compare_exchange_weak_explicit(&s, &a, 0, memory_order_acq_rel, memory_order_relaxed);


  ./foo.c:5:3: warning: null passed to a callee that requires a non-null argument [-Wnonnull]
    atomic_compare_exchange_weak_explicit(&s, &a, 0, memory_order_acq_rel, memory_order_relaxed);
    ^                                             ~
  /s/llvm1/llvm/debug/lib/clang/7.0.0/include/stdatomic.h:144:47: note: expanded from macro 'atomic_compare_exchange_weak_explicit'
  #define atomic_compare_exchange_weak_explicit __c11_atomic_compare_exchange_weak

The problem is that my patch checks that the "desired" value is non-null, but that's incorrect because it's not a pointer. I'll do a follow-up fix. Thanks for catching this!



More information about the cfe-commits mailing list