ошибка: упорядоченное сравнение указателя с нулевым указателем [-Werror = extra] - PullRequest
0 голосов
/ 12 июня 2019

При попытке сравнить void указатель addr> (void *) 0XFFFE00000000 я получаю указанную ниже ошибку в архитектуре arm.1001 *

Это происходит только в архитектуре Linux arm, в других архитектурах работает нормально

addr> (void *) 0XFFFE00000000

Как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Вероятно, целочисленный литерал переполняется в 32 бита, который становится 0 или NULL.

Но вы не должны сравнивать случайные (void) указатели для того, чтобы быть больше некоторого случайного целого числа,тем не мение.Приведите указатель к uintptr_t и убедитесь, что литерал также имеет подходящий тип, тогда он начинает работать с большей вероятностью.Кажется, что макроса UINTPTR_C() не существует, но, возможно, имеет смысл использовать UINTMAX_C()?

Конечно, если ваш неуказанный «ARM» является 32-битным, то адрес является выходнымграниц и, вероятно, больше, чем указатели, будет ... довольно запутанным.

0 голосов
/ 21 июня 2019

Сравнение порядка двух указателей не имеет смысла, кроме случаев, когда оба указателя указывают на один и тот же массив (и даже в этом случае это в лучшем случае сомнительно; как правило, вместо упорядочения вы используете неравенство).

Так как ваша настоящая проблема

старшие байты адреса моего сигнала перезаписываются на 0XFFFE0

Первым делом стоит выяснить, почему это происходит и можно ли его предотвратить: если адрес переопределяется, это указывает на то, что в коде что-то очень не так, и вам следует устранить основную причину, а не симптомы.

Тем не менее, если все, что требуется, это обнулить старшие, переопределенные байты вашего указателя, переносимый способ - преобразовать указатель в целое число и манипулировать этим , а не манипулировать указателем напрямую. :

const uintptr_t mask_bytes = 0xFFFE;
const int mask_width = 4 * CHAR_BIT; // ?!
const uintptr_t mask = mask_bytes << ((sizeof(uintptr_t) * CHAR_BIT) - mask_width);

uintptr_t uaddr = (uintptr_t) addr;

if ((uaddr & mask) == mask) {
    addr = (void*) (uaddr & ~ mask);
}

… замените void* вашим фактическим типом указателя.

...