реклама на сайте
подробности

 
 
> Непонятки с функцией memcpy
Harvester
сообщение Aug 13 2015, 08:23
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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?


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Aug 13 2015, 10:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Harvester @ Aug 13 2015, 12:26) *
Но все-таки логика компилятора мне непонятна. Дело в том, что ниже в функции есть вызов memcpy(pX->ectx.N, pWrappedKey->UKM, 8) - он транслируется в __rt_memcpy без всяких ухищрений.

После того, как вы привели объявление типа, стало понятно. Дело в том, что pX уже упакованный, так как указывает на упакованную структуру (см. объявление соответствующего типа).

Цитата(Harvester @ Aug 13 2015, 13:30) *
Какая-то странная мешанина директив.

Ничего странного. Просто упаковывают структуру разными способами в зависимости от применяемого компилятора.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Aug 13 2015, 11:21
Сообщение #3


Местный
***

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



Цитата(scifi @ Aug 13 2015, 13:40) *
Ничего странного. Просто упаковывают структуру разными способами в зависимости от применяемого компилятора.

ЧТО директивы делают я понимаю, я просто не могу понять смысла их комбинации:
Код
#if defined(__ICCARM__) || defined(__ICCAVR__)
#pragma pack(ALIGNMENT)            // Если IAR - последующие объявления пакуются по ALIGNMENT (4)
#define __attribute__(...) // ??? возможно это отмена ключевого слова attribute - но зачем?
#endif            

#if !defined(__ARMCC_VERSION)
#pragma pack (push, 4)  // Если не ARMCC, снова приказываем паковать по 4 с сохранением текущего уровня упаковки
#endif
typedef struct GOST28147_BCTX_tag {
...
#if defined(__ICCARM__) || defined(__ICCAVR__)
}__attribute__ ((packed)) GOST28147_BCTX, *GOST28147_BCTX_PTR; // Если IAR - используем (отмененное?) ключевое слово
#else
} GOST28147_BCTX, *GOST28147_BCTX_PTR;

#if !defined(__ARMCC_VERSION)
#pragma pack (pop) // Если не ARMCC - возвращаем уровень упаковки
#endif

#if defined(__ICCARM__) || defined(__ICCAVR__)
#pragma pack()             // Если IAR - ставим уровень упаковки по умолчанию
#endif

Т.е. если я правильно разобрал, в случае компилятора IAR явная упаковка указывается 2 раза, а для других компиляторов - ни одного. Наверное, стоит добавить условие упаковки для ARMCC?

Цитата(aaarrr @ Aug 13 2015, 13:58) *
Нет, первое было:
Код
UCHAR RFC4357_KeyUnwrap(GOST28147_BCTX_PTR pX,
                         __packed RFC4357_WRAPPED_KEY_PTR pWrappedKey,
                         PUCHAR pUnwrappingKey,
                         PUCHAR pUnwrappedKey)

Мне кажется, что с точки зрения языка оба объявления тождественны. Но проверю sm.gif

Хм, забавно.
__packed RFC4357_WRAPPED_KEY_PTR pWrappedKey - ничего не дает, а
__packed RFC4357_WRAPPED_KEY *pWrappedKey выдает ошибку "Error: C2510E: Definition of 'struct RFC4357_WRAPPED_KEY_tag' not '__packed': qualifier ignored". Получается, если параметр функции указан как __packed, то тип должен быть упакован явно.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - aaarrr   КодUCHAR RFC4357_KeyUnwrap(GOST28147_BCTX_PTR ...   Aug 13 2015, 08:40
|- - Harvester   Цитата(aaarrr @ Aug 13 2015, 11:40) КодUC...   Aug 13 2015, 09:26
|- - aaarrr   Цитата(Harvester @ Aug 13 2015, 12:26) Не...   Aug 13 2015, 09:44
||- - Harvester   Цитата(aaarrr @ Aug 13 2015, 12:44) Не пр...   Aug 13 2015, 10:00
||- - aaarrr   Цитата(Harvester @ Aug 13 2015, 13:00) 1....   Aug 13 2015, 10:31
||- - 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
|- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 03:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.02277 секунд с 7
ELECTRONIX ©2004-2016