传递给断言的参数丢弃副作用

时间:2016-07-20 08:36:46

标签: c embedded armclang

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

  

警告:'__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函数没有任何副作用。除了传递给它的指针之外,它不会访问任何变量。

1 个答案:

答案 0 :(得分:2)

documentation表明armclang支持__attribute__ ((pure))__attribute__ ((const))函数属性。这些属性适用于没有任何副作用的函数,它们的返回值基于输入参数。纯函数也可以读取全局状态,而const函数只能检查其函数参数。

将这些属性中的一个添加到checkPtr声明和定义中应该使警告静音。