gpt4 book ai didi

c++ - Clang 5.0 和 UBsan 的指针加法和整数溢出?

转载 作者:行者123 更新时间:2023-11-30 02:21:55 32 4
gpt4 key购买 nike

我试图理解我们最近在使用 Clang 5.0 和未定义行为 sanitizer (UBsan) 时解决的问题。我们有在向前或向后方向处理缓冲区的代码。简化的大小写是 similar to the code shown below .

0-len可能看起来有点不寻常,但它是早期 Microsoft .Net 编译器所需要的。 Clang 5.0 和 UBsan produced integer overflow findings :

adv-simd.h:1138:26: runtime error: addition of unsigned offset to 0x000003f78cf0 overflowed to 0x000003f78ce0
adv-simd.h:1140:26: runtime error: addition of unsigned offset to 0x000003f78ce0 overflowed to 0x000003f78cd0
adv-simd.h:1142:26: runtime error: addition of unsigned offset to 0x000003f78cd0 overflowed to 0x000003f78cc0
...

第 1138、1140、1142 行(和 friend )是增量,可能由于0-len而向后退一步.

ptr += inc;

根据 Pointer comparisons in C. Are they signed or unsigned? (也讨论了 C++),指针既没有符号也没有符号。我们的偏移量是无符号的,我们依靠无符号整数换行来实现反向步幅。

代码在 GCC UBsan 和 Clang 4 以及更早的 UBsan 下运行良好。我们最终用 help with the LLVM devs 为 Clang 5.0 清除了它。 .而不是 size_t我们需要使用 ptrdiff_t .

我的问题是,构造中的整数溢出/未定义行为在哪里? ptr + <unsigned>是怎么做到的导致有符号整数溢出并导致未定义的行为?


这是一个反射(reflect)真实代码的 MSVC。

#include <cstddef>
#include <cstdint>
using namespace std;

uint8_t buffer[64];

int main(int argc, char* argv[])
{
uint8_t * ptr = buffer;
size_t len = sizeof(buffer);
size_t inc = 16;

// This sets up processing the buffer in reverse.
// A flag controls it in the real code.
if (argc%2 == 1)
{
ptr += len - inc;
inc = 0-inc;
}

while (len > 16)
{
// process blocks
ptr += inc;
len -= 16;
}

return 0;
}

最佳答案

指针加整数的定义是(N4659 expr.add/4):

expr.add/4

我在这里使用了一张图片以保留格式(这将在下面讨论)。

请注意,这是一个新的措辞,它取代了以前标准中不太明确的描述。

在您的代码中(当 argc 为奇数时)我们最终得到的代码等同于:

uint8_t buffer[64];
uint8_t *ptr = buffer + 48;
ptr = ptr + (SIZE_MAX - 15);

对于应用于代码的标准引用中的变量,i48 并且 j(SIZE_MAX - 15) n64

现在的问题是 0 ≤ i + j ≤ n 是否为真。如果我们将“i + j”解释为 表达式 i + j 的结果,则等于 32 小于 n。但如果它表示数学结果,那么它比 n 大得多。

标准在这里使用数学方程式的字体,不使用源代码的字体。 也不是有效的运算符。所以我认为他们打算用这个等式来描述数学值,即这是未定义的行为。

关于c++ - Clang 5.0 和 UBsan 的指针加法和整数溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47860626/

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