C 已丢弃的副作用,并将参数传递给assert

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

我有一个编译器警告,我想摆脱它

警告:“\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”的情况下编译时没有警告。 原因是最近在我的嵌入式代码中添加了指针检查函数。其目的是改进以下方面:

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我扩展了答案,还提到了常量属性。谢谢你指出这一点。