Могу ли я предположить следующий инвариант?
void foo(char *buf, size_t len) {
// "buf" points to either an array or memory allocated with malloc().
assert((uintptr_t)(buf + len) < UINTPTR_MAX);
}
В синтаксическом анализаторе, который я пишу, я хочу пометить определенные смещения с помощью указателей: например, у меня может быть char *end_of_submessage
, где end_of_submessage
относительномой текущий буфер.Но если суб-сообщение не заканчивается внутри текущего буфера, я хочу использовать значение, которое больше, чем любое смещение в текущем буфере.Поэтому я бы сделал:
void parse(char *buf, size_t len, uintptr_t end_of_submessage) {
// Some parsing that might increment "buf"
// ...
// If end_of_submessage == UINTPTR_MAX, processing will not be
// triggered even if we have processed our entire current buffer.
if ((uintptr_t)buf >= end_of_submessage)
process_submsg_end();
}
Но эта схема была бы сорвана, если бы malloc () вернул память так, что ptr + len == UINTPTR_MAX
, или массив имел такое же свойство.Можно ли предположить, что этого никогда не произойдет?Это безопасно в соответствии со стандартом?Если нет, безопасно ли это на практике?