Есть ли способ проверить наличие недопустимой области памяти? - PullRequest
2 голосов
/ 16 июля 2010

На таком языке, как C, например, если подпрограмма получает указатель, существует ли какой-либо системный вызов или другой тест, который можно применить к указателю, чтобы проверить, что это допустимое расположение в памяти, кроме перехвата SIGSEGV или эквивалентного

Ответы [ 3 ]

1 голос
/ 16 июля 2010

Нет, вы не можете точно проверить, является ли адрес недействительным. Даже если вы использовали какую-то функцию операционной системы, чтобы проверить, сопоставлен ли адрес с адресным пространством, вы все равно не можете быть уверены, что адрес содержит какие-либо служебные данные, которые вам не следует читать или изменять.

Один хороший пример. Если ваша программа использует Microsoft RPC для приема вызовов от другой программы, вам необходимо реализовать набор функций обратного вызова для обработки запросов. Эти функции обратного вызова будут выполняться в отдельных потоках, запущенных RPC. Вы не знаете, когда они запускаются и каков их размер стека, поэтому вы не можете определить, происходит ли переполнение буфера, если вы записываете адрес, который должен быть переменной стека, но случайно находится в стеке другого нить.

0 голосов
/ 16 июля 2010

Если вы имеете в виду исключительно в своем собственном приложении, вы можете установить соглашение, согласно которому любая память, выделенная вашим кодом, инициализируется так, как вы можете ее распознать. Например. в одном проекте я видел, что они написали ловец глаз в первых нескольких байтах. В некоторых продуктах, которые я знаю, они пишут уникальный идентификатор в начале и конце, и каждый раз, когда к нему обращаются, они проверяют, совпадают ли 2 идентификатора, чтобы показать, что они не были повреждены. Например, CICS на z / Series делает последнее.

0 голосов
/ 16 июля 2010

Ну, если бы вы знали, где хранится указанная память (например, в стеке), вы можете проверить, находится ли она в определенном «диапазоне», который является приблизительным диапазоном адресов стека. Это также может сработать для чего-то в куче, если у вас есть представление о том, насколько большой должна быть ваша куча. Это определенно не отказоустойчивый подход, но я не знаю ни одного надежного метода проверки «правильности» указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...