gpt4 book ai didi

c - 丢弃带有传递给断言的参数的副作用

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:23 33 4
gpt4 key购买 nike

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

warning: the argument to '__builtin_assume' has side effects that will be discarded [-Wassume]

C:\Keil_v5\ARM\ARMCLANG\Bin..\include\assert.h(72): note: expanded from macro 'assert'

define assert(e) ((e) ? (void)0 : _CLIBNS _aeabi_assert(e, _FILE__, _LINE__), (__ARM_PROMISE)((e)?1:0))

这个想法是在警告设置为“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
}

我的代码中没有关于 ARMCC 5.06 的任何警告。据我所知,我的 checkPtr 函数没有任何副作用。除了传递给它的指针之外,它不访问任何变量。

最佳答案

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

将这些属性之一添加到您的 checkPtr 声明和定义应该消除警告。

关于c - 丢弃带有传递给断言的参数的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38476278/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com