4

我对 clang 中的 catch-undefined-behavior 标志有疑问。我在一个用 C 编写的大型项目中进行了尝试,其中有一次,用户提供的整数值 (i) 到达。然后我添加了以下代码:

int arr[3]
arr[i] = 1234;

但是当我使用 gdb 运行代码时,它只会在变量 i 的值为 4 或更大时停止。因此,当我将值 3 传递给 i 时,它仍然会访问其边界之外的数组而不会停止。

这是 -fcatch-undefined-behavior 的已知限制吗?还是只检查访问是否在堆栈框架之外,而不是在本地数组之外?

最好的问候克里斯蒂安

PS:我使用 clang+llvm 3.0 作为编译器/链接器。目标是 x86。该程序在 Windows XP 机器上的 xubuntu 12.04 虚拟机中运行。

4

1 回答 1

1

ISO C 标准的附录 J 列出了与您的问题相关的以下未定义行为:

  • 对数组对象和整数类型的指针进行加法或减法运算会产生不指向或仅超出同一数组对象的结果(6.5.6)。
  • 对数组对象和整数类型的指针进行加法或减法运算会产生刚好超出数组对象的结果,并用作计算的一元 * 运算符的操作数 (6.5.6)。

根据您的帖子,Clang-fcatch-undefined-behavior似乎只抓住了这两个中的第一个。

于 2012-10-27T12:36:51.913 回答