undefined-behavior相关内容

超出 C++ 的界限和未定义的行为

我知道在 C++ 中访问缓冲区边界是未定义的行为. 这是来自 cppreference 的示例: int table[4] = {};bool exists_in_table(int v){//由于越界访问,在前 4 次迭代之一或 UB 中返回 truefor (int i = 0; i 但是,我在 C++ 标准中找不到相应的段落. 任何人都可以指出我在标准中解释这种情况的具体段落吗? ..
发布时间:2021-09-13 20:40:38 C/C++开发

while(i--) s+= a[i];在 C 和 C++ 中包含未定义的行为?

考虑简单的代码: #include "stdio.h"#define N 10Uint main() {int a[N] = {0};无符号整数 i = N;整数 s = 0;//填充一个当我 - )s += a[i];printf("总和为 %d\n", s);返回0;} 由于整数下溢,while 循环是否包含未定义的行为?编译器是否有权因此假设 while 循环条件始终为真并以无限循环结束 ..
发布时间:2021-09-13 20:40:35 C/C++开发

C++ UBSAN 使用派生对象产生误报

我想使用 UBSAN(未定义行为消毒剂),但发现它完全没有价值,因为它会报告许多误报. 例如一个简单的 std::make_shared(42); 足以触发像 这样的警告 地址 0x00000236de70 内的成员访问不指向类型为“_Sp_counted_base"的对象 将此示例简化为 MWE 表明该问题在基类和继承方面更为普遍: 示例: struct Foo{int ..
发布时间:2021-09-13 20:40:32 C/C++开发

逗号运算符和 void 表达式

我遇到了这个代码片段 1 int return_printChar1(){//代码//哎呀!没有退货声明}int return_printChar2(){//代码返回 printf("返回");}int main(){国际我;//还有一些代码i = return_printChar2();if((return_printChar1(),i)){printf ("陷阱");}} 1:这不是现实生 ..
发布时间:2021-09-13 20:40:26 C/C++开发

mem::forget(mem::uninitialized()) 是定义的行为吗?

在 mutagen 中,我注入了各种代码中的突变.我想改变的一件事是模式如果让 Ok(x) = y { .. }.然而,这带来了相当大的挑战,因为我无法知道 y 的类型——用户可以使用一元 Ok 变体.对于我们遇到的情况,我仍然可以机会性地对其进行变异实际上有一个 Result 其错误类型使用 trait 实现了 Default看起来像下面的简化: #![特征(专精)]酒吧特质错误{fn err ..
发布时间:2021-09-13 20:40:23 其他开发

如何抑制来自 UBsan 的一些无符号整数溢出错误?

我的大部分 -fsanitize=unsigned-integer-overflow 错误都是错误,但有时我会按预期明确使用它,这会导致 UBSan 产生误报. 有没有办法关闭特定表达式的 UBSan 无符号整数溢出检查? 编辑以回应 Shafik 的评论,这是一个例子: unsigned a = 0;无符号 b = a - 1;//错误:无符号整数溢出 大多数时候这是一个错误,有 ..
发布时间:2021-09-13 20:40:20 C/C++开发

是否对存在明确定义的同名类型的变量使用 sizeof?

这是明确定义的行为还是未定义/以其他方式定义了哪个 foo(数据类型或标识符)sizeof 将操作? typedef int foo;int main(int argc, char *argv[]){字符 foo;printf ("%u\r\n", sizeof(foo));返回0;} 如果定义明确,有没有一种方法可以获取数据类型 foo 的大小,而无需声明该类型的变量只在其上使用 sizeo ..
发布时间:2021-09-13 20:40:14 其他开发

是否在同一表达式未定义行为中两次调用具有局部副作用的函数?

int f() {静态 int i=0;返回++i;}int g() {返回 f() + f();} g() 返回 3 还是结果 undefined? 解决方案 章节和诗句: 6.5.2.2 函数调用 ... 10 功能指示符和实际的评价后有一个顺序点参数但在实际调用之前.调用函数中的每个评估(包括其他函数调用)之前或之后没有特别排序的被调用函数体的执行是不确定的被调用函数的 ..
发布时间:2021-09-13 20:40:10 其他开发

C++ 中的有符号溢出和未定义行为 (UB)

我想知道像下面这样的代码的使用 int 结果 = 0;整数因子 = 1;为了 (...) {结果 = ...因子*= 10;}返回结果; 如果循环迭代 n 次,则 factor 乘以 10 正好 n 次.然而,factor 只在乘以 10 总共 n-1 次后才被使用.如果我们假设 factor 除了在循环的最后一次迭代之外永远不会溢出,但在循环的最后一次迭代中可能会溢出,那么这样的代码应该可以 ..
发布时间:2021-09-13 20:40:07 C/C++开发

为什么存在“未定义行为"?

某些常见的编程语言,尤其是 C 和 C++,具有未定义行为的强烈概念:当您尝试以超出预期使用方式的方式执行某些操作时,这会导致未定义行为. 如果发生未定义的行为,编译器可以做任何想做的事情(包括什么都不做、“时间旅行"等). 我的问题是:为什么存在这种未定义行为的概念?就我所见,如果不是导致未定义的行为,而是使用超出预期用途的操作会导致大量的错误、在一个版本的编译器上运行的程序停止在下 ..
发布时间:2021-09-13 20:40:04 C/C++开发

为什么此代码的行为在 C 中未定义?

我收到了这段代码,但我不太确定为什么它的行为是未定义的.我的猜测是它与两个字符串的内存位置以及 if 条件中的位置比较有关. int main(void) {char *str1 = "xyz";char *str2 = "xyz";如果(str1 == str2){printf("一样!\n");} 别的 {printf("不一样!\n");}返回0;} 解决方案 关于是否折叠相同的字符 ..
发布时间:2021-09-13 20:40:01 其他开发

显式调用析构函数

我偶然发现了以下代码片段: #include #include 使用命名空间标准;第一课{字符串 *s;民众:First() { s = new string("Text");}~First() { 删除 s;}void Print(){ cout 文字说这个片段应该导致运行时错误.现在,我不太确定,所以我尝试编译并运行它.有效.奇怪的是,尽管所涉及的数据很简单,但程序在打印“文本"后卡顿,仅 ..

sscanf("123456789123456789123456789", "%d", &n) 是否有定义的行为?

当 sscanf() 或 scanf 家族中的其他函数被赋予一个数字序列时,其转换值超过目标整数类型的最大值, 是否应该认为转换失败? 是否定义了行为? 解决方案 从标准,7.21.6.2p10((f)scanf,适用于全家): …如果这个对象没有合适的类型,或者如果转换的结果不能在对象中表示,行为是未定义的. 看起来是对 scanf 系列非常谨慎的另一个原因.strt ..
发布时间:2021-09-13 20:39:56 其他开发

[] 优先于 * 运算符

在我的代码中的某个地方,我做了一些非常糟糕的事情.我的极值变量在运行时出现未定义的行为,但大多数时候它甚至没有运行.任何帮助都会很棒. #include void get_extrema(int 象限,int **extrema){如果(象限== 1){*(极值)[0] = 0;*(极值)[1] = 90;}否则如果(象限== 2){*(极值)[0] = -90;*(极值)[1] = 0;}}无 ..
发布时间:2021-09-13 20:39:52 其他开发

读取不确定的值会调用 UB?

SO 上的各种受人尊敬的高代表用户一直坚持认为读取具有不确定值的变量“始终是 UB".那么在 C 标准中究竟在哪里提到了这一点? 很明显,不确定的值可能是未指定的值或陷阱表示: 3.19.2 不确定值 未指定的值或陷阱表示 3.19.3 未指定值 本国际标准没有规定的相关类型的有效值在任何情况下选择哪个值的要求 注意未指定的值不能是陷阱表示. 3.19.4 陷阱 ..
发布时间:2021-09-13 20:39:46 其他开发

引用相对于其目标的生命周期

为了阻止我最近给出的答案的评论中的争论,我想要一些对以下问题的建设性回答: 引用的生命周期与它所引用的对象不同吗?引用仅仅是其目标的别名吗? 引用能否在格式良好的程序中比其目标存活时间更长,而不会导致未定义的行为? 如果重用为原始对象分配的存储空间,是否可以进行引用以引用新对象? 以下代码是否在不调用未定义行为的情况下演示了上述要点? Ben Voigt 的示例代码并简化(在 i ..
发布时间:2021-09-13 20:39:44 C/C++开发

比较已释放的指针是否会调用 UB?

这似乎是一个相当普遍的模式,例如在 hexchat(可能无法编译,另请参见 插件文档.另请注意hexchat_plugin_get_info 一直没有被使用,所以为了简单起见我省略了它): static hexchat_plugin *ph;静态 int timer_cb(void *userdata) {if (hexchat_set_context(ph, userdata)) {/* ..
发布时间:2021-09-13 20:39:41 其他开发