Отброшенные побочные эффекты с аргументом, переданным для подтверждения

У меня есть предупреждение компилятора, от которого я хотел бы избавиться.

предупреждение: аргумент '__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 Декларация и определение должны заставить замолчать предупреждение.

Другие вопросы по тегам