- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图理解我们最近在使用 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):
我在这里使用了一张图片以保留格式(这将在下面讨论)。
请注意,这是一个新的措辞,它取代了以前标准中不太明确的描述。
在您的代码中(当 argc
为奇数时)我们最终得到的代码等同于:
uint8_t buffer[64];
uint8_t *ptr = buffer + 48;
ptr = ptr + (SIZE_MAX - 15);
对于应用于代码的标准引用中的变量,i
是 48
并且 j
是 (SIZE_MAX - 15)
和 n
是 64
。
现在的问题是 0 ≤ i + j ≤ n 是否为真。如果我们将“i + j”解释为 表达式 i + j
的结果,则等于 32
小于 n
。但如果它表示数学结果,那么它比 n
大得多。
标准在这里使用数学方程式的字体,不使用源代码的字体。 ≤
也不是有效的运算符。所以我认为他们打算用这个等式来描述数学值,即这是未定义的行为。
关于c++ - Clang 5.0 和 UBsan 的指针加法和整数溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47860626/
我想使用 UBSAN(未定义行为 sanitizer ),但发现它完全没有值(value),因为它会报告许多误报。 例如。一个简单的std::make_shared(42);足以触发警告,如 memb
当启用未定义的 sanitizer 时,我在 GNU 科学库 (GSL) 中发现了一个运行时错误: deque.c:58:11: runtime error: member access within
使用 clang 的 ubsan 运行来自 boost 版本 1.64 的 gzip.hpp 代码会给出以下消息: path/to/boost/1_64_0/include/boost/iostrea
我的大部分 -fsanitize=unsigned-integer-overflow 错误都是错误,但有时我会按预期明确使用它,这会导致 UBSan 产生误报。 有没有办法为特定表达式关闭 UBSan
这个问题不是关于未对齐数据访问的定义,而是为什么 memcpy 沉默了 UBsan 的发现,而类型转换却没有,尽管生成了相同的汇编代码。 我有一些示例代码来解析发送字节数组的协议(protocol),
我想用 -fsanitize=address,undefined 运行我的单元测试套件并将所有 sanitizer 错误写入 report.txt文件。默认情况下,所有 sanitizer 错误都会写
我在这里有一个小的单元测试,它具有未定义的行为。 源代码: #include TEST(test, test) { int k = 0x7fffffff; k += 1; // ca
最新版本的 GCC 和 Clang 具有未定义行为 sanitizer (UBSan),它是一个编译标志 (-fsanitize=undefined),可添加运行时检测代码。出现错误时,会显示如下警告
我正在尝试通过一个函数指针表调用一些 C++ 函数,该函数指针表作为 C 符号从共享对象中导出。该代码实际上可以正常工作,但 Clang 的未定义行为 sanitizer (= UBSan)认为我进行
简单代码片段: #define FOO 7 int bar = -875; bar <<= FOO; UBSAN 将此事报告为 UB。 我的理解是-875 << 7只是 -(875<<7)并且没有溢出
我试图理解我们最近在使用 Clang 5.0 和未定义行为 sanitizer (UBsan) 时解决的问题。我们有在向前或向后方向处理缓冲区的代码。简化的大小写是 similar to the co
拿下面的测试程序(用clang 3.4编译,在gdb 7.6.1下运行): #include #include int main(void) { int a = INT_MAX + 1;
以下代码用clang UBSAN编译会崩溃 #include #include #include #include template inline std::string floatToStr
我们使用以下代码来确定是否在编译时为 clang 和 gcc 指定了 -fsanitize=address。我们如何确定是否指定了 -fsanitize=undefined? bool isS
我正在尝试为我的 R 包复制 CRAN sanitizer 故障,该包依赖于 rocker/r-devel-ubsan-clang docker 镜像上的 Rcpp。 当我尝试安装 Rcpp 时,我收
我正在为这个问题挠头。如何重现 CRAN's gcc ubsan tests of my package的结果在家里,在 ubuntu 上? (准备步骤说明来自here) 1) 我安装更新所有需要的包
我已经使用 -fsanitize=undefined 选项编译了我的应用程序。我现在如何测试我的应用程序是否存在未定义的行为? 另外,我该如何进行牙山检查?我用 -fsanitize=address
我是一名优秀的程序员,十分优秀!