我有一个编译器警告,我想摆脱它。
警告:'__builtin_assume' 的参数具有将被丢弃的副作用 [-Wassume]
C:\Keil_v5\ARM\ARMCLANG\Bin..\include\assert.h(72):注意:从宏 'assert' 扩展
定义断言(e)((e)?(void)0:_CLIBNS _aeabi_assert(e,_FILE__,_LINE__),(__ARM_PROMISE)((e)?1:0))
这个想法是在将警告设置为“pedantic”的情况下编译时没有警告。原因是最近在我的嵌入式代码中添加了指针检查功能。我们的想法是改进以下内容:
void foo(int* const val)
{ assert(val != NULL);
/*Use val etc.*/
}
类似于以下内容:
void foo(int* const val)
{ assert(checkPtr(val) == OK);
/*Use val etc.*/
}
这是因为自动变量不是零初始化的。因此,未初始化的指针很可能不会为 NULL。这是我想检测的编码错误(不一定是我自己做的),因此需要检查。以下内容并不完美,但似乎确实发现了更多的指针错误(不幸的是,不是悬空的)。
我在头文件中有以下代码来实现这一点:
#define INTERNAL_RAM_START ((uintptr_t)0x2000000UL)
#define INTERNAL_RAM_END (INTERNAL_RAM_START + (uintptr_t)0x20000UL)
#define INTERNAL_ROM_START ((uintptr_t)0x8000000UL)
#define INTERNAL_ROM_END (INTERNAL_ROM_START + (uintptr_t)0x100000UL)
typedef enum{OK, NOT_OK}Status_t;
static inline Status_t checkPtr(const void* const ptrToCheck)
{
if(ptr == NULL)
return NOT_OK;
const uintptr_t ptr = (uintptr_t)ptrToCheck;
if((ptr >= INTERNAL_RAM_START) && (ptr < INTERNAL_RAM_END))
return OK;
if((ptr >= INTERNAL_ROM_START) && (ptr < INTERNAL_ROM_END))
return OK;
return NOT_OK
}
我的代码中没有任何关于 ARMCC 5.06 的警告。据我所知,我的 checkPtr 函数没有任何副作用。除了传递给它的指针之外,它不访问任何变量。