В настоящее время я работаю над схемами выделения памяти кучи.Я хочу обнаружить невыровненный доступ без реального оборудования (с использованием gcc).
Во-первых, я использую arm-none-eabi-gcc в качестве компилятора, и моя рабочая станция - Ubuntu 16.04.Я пытался обнаружить не выровненный доступ с помощью этого компилятора.
Я ожидаю, что следующий код действителен с точки зрения выравнивания.
int main ( int argc, char ** argv )
{
int32_t volatile * const ptr = ( int32_t volatile * ) 0x20000000;
*ptr = 3;
*(ptr + 1 ) = 4;
*(ptr + 2 ) = 5;
*(ptr + 3 ) = 6;
return 0;
}
Но я ожидаю, что следующий код недействителен с точки зрениявыравнивание.
int main ( int argc, char** argv )
{
int32_t volatile * const ptr = ( int32_t volatile * ) 0x20000003;
*ptr = 3;
*(ptr + 1 ) = 4;
*(ptr + 2 ) = 5;
*(ptr + 3 ) = 6;
return 0;
}
Я преобразую эти коды C в сборку, используя следующие строки соответственно: arm-none-eabi-gcc -O0 -o main_0.s -S ../main.c
, arm-none-eabi-gcc -O0 -o main_3.s -S ../main.c
Когда я сравниваю коды сборки, между этими сборками нет никакой разницыкоды.Также GCC не показывает никаких предупреждений.
Итак, почему эти коды сборки одинаковы?Как я могу создать условие невыровненного доступа?Есть ли способ обнаружить невыровненные условия доступа с помощью GCC?
Спасибо