Как работает проверка типа адреса указателя? - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь понять, существует ли реализация для проверки типа переменной по определенному адресу в C при работе с указателями.

Предположим, у нас есть следующий код:

Car car1; // variable of type Car in memory at address 0x100
Fruit fruit1; // variable of type Fruit at address 0x104
Car *pCar1; // pointer of type Car at address 0x108

pCar1 = &car1; // The type of the pointer matches the type of the variable, nothing special

Теперь я пытаюсь выполнить ручную обработку адресов и не получаю ошибок.Тем не менее, программа падает во время выполнения из-за несовпадения типов.

pCar1 = (Car *) 0x104; // Note I am deliberately offering a Fruit address and it works without build errors

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

1 Ответ

6 голосов
/ 22 сентября 2019
pCar1 = (Car *) 0x104;

То, что вы здесь делаете, не допускается.Вы не можете привести абсолютный адрес (который в вашем случае относится к другому типу) и ожидать, что он будет работать.Чтобы сделать это, вы должны быть уверены, что адрес содержит правильный тип переменной во время выполнения.

В этом случае приведение предотвращает только предупреждение компиляции, потому что оно говорит компилятору: «Смотри, я знаю, что я»Я делаю, поверь мне, по этому адресу есть Car.Конечно, когда ваша программа запускается и ожидает найти Car в адресах 0x104, когда ее нет, это приводит к неопределенному поведению.

Существует ли отказоустойчивый механизм или метод длясделать это глупое доказательство?

Абсолютно нет.С очень, очень далек от того, чтобы быть «глупым доказательством».Однако компилятор предупредил бы вас, если бы вы написали код «лучше»:

pCar1 = &fruit1; // Results in a compiler warning.

Как я могу предотвратить это?

Простоне делай этогоНе назначайте случайные адреса или адреса разных типов переменным.Единственное, что вы можете присвоить pCar1, - это адрес другой переменной Car (например, pCar1 = &car1) или адрес ячейки памяти, где может храниться переменная Car (например, результатподходящий malloc()).


Итак, в конце концов:

Как работает проверка типа адреса указателя?

Нетt такая вещь, как «проверка типа адреса» в C. Только компилятор может предупредить вас о том, что что-то имеет неправильный тип для определенной переменной, , если вы даете ей возможность .Явное приведение в действие исключает этот шанс.

...