C 已丢弃的副作用,并将参数传递给assert
我有一个编译器警告,我想摆脱它 警告:“\uuuu builtin\u aspect”的参数具有将被丢弃的副作用[-Wassume] C:\Keil\u v5\ARM\ARMCLANG\Bin..\include\assert.h(72):注意:从宏“assert”展开 定义断言(e)((e)?(void)0:_CLIBNS _aeabi_断言(e,_文件uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 这样做的目的是在将警告设置为“pedantic”的情况下编译时没有警告。 原因是最近在我的嵌入式代码中添加了指针检查函数。其目的是改进以下方面:C 已丢弃的副作用,并将参数传递给assert,c,embedded,armclang,C,Embedded,Armclang,我有一个编译器警告,我想摆脱它 警告:“\uuuu builtin\u aspect”的参数具有将被丢弃的副作用[-Wassume] C:\Keil\u v5\ARM\ARMCLANG\Bin..\include\assert.h(72):注意:从宏“assert”展开 定义断言(e)((e)?(void)0:_CLIBNS _aeabi_断言(e,_文件uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
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
}
#定义内部RAM_启动((uintpttr_t)0x200000ul)
#定义内部内存结束(内部内存开始+(uintptr t)0x20000UL)
#定义内部ROM启动((uintptr)0x800000UL)
#定义内部ROM结束(内部ROM开始+(uintptr t)0x100000UL)
typedef枚举{OK,NOT_OK}状态\u t;
静态内联状态检查PTR(常量无效*常量检查)
{
如果(ptr==NULL)
返回不正常;
const uintpttr_t ptr=(uintpttr_t)ptrToCheck;
如果((ptr>=内部RAM\U开始)和&(ptr<内部RAM\U结束))
返回OK;
如果((ptr>=内部只读存储器开始)和&(ptr<内部只读存储器结束))
返回OK;
返回不正常
}
我的代码中没有任何关于ARMCC 5.06的警告。从我所看到的,我的checkPtr功能没有任何副作用。它不访问传递给它的指针以外的任何变量。建议armclang支持\uuuuu属性(pure))
和\uuu属性(const))
函数属性。这些属性用于没有任何副作用的函数,它们的返回值基于输入参数。纯函数也可以读取全局状态,而常量函数只能检查其函数参数
将其中一个属性添加到
checkPtr
声明和定义中应该会使警告静音。强制转换到const uintptr\t
会保持指针的常量,但会丢弃指针的常量。您是否查找-Wno asike或类似内容?@2501我不想禁用警告。而是修复代码,这样就不会出现警告。@Benoit指针永远不会被取消引用,我只对指针值本身感兴趣。使用uint8_t指针有效吗?即const uint8_t*const ptr=(uint8_t*)指针选中代码>工作?\uuuuu属性(纯))
和\uuuu属性(常量))
似乎都解决了这个问题。@Flip我扩展了答案,还提到了常量属性。谢谢你指出这一点。