Я посмотрел Ваш код по ссылке.
Действительно, это проблема с выравниванием. Для некоторых архитектур (в частности ARM) необходимо, чтобы обращения к памяти имели естественное выравнивание, т.е. адрес памяти должен быть кратен размеру данных (2 для short, 4 для int, 8 для uint64_t и double).
У Вас это происходит из-за величины lpos (даже в предположении, что ret.data выровнена на границу слова (или двойного слова, как обычнно возвращает malloc())).
Похоже, что проще всего будет перед основным циклом
for(l; l < ft; l += 4)
*(unsigned int*)l ^= mask;
добавить несколько строчек
for(; l < t && l & 0x3; l++) { // цикл выполнится 0, 1, 2 или 3 раза
*l ^= *m;
mask = (mask << 8) | ((mask >> 24) & 0xff); // циклический сдвиг влево на 1 байт
}
которые (по идее, на компе не проверял) побайтово меняют данные, пока не достигнуто выравниваание подходящее для int и крутят маску так, чтобы в следующем цикле для int она осталась правильной.
l? – VladD May 19 '15 at 18:07