我開發了一個基於gcc的原子內置函數的可重入函數。不幸的是,我得到「計算,但不使用」的價值觀神祕警告:__atomic_exchange_n上的神祕「計算值未使用」警告#
$ 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
不應該計算任何東西,它只會交換兩個變量的內容。
整個源文件可以找到[這裏](https://開頭raw.githubusercontent.com/HorvathAkosPeter/pipenet/master/staging/ss.c)。 – peterh
你不應該直接使用atomic-builtins,而是使用C11'stdatomic.h'。爲什麼讓你的代碼依賴於編譯器而不需要實際的需要。 – Olaf
@Olaf由於缺乏信任,我試圖使用可能的最低級別。但是現在我的代碼產生了良好的asm,沒有更多的理由不使用符合標準的方式,這就是我將要做的。 – peterh