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

StackOverflow https://stackoverflow.com/questions/673930

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top