Предупреждение о приведении указателя GCC - PullRequest
0 голосов
/ 14 декабря 2011

Мне интересно, почему GCC дает мне это предупреждение:

test.h: In function TestRegister:
test.h:12577: warning: cast to pointer from integer of different size

Код:

#define Address   0x1234
int TestRegister(unsigned int BaseAddress)
{
    unsigned int RegisterValue = 0;
    RegisterValue              = *((unsigned int *)(BaseAddress + Address)) ;
    if((RegisterValue & 0xffffffff) != (0x0 << 0))
    {
            return(0);
    }
    else
    {
            return(1);
    }
}

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

Возможно, потому что вы работаете на 64-битной платформе, где указатели 64-битные, а int s 32-битные.

Практическое правило. Не пытайтесь использовать целыехранить адреса.

1 голос
/ 15 декабря 2011

Если вы включите <stdint.h> и если вы компилируете для стандарта C99 , используя gcc -Wall -std=c99, вы можете приводить к intptr_t и обратно, что является целочисленным типом того же размера, что и указатели.

RegisterValue = *((unsigned int *)((intptr_t)(BaseAddress + Address))) ;
0 голосов
/ 14 декабря 2011

Помимо прочего, вы предполагаете, что указатель будет соответствовать в unsigned int, где C не дает такой гарантии … сегодня используется несколько платформгде это не соответствует действительности, по-видимому, в том числе и ваше.

Указатель на данные можно безопасно хранить в (void*) или (тип *).Указатели могут быть добавлены (или вычтены для получения) size_t или ssize_t.Не существует гарантированной взаимосвязи между sizeof(int), sizeof(size_t), sizeof(ssize_t) и (void*) или (тип *)…

(Кроме того, в этом случае нет никакой реальной точки в инициализации varи перезаписать его в следующей строке…)

Также не связано, но вы понимаете, что != (0x0 << 0)!= 0 и может быть опущено, поскольку if (x) = if (x != 0)…?Возможно, это потому, что это вырезано из более крупного образца, но вся эта процедура может быть представлена ​​как

   int TestRegister (unsigned int* BaseAddress)
     { return ( (0xffffffff & *(BaseAddress + Address)) ? 0 : 1 ); }

(Отредактировано: изменено на unsigned int*, так как кажется, что он с большей вероятностью пропустит *Смещения 1029 *?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...