[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);
}
Yields:
./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!
Repository:
rL LLVM
https://reviews.llvm.org/D47229
More information about the cfe-commits
mailing list