У меня есть часть памяти, которую я "охраняю", определяемый
typedef unsigned char byte;
byte * guardArea;
size_t guardSize;
byte * guardArea = getGuardArea();
size_t guardSize = getGuardSize();
Допустимая реализация для этого будет:
size_t glGuardSize = 1024; /* protect an area of 1kb */
byte * getGuardArea()
{
return malloc( glGuardSize );
}
size_t getGuardSize()
{
return glGuardSize;
}
Может ли следующий сниппет вернуть true для любого указателя (из другого malloc, из стека и т.д.)?
if ( ptr >= guardArea && ptr < (guardArea + guardSize)) {
return true;
}
В стандарте указано, что:
- Значения
-
в области возвращают значение true. (Когда ptr был членом, все действует правильно.)
-
указатели будут отличаться (a == b, только если они одинаковы).
- Доступ к всем адресам в массиве байтов можно получить путем увеличения базы.
- любой указатель может быть преобразован в char * и без него.
Поэтому я не могу понять, как результат может быть правдой для любого указателя из другого объекта (поскольку он нарушит отдельное правило для одного из указателей внутри области).
Edit:
Что такое прецедент?
Возможность определить, находится ли указатель внутри региона, действительно важна, в какой-то момент код написан
if ( isInMyAreaOfInterest( unknownPointer ) ) {
doMySpecialThing( unknownPointer );
} else {
doSomethingElse( unknownPointer );
}
Я думаю, что язык должен поддерживать разработчика, делая такие конструкции простыми и очевидными, и наша интерпретация стандарта заключается в том, что разработчику необходимо преобразовать в int. Из-за "undefined поведения" сравнения указателей различных объектов.
Я надеялся на некоторую ясность в том, почему я не могу сделать то, что мне хотелось бы (мой фрагмент), поскольку все сообщения, которые я нашел, говорят, что стандартные требования undefined, без каких-либо объяснений, или примеры почему стандарт лучше, чем я хотел бы, чтобы он работал.
На данный момент у нас есть правило, мы не понимаем, почему существует правило, или спрашиваем, помогает ли нам правило
Пример сообщений: