我有一个编译器警告我想摆脱。
警告:“__builtin_assume”的参数有副作用,将被丢弃-Wassume C:\Keil_v5\ARM\ARMCLANG\Bin..\include\assert.h(72):注意:从宏“断言”扩展 定义断言(E)(E)?0:_CLIBNS _aeabi_assert(e,_FILE__,_LINE__),(__ARM_PROMISE)((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.*/
}这是因为自动变量不是零不对称的。因此,未初始化的指针很可能不是空的。这是一个编码错误,我想要检测(不一定是我自己做的),因此进行检查。下面的内容并不完美,但似乎确实会出现更多的指针错误(不幸的是,不是悬空错误)。
我在头文件中有以下代码来实现这一点:
#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函数没有任何副作用。它不访问传递给它的指针以外的任何变量。
发布于 2016-07-20 09:30:00
文档建议armclang支持__attribute__ ((pure))和__attribute__ ((const))函数属性。这些属性用于没有任何副作用的函数,它们的返回值基于输入参数。纯函数也可以读取全局状态,而const函数只能检查其函数参数。
将其中一个属性添加到您的checkPtr声明和定义中,应该会使警告保持沉默。
https://stackoverflow.com/questions/38476278
复制相似问题