Этот вопрос не о какой-либо ошибке, которую я сейчас вижу, а о теории и обучении различным изменениям в дизайне и реализации архитектуры HW.
Сценарий 1: Предполагается, что 16-битный процессор с 16-битными регистрами, 16-битной адресацией и sizeof (int) = 16 бит:
unsigned int a, b, c, d;
a=0xFFFF;
b=0xFFFF;
c=a+b;
Возможно ли перезаписать область памяти рядом с c
?
(В этом случае я ожидаю, что флаг переполнения будет установлен во время операции add , и c
либо останется неизменным, либо будет заполнен неопределенными данными.)
Сценарий 2: Предполагается, что 32-разрядный процессор с 32-разрядными регистрами, 32-разрядной адресацией, sizeof (int) = 32 бита и sizeof (short int) = 16 бит:
unsigned int a, b;
unsigned short int c, d;
a=0xFFFF;
b=0xFFFF;
c=a+b;
Возможно ли перезаписать область памяти рядом с c
?
(Я ожидаю, что во время операции добавления не будет подниматься флаг переполнения, но будет ли или нет подниматься флаг доступа к памяти или переполнения во время операции присваивания, будет зависеть от фактического проектирования и реализации HW. Если d
находился в верхних 16 битах того же 32-битного адреса (вероятно, это невозможно даже при 32-битной адресации), он может быть перезаписан.)
Сценарий 3: Предполагается, что 32-разрядный процессор с 32-разрядными регистрами,
16 -битная адресация, sizeof (int) = 32 бита и sizeof (short int) = 16 бит:
unsigned int a, b;
unsigned short int c, d;
a=0xFFFF;
b=0xFFFF;
c=a+b;
Возможно ли перезаписать область памяти рядом с c
?
(Я ожидаю, что какой-либо флаг переполнения или флаг нарушения памяти будет поднят во время операции преобразования типа и назначения.)
Сценарий 4: Предполагается, что 32-разрядный процессор с 32-разрядными регистрами, 32-разрядной адресацией и sizeof (int) = 32 бита:
unsigned int a, b;
struct {
unsigned int c:16;
unsigned int d:16;
} e;
a=0xFFFF;
b=0xFFFF;
e.c=a+b;
Возможно ли перезаписать область памяти рядом с c
, а именно d
? (В этом случае, поскольку ожидается, что c
и d
будут находиться в одном и том же 32-разрядном адресе, и оба являются технически 32-разрядными целыми числами, возможно, что при добавлении или назначении не будут установлены флаги переполнения, и d
могут быть затронуты.)
Я не пытался проверить это на реальном оборудовании, потому что мой вопрос больше касается теории и возможных изменений в дизайне и реализации. Любое понимание будет оценено.
- Возможна ли двоичная целочисленная операция, которая приводит к переполнению, чтобы перезаписать смежную память?
- Есть ли в настоящее время какие-либо реализации HW, которые страдают от подобных проблем с перезаписью памяти, или в прошлом были системы, которые имели эту проблему?
- Какие устройства используются типичными процессорами для защиты от перезаписи соседней памяти от операций арифметики и присваивания?