【发布时间】:2015-09-06 12:42:06
【问题描述】:
我基于 gcc 的原子内置函数开发了一个可重入函数。不幸的是,我收到关于“计算但未使用”值的神秘警告:
$ gcc -c -Wall ss.c
ss.c: In function ‘ss_wrapper’:
ss.c:87:3: warning: value computed is not used [-Wunused-value]
__atomic_exchange_n(&ss_top, hit, __ATOMIC_SEQ_CST);
^
ss.c:91:5: warning: value computed is not used [-Wunused-value]
__atomic_exchange_n(&ss_top, bkp->next, __ATOMIC_SEQ_CST); // release the lock, find out if there is new element
^
这是我的功能:
static void ss_wrapper(int signum, siginfo_t* siginfo, void *ucontext) {
// currently top element on the signal stack
static struct ss_hit* ss_top = NULL;
struct ss_hit* hit = ss_newhit(signum, siginfo, (ucontext_t*)ucontext);
struct ss_hit* bkp;
again:
bkp = hit;
__atomic_exchange_n(&ss_top, hit, __ATOMIC_SEQ_CST);
if (!hit) { // we got the lock, we are the master
ss_fire(bkp);
// release the lock, find out if there is new element
__atomic_exchange_n(&ss_top, bkp->next, __ATOMIC_SEQ_CST);
if (bkp->next) { // there IS
hit = bkp;
free(bkp);
goto again;
} else
free(bkp);
} else { // we didn't got the lock, but we got the top in hit
__atomic_store(&hit->next, &bkp, __ATOMIC_SEQ_CST);
}
}
为什么会这样? __atomic_exchange_n 不应该计算任何东西,它只会交换两个变量的内容。
【问题讨论】:
-
整个源文件可以在here找到。
-
你不应该直接使用 atomic-builtins,而是使用 C11
stdatomic.h。为什么要让你的代码在没有实际需要的情况下依赖编译器。 -
@Olaf 由于缺乏信任,我尝试使用可能的最低级别。但是现在我的代码生成了很好的 asm,没有更多理由不使用符合标准的方式,这就是我要做的。
-
"缺乏信任"...好吧,因为这是一个仅标题的功能,您可以轻松验证这一点。所以你验证你的编译器生成的所有汇编?如果汇编器映射到错误的机器码怎么办?你在哪里停下来?
-
@Olaf 不是全部,只做硬件附近的事情,例如原子操作。验证原子指令的汇编是一件非常简单的事情,在我之前的尝试中,我多次发现原子内置指令产生了可疑代码(例如,如果它从堆栈中读取变量,在 regs 中进行交换,然后将它回来了,它已经不是原子的)。另一个原因是我想看看 gcc 是如何做到的。
标签: c gcc atomic gcc4.9 reentrancy