|
Непонятки с функцией memcpy |
|
|
|
Aug 13 2015, 08:23
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Добрый день. Процессор ARM11, компилятор ADS 1.2 Имеется следующая функция: Код UCHAR RFC4357_KeyUnwrap(GOST28147_BCTX_PTR pX, RFC4357_WRAPPED_KEY_PTR pWrappedKey, PUCHAR pUnwrappingKey, PUCHAR pUnwrappedKey) { UCHAR kd[32]; UCHAR ke[32];
/* calc diversified key */ memcpy(kd, pUnwrappingKey, 32); ... /* decrypt key */ memcpy(ke, pWrappedKey->KEY, 32); ... } Во время второго вызова memcpy() возникает исключение Misaligned. И действительно, перед вызовом функции R1 = 010CF0BA. Из листинга видно, что при первом вызове вызывается функция __rt_memcpy, а при втором - __rt_memcpy_w. Собственно, вопросы: 1. Из каких соображений компилятор в 1-м случае поставил функцию побайтного копирования, а во 2-м - пословного? 2. Как сказать компилятору, чтобы он во 2-м случае тоже использовал __rt_memcpy?
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
 |
Ответов
|
Aug 13 2015, 09:26
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(aaarrr @ Aug 13 2015, 11:40)  Код UCHAR RFC4357_KeyUnwrap(GOST28147_BCTX_PTR pX, __packed RFC4357_WRAPPED_KEY_PTR pWrappedKey, PUCHAR pUnwrappingKey, PUCHAR pUnwrappedKey) И так везде. Но лучше бы выровнять. Не прокатило  . Нашел вот-такой документ: How do the ARM Compilers handle memcpy()? Попробовал с промежуточным указателем на char - помогло, __rt_memcpy_w превратилась в __rt_memcpy. Но все-таки логика компилятора мне непонятна. Дело в том, что ниже в функции есть вызов memcpy(pX->ectx.N, pWrappedKey->UKM, 8) - он транслируется в __rt_memcpy без всяких ухищрений.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Aug 13 2015, 09:44
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Harvester @ Aug 13 2015, 12:26)  Не прокатило  . Не прокатило в каком смысле - компилятор __packed не понимает, или все равно оставил __rt_memcpy_w? Цитата(Harvester @ Aug 13 2015, 12:26)  Но все-таки логика компилятора мне непонятна. Дело в том, что ниже в функции есть вызов memcpy(pX->ectx.N, pWrappedKey->UKM, 8) - он транслируется в __rt_memcpy без всяких ухищрений. А какая связь между этим memcpy и первым?
|
|
|
|
|
Aug 13 2015, 10:00
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(aaarrr @ Aug 13 2015, 12:44)  Не прокатило в каком смысле - компилятор __packed не понимает, или все равно оставил __rt_memcpy_w?
А какая связь между этим memcpy и первым? 1. Оставил __rt_memcpy_w 2. И там и там 2-м параметром используется невыровненный указатель (входной параметр функции)
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Aug 13 2015, 10:31
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Harvester @ Aug 13 2015, 13:00)  1. Оставил __rt_memcpy_w 2. И там и там 2-м параметром используется невыровненный указатель (входной параметр функции) 1. Если структура объявлена как Код typedef struct { } RFC4357_WRAPPED_KEY, *RFC4357_WRAPPED_KEY_PTR; то вполне возможно такое поведение. Тогда надо: Код UCHAR RFC4357_KeyUnwrap(GOST28147_BCTX_PTR pX, __packed RFC4357_WRAPPED_KEY *pWrappedKey, PUCHAR pUnwrappingKey, PUCHAR pUnwrappedKey) 2. В первом случае компилятор считает указатель выровненным.
|
|
|
|
Сообщений в этой теме
Harvester Непонятки с функцией memcpy Aug 13 2015, 08:23 aaarrr Цитата(Harvester @ Aug 13 2015, 11:23) 1.... Aug 13 2015, 08:29 Harvester Цитата(aaarrr @ Aug 13 2015, 11:29) То ес... Aug 13 2015, 08:37     Harvester Цитата(aaarrr @ Aug 13 2015, 13:31) 1. Ес... Aug 13 2015, 10:49      aaarrr Цитата(Harvester @ Aug 13 2015, 13:49) эт... Aug 13 2015, 10:58  scifi Цитата(Harvester @ Aug 13 2015, 12:26) На... Aug 13 2015, 10:08   Harvester Цитата(scifi @ Aug 13 2015, 13:08) Кстати... Aug 13 2015, 10:30 Golikov A. я бы __packed под typdef сразу запихал бы... Aug 13 2015, 08:48 Golikov A. Цитата1. Оставил __rt_memcpy_w
а как вы написали? ... Aug 13 2015, 10:24 scifi Цитата(Harvester @ Aug 13 2015, 12:26) Но... Aug 13 2015, 10:40 Harvester Цитата(scifi @ Aug 13 2015, 13:40) Ничего... Aug 13 2015, 11:21  aaarrr Цитата(Harvester @ Aug 13 2015, 14:21) По... Aug 13 2015, 11:30 Golikov A. указатель, а не структуру предлагают ... но все же... Aug 13 2015, 11:38 aaarrr Цитата(Golikov A. @ Aug 13 2015, 14:38) А... Aug 13 2015, 11:51
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|