ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 июля
1348091
BlackMorda, мудак (06.09.2023 14:31, просмотров: 132) Make_Pic
Как обжечься на применении memset() IAR 8.2 . 

Разбирался с дизассемблированным текстом программы.

Есть работа с индикатором типа 1602.

Нашел функцию забивки строки пробелами, 3 параметра- указатель и два числа, одно код пробела, второй число 16.

Явно memset()

https://learn.microsoft.com/ru-ru/cpp/c-runtime-library/reference/memset-wmemset

void *memset(void *dest, int c, size_t count);


Подставил вызов библиотечной функции из IAR - не пошло.

Решил покопаться и нашел, что есть проблемы с memset
В IAR 8.0.4 и 9.1.5

http://www.iarsys.co.jp/download/LMS2/arm/8101/ewarm8101doc/common/doc/KnownProblems.html

https://updates.iar.com/filestore/standard/001/002/168/common/doc/KnownProblems.html

EW25524 / IDE-2671
When a breakpoint set at "memset();" triggered, the execution might halt at "__aeabi_memset(_D, _N, _C);" in DLib_Product_string.h.

Здесь пользователь IAR для RTOS/CC2640 пишет именно о такой проблеме:
https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/605999/rtos-cc2640-memset-issue-for-a-struct

-----

Стало понятно, что вызывается функция от разработчика архитектуры ARM c переставленными параметрами

Вот здесь в GCC, это указано

https://codebrowser.dev/glibc/glibc/sysdeps/arm/aeabi_memset.c.html

/* Set memory like memset, but different argument order and no return
value required. */
void
__aeabi_memset (void *dest, size_t n, int c)
{
memset (dest, c, n);
}

/* Versions of the above which may assume memory alignment. */
strong_alias (__aeabi_memset, __aeabi_memset4)
strong_alias (__aeabi_memset, __aeabi_memset8)

Здесь

https://community.st.com/t5/stm32-mcus-security/stm32-cryptographic-library-gcc-compatibility/td-p/530601

так

void __aeabi_memset(void *dest, char c, size_t n)
{
memset(dest, c, n);
}

"Энтропия растет."


Я еще заметил, что IAR на высоких степенях оптимизации может нарушать порядок передачи параметров через регистры.

Например "видит", что указатель на строку передается несколько раз в разные функции, может загнать его в R4 и не передавать его каждый раз.