eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2020-04-16 03:05 pm

'memcpy' forming offset 8 is out of the bounds

Вот интересная ерунда получается: скопировал код работы с FLASH из STM32F103 на STM32F072. Компилирую с теми же флагами, но на 103 все просвистывает без проблем, а на 072:
flash.c: In function 'flashstorage_init':
flash.c:101:9: error: 'memcpy' forming offset 8 is out of the bounds [0, 4] of object '__varsstart' with type 'uint32_t' {aka 'long unsigned int'} [-Werror=array-bounds]
         memcpy(&the_conf, &Flash_Data[currentconfidx], sizeof(user_conf));
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from flash.c:39:
flash.h:44:17: note: '__varsstart' declared here
 extern uint32_t __varsstart;

При чем здесь, интересно, тип __varsstart (объявленной в линкер-файле), если мне нужен лишь ее адрес?
static const user_conf *Flash_Data = (const user_conf *)(&__varsstart);

Бред какой-то. Надо пойти погулять...

UPD: я написал static, а в оригинале его не было. Похоже, gcc ругается, если такое вытворять с локальными объектами... (хотя, честно говоря, я ничего не понял).
Все-таки, несмотря на уже приличное количество накопленного кода, он на сниппеты у меня не очень годится: перед использованием все равно приходится тратить время на "причесывание".