我可以假设以下不变量吗?
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
, whereend_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
或数组具有相同的属性,则此方案将受阻。假设这永远不会发生是否安全?按照标准安全吗?如果不是,在实践中是否安全?