如何解决GCC警告,"XXX的地址永远不会为NULL"?

Chu*_*ang 6 c macros gcc compiler-warnings suppress-warnings

我正在研究一个C程序.有一个函数需要两个指针参数,调用它cmp().cmp()出于说明的原因,我在这里提供了一个简化的替身:

int cmp(struct foo *a, struct foo *b)
{
    return a->bar == b->bar;
}
Run Code Online (Sandbox Code Playgroud)

我想制作一个NULL-check宏,如下所示:

#define SAFE_CMP(a,b) (((a) != NULL && (b) != NULL) ? cmp((a),(b)) : 0)
Run Code Online (Sandbox Code Playgroud)

我觉得这很好.但是,在使用-Wall以及将警告视为错误的compliation开关进行编译时,以下代码很麻烦:

int baz(struct foo *a)
{
   struct foo b;
   /* ... */
   return SAFE_CMP(a, &b); 
}
Run Code Online (Sandbox Code Playgroud)

因为gcc警告"b的地址永远不会为NULL".

有没有办法解决这种情况?具有多种辅助宏象SAFE_CMP_1(safe_arg,unsafe_arg)SAFE_CMP_2(unsafe_arg,safe_arg)等是我想要的最后一件事.我想让一个助手宏适用于所有情况.

caf*_*caf 12

这似乎压制了我的警告:

#define SAFE_CMP(a,b) (((void *)(a) != NULL && (void *)(b) != NULL) ? cmp((a),(b)) : 0)
Run Code Online (Sandbox Code Playgroud)

......但就个人而言,我只是创建safe_cmp()一个功能本身.

int safe_cmp(struct foo *a, struct foo *b) {
    return (a && b) ? (a->bar == b->bar) : 0;
}
Run Code Online (Sandbox Code Playgroud)