我有一个编译器警告我想摆脱。
警告:'__builtin_assume'的参数有副作用,将被丢弃[-Wassume]
C:\ Keil_v5 \ ARM \ ARMCLANG \ Bin .. \ include \ assert.h(72):注意:从宏'assert'扩展
定义断言(e)((e)?(void)0:_CLIBNS _aeabi_assert(e,_FILE __,_ LINE__),(_ _ ARPRPR)((e)?1:0))
当编译警告设置为“迂腐”时,想法是没有警告。 原因是我最近为嵌入式代码添加了指针检查功能。我们的想法是改进以下内容:
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函数没有任何副作用。除了传递给它的指针之外,它不会访问任何变量。
答案 0 :(得分:2)
documentation表明armclang支持__attribute__ ((pure))
和__attribute__ ((const))
函数属性。这些属性适用于没有任何副作用的函数,它们的返回值基于输入参数。纯函数也可以读取全局状态,而const函数只能检查其函数参数。
将这些属性中的一个添加到checkPtr
声明和定义中应该使警告静音。