gpt4 book ai didi

c++ - 一个对象可以接近最大指针值多远才能避免溢出?

转载 作者:行者123 更新时间:2023-11-28 00:01:40 27 4
gpt4 key购买 nike

一个有效的指针可以多接近最大值(作为一个全局的,分配在栈上,mallocnewVirtualAlloc ,或者程序/库可能使用的任何其他分配方法),这样 ptr + n 就有溢出的风险?

我遇到过很多在处理字符串/数组时将值添加到指针的代码(在 C++ 中,有时也在通用的“随机访问迭代器”模板函数中)。

例如

auto end = arr_ptr + len; //or just whatever some_container.end() returns
for (auto i = begin; i < end; ++i) { ... }
for (auto i = begin; i + 2 <= end; i += 2) { ...i[0]...i[1]... }
if (arr_ptr + 4 <= end && memcmp(arr_ptr, "test", 4) == 0) { ... }
if (arr_ptr + count > end) resize(...);

最后一个数组元素以 0xFFFFFFFF 结尾(假设 32 位)是否有效,这样 end == 0?如果不是,它有多接近?

我认为总是使用 p != end(并且只加 1)或将长度设为 len = end - begin 然后使用它(例如 (end - begin) >= 4) 总是安全的,但想知道这是否真的是一个需要注意、审核和更改现有代码的问题。

最佳答案

该标准没有讨论指针溢出,它讨论了哪些指针值可以通过指针运算合法地形成。简而言之,合法范围是指向您的对象/数组的指针加上一个尾数指针。

然后,C 或 C++ 实现有责任不在某些特定于实现的危险(如指针溢出)阻止这些合法指针值正常工作的位置创建任何对象。

所以无论是 malloc 还是堆栈(假设您没有超出任何堆栈边界)都不会给您一个 char 数组,从一个地址开始您不能(由于溢出)添加数组的大小。

how close can it be?

As close as 允许所有必需的指针值正常工作。因此,在这个 32 位系统上,从 0xFFFFFFFE 开始的 1 字节对象将是最大可能地址。该标准不允许您将 2 添加到地址,因此就实现而言,这样做会溢出“无关紧要”。对于 2 字节对象,如果类型未对齐,最大值将为 0xFFFFFFFD,但这是一个奇数,因此如果它需要 2 位对齐,则为 0xFFFFFFFC

当然,其他实现细节可能会规定下限。例如,系统在 0 的任一侧保留一页内存并使其不可访问的情况并不少见。这有助于捕获有人访问具有小偏移量的空指针的错误。诚然,正偏移比负偏移更有可能发生这种情况,但仍然如此。如果您的 32 位系统决定这样做,则 malloc 将需要考虑它,并且永远不会返回 0xFFFFFFFE

关于c++ - 一个对象可以接近最大指针值多远才能避免溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38502217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com