Какой обходной путь для исключения невыровненного доступа к памяти на ARM9 с использованием C? - PullRequest
4 голосов
/ 23 марта 2009

Архитектура ARM9. Язык программирования C.

У нас есть сторонний стек, и один из вызовов переносит указатель (pBuffer) на область памяти. Внутри стека они могут свободно перемещаться по переданному указателю и получать к нему доступ по своему усмотрению. К сожалению, они сместили переданный указатель и передали его в другую функцию, которая пыталась сделать это из odd / unalighed ячейки памяти

         ((uint16 *)pBuffer)[index] = value;

, где value имеет тип uint16, а index - проверенные границы и индексы pBuffer. Это вызывает исключение доступа к невыровненной памяти. pBuffer указывает на char * в куче.

Как уже упоминалось, хотя мы можем заглянуть в сторонний стек, мы не можем официально обновить код. Поэтому мы уведомляем провайдера, и он предоставляет обновление в следующем выпуске.

Я хочу понять, есть ли обходной путь для этого. Как выполнить указанное выше задание, не нарушая неприсоединенного доступа? Каков наилучший подход к решению таких проблем.

Ответы [ 3 ]

7 голосов
/ 23 марта 2009

Скопировать значение побайтно. Приведите его к (беззнаковому) указателю на символ, а затем скопируйте байт за раз.

Это не красиво, но не похоже, что у вас есть много вариантов.

1 голос
/ 23 апреля 2018

Если вы управляете pBuffer, то вы можете объявить его как массив uint32_t (или любого другого, соответствующего выравниванию вашей архитектуры). Объявив буфер как uint32_t, компилятор выберет правильное выравнивание. Вы можете привести его к uint8_t * при вызове целевой функции.

Это должно работать с примером кода, который вы опубликовали, но все равно может потерпеть неудачу, если сторонний код применяет любое не выровненное смещение к буферу.

1 голос
/ 23 марта 2009

Есть три варианта, и я пока не могу определить по вашему вопросу, в каком случае.

Случай 1: индекс всегда нечетный. Решение: memmove () pBuffer более 1 байта Случай 2: индекс иногда нечетный, и вы можете заранее предсказать, когда он будет. Решение: memmove () pBuffer превышает 1 байт, когда вы знаете, что индекс будет нечетным. Случай 3: индекс иногда нечетный, и вы не можете предсказать, когда он будет. Это прискорбно, потому что код будет неисправен.

...