Предупреждение о приведении указателя разного размера в системе ARM64

Я использую металлическую систему ARM A57 на базе Xilinx.

Я хочу перенести адреса двух символов, определенных компоновщиком, в мою программу c ...

Это скрипт компоновщика:

.mutex_ram: {
     _mutex_start = .;
     . += _MUTEX_SIZE;
     . = ALIGN(8);
     _mutex_end = .;
} > mem_common

Это краткое изложение того, что я хочу сделать в C.

extern int _mutex_start;
extern int _mutex_end;
void some_fcn(void) 
{
    int size = (int)(&_mutex_end)-(int)(&_mutex_start);
    memset(&_mutex_start,0,size);
}

Какого черта компилятор предупреждает меня, что это целочисленное преобразование разного размера? Я просто не понимаю ...

warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]

Кто-нибудь может мне помочь?


person hendrikschnack    schedule 06.01.2021    source источник
comment
int size - ›size_t size. На вашей платформе int, вероятно, 32-битный, тогда как размер указателя - 64-битный.   -  person Jabberwocky    schedule 06.01.2021
comment
На самом деле это должно быть size_t size = (size_t)(&_mutex_end - &_mutex_start)   -  person Jabberwocky    schedule 06.01.2021
comment
@Jabberwocky Целочисленные типы с указателями размера intptr_t и uintptr_t. Но в этом случае преобразование разницы (ptrdiff_t) в size_t выглядит разумным.   -  person MikeCAT    schedule 06.01.2021
comment
@MikeCAT хороший замечание, но как бы вы это написали?   -  person Jabberwocky    schedule 06.01.2021
comment
size_t size не помогло :(   -  person hendrikschnack    schedule 06.01.2021
comment
@hendrikschnack, вы сделали то, что я предложил в моем втором комментарии? Это работает здесь: godbolt.org/z/MjG5rf   -  person Jabberwocky    schedule 06.01.2021
comment
@Jabberwocky (& _mutex_end - & _mutex_start) не является законным согласно MISRA C, поскольку вы не можете вычитать указатели из разных объектов   -  person hendrikschnack    schedule 06.01.2021
comment
@hendrikschnack, тогда тебе нужно ptrdiff_t size = (ptrdiff_t)((intptr_t)&_mutex_end - (intptr_t)&_mutex_start);. Возможно, вам потребуется включить <stdint.h>   -  person Jabberwocky    schedule 06.01.2021
comment
@Jabberwocky: да, чувак, ты гений. Просто проверил ваше решение на моем конвейере MISRA, и оно прошло ...   -  person hendrikschnack    schedule 06.01.2021
comment
@hendrikschnack Кстати, (&_mutex_end - &_mutex_start) все равно был неправ, не только с точки зрения MISRA, потому что в соответствии с арифметикой указателя результат был разделен на sizeof(int).   -  person Jabberwocky    schedule 06.01.2021


Ответы (1)


Благодаря Jabberwocky я использовал

ptrdiff_t size = (ptrdiff_t)((intptr_t)&_mutex_end -  (intptr_t)&_mutex_start);

Я не знал, что использование ptr_diff_t действительно совместимо с MISRA ... Спасибо за помощь!

person hendrikschnack    schedule 06.01.2021