undefined-behavior相关内容

当另一个线程修改同一数组的另一个元素时,修改数组的一个元素是定义明确的行为吗?

给定一个 foo_t[n] 类型的数组和一组 n 个线程,其中每个 n 个线程读取和修改一个数组的不同元素,我是否需要显式同步数组的修改,还是可以假设同时修改数组的成员是明确定义的行为?foo_t 有多大/它有什么对齐方式有关系吗? 解决方案 我尝试做的是明确定义的行为. 参见 ISO/IEC 9899:2011 §5.1.2.4.27: 注意 13 编译器转换将分配引入到抽象 ..
发布时间:2021-06-23 18:33:55 其他开发

为什么 "int x = 5;printf("%d %d %d", x==5, x=10, x==5);";在 C 中打印“0 10 0"?

我已经学习 C 大约一年了,我在玩的时候遇到了上面的这个.我首先想到可能是分配优先的情况(即 x=10 先发生),但后来我尝试了 printf("%d %d %d", x==5, x=10, x 它输出0 10 1.有人可以向我解释为什么/发生了什么,因为这对我来说似乎非常令人困惑,我开始认为这可能是未定义的行为吗? 解决方案 这确实是未定义的行为.函数的参数以未指定的顺序计算,因此执 ..
发布时间:2021-06-21 19:01:42 其他开发

是否使用未初始化的变量 UB 的地址?

这个小码是UB吗? void Test(){国际酒吧;printf("%p", &bar);} IMO 不是 UB,但我想要一些其他的意见. 它只是打印bar的地址,即使bar从未被初始化. 解决方案 TL:DR 不,您的代码不会像您可能那样使用任何未初始化来调用 UB有想过. a(ny) 变量的地址(在这种情况下是自动的)有一个 defined 值,所以无论变量本身是否被 ..
发布时间:2021-06-21 19:01:24 其他开发

求值顺序:C 中的子表达式、序列点和后缀增量

围绕 C 语句 x = b[i] + i++; 及其定义性展开了讨论. 未定义所述语句的参数如下: C99 的第 6.5 节规定: […] 子表达式的计算顺序和副作用发生的顺序都是未指定的. 因此不能保证 i 在下标运算符中用作数组索引后递增. 但是,我对上述规范的解释不同. C99 的第 6.5 节另外指出: 在上一个和下一个序列点之间,一个对象应该有它 ..
发布时间:2021-06-12 20:43:17 其他开发

为什么在 OpenSSL 的随机数生成器中使用未初始化的内存是安全的?

因此,自从 Debian 维护者臭名昭著地导致 RNG 种子被 注释掉未初始化数据的用法. 这个问题在网上引起了很多热烈讨论,大部分焦点似乎都集中在批评审查过程或攻击有问题的开发者上. 但是,我无法找到有关该段背后的实际思考过程的任何信息.许多用户认为“最坏的情况下,它不会受到伤害" - 然而,这对我来说似乎完全违反直觉. 毕竟,从未初始化的内存中读取会调用未定义的行为,臭名昭著 ..
发布时间:2021-06-12 20:29:46 其他开发

取消引用 NULL 指针是否被视为未指定或未定义的行为?

stackoverflow 问题的共识说这是未定义的行为. 然而,我最近看到了 Charles Bay 2016 年的演讲,题为: 指令重新排序:C++“As-If"规则和序列的作用. 在 37:53,他展示了以下内容: C++ 术语 未定义行为:缺乏约束 (全局初始化顺序) 未指明行为:违反约束 (取消引用 NULL指针) 现在我有相互矛盾的信息. 这 ..

哪个“C"实现不为有符号整数实现模运算?

参考 C11 草案,第 3.4.3 节 和 C11 草案,H.2.2 部分,我正在寻找实现除有符号整数的模运算以外的行为的“C"实现. 具体来说,我正在寻找这是默认行为的实例,这可能是由于底层机器架构造成的. 这是一个代码示例和终端会话,说明了有符号整数的模算术行为: overflow.c: #include #include int main(int argc, char * ..
发布时间:2021-06-03 19:17:53 其他开发

关于数组外部指针算术的C标准

我读了很多有关指针算术和未定义行为的内容(链接,链接).总是得出一个相同的结论:指针算术仅在数组类型上以及在array [0]和array [array_size + 1]之间定义得很好(对于C标准,结尾处的一个元素是有效的). 我的问题是:这是否意味着当编译器看到与任何数组都不相关的指针算术(未定义的行为)时,它可能会发出所需的内容(甚至什么也没有)?还是更高级别的“未定义行为",意味着您 ..
发布时间:2021-05-31 20:48:01 其他开发

为什么它返回我给函数赋予的值以外的随机值?

在C程序中,有一个交换函数,该函数接受一个名为x的参数.我希望它通过更改主函数内部交换函数中的x值来返回它. 当我将参数值视为变量时,我会想要它,但是当我直接为参数设置整数值时,程序会产生随机输出. #includeint swap(int x){x = 20;}int main(void){整数y = 100;int a = swap(y);printf(“值:%d ..
发布时间:2021-05-09 20:57:18 其他开发

将非数组变量的地址传递给声明为Type ptr [static 1]的函数参数是否有效?

如上所述此处以这种方式定义的函数(在c99或更高版本中) void func(int ptr [static 1]){//使用ptr做某事,知道ptr!= NULL} 具有一个指向int的类型指针的参数( ptr ),编译器可以假定该函数永远不会以null为参数调用.(例如,编译器可以优化空指针检查,或者警告是否使用nullpointer调用func-是的,我知道,编译器不需要 即可执行任 ..
发布时间:2021-05-09 19:55:50 其他开发