Отброшенные побочные эффекты с аргументом, переданным для подтверждения
У меня есть предупреждение компилятора, от которого я хотел бы избавиться.
предупреждение: аргумент '__builtin_assume' имеет побочные эффекты, которые будут отброшены [-Wassume]
C: \ Keil_v5 \ ARM \ ARMCLANG \ Bin.. \ include \ assert.h (72): примечание: расширен из макроса 'assert'
определить assert(e) ((e)? (void)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.*/
}
Это потому, что автоматические переменные не инициализируются нулями. Таким образом, вполне вероятно, что неинициализированный указатель не будет 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 ответ
Документация предполагает, что armclang поддерживает __attribute__ ((pure))
а также __attribute__ ((const))
атрибуты функции. Эти атрибуты предназначены для функций, которые не имеют побочных эффектов, их возвращаемое значение основано на входных параметрах. Чистая функция также может читать глобальное состояние, в то время как функция const может проверять только параметры своей функции.
Добавление одного из этих атрибутов в ваш checkPtr
Декларация и определение должны заставить замолчать предупреждение.