undefined-behavior相关内容
给定一个 foo_t[n] 类型的数组和一组 n 个线程,其中每个 n 个线程读取和修改一个数组的不同元素,我是否需要显式同步数组的修改,还是可以假设同时修改数组的成员是明确定义的行为?foo_t 有多大/它有什么对齐方式有关系吗? 解决方案 我尝试做的是明确定义的行为. 参见 ISO/IEC 9899:2011 §5.1.2.4.27: 注意 13 编译器转换将分配引入到抽象
..
我已经学习 C 大约一年了,我在玩的时候遇到了上面的这个.我首先想到可能是分配优先的情况(即 x=10 先发生),但后来我尝试了 printf("%d %d %d", x==5, x=10, x 它输出0 10 1.有人可以向我解释为什么/发生了什么,因为这对我来说似乎非常令人困惑,我开始认为这可能是未定义的行为吗? 解决方案 这确实是未定义的行为.函数的参数以未指定的顺序计算,因此执
..
这个小码是UB吗? void Test(){国际酒吧;printf("%p", &bar);} IMO 不是 UB,但我想要一些其他的意见. 它只是打印bar的地址,即使bar从未被初始化. 解决方案 TL:DR 不,您的代码不会像您可能那样使用任何未初始化来调用 UB有想过. a(ny) 变量的地址(在这种情况下是自动的)有一个 defined 值,所以无论变量本身是否被
..
我尝试了下面的 c 程序 &我希望得到编译时错误,但为什么编译器没有给出任何错误? #include int main(void){printf("%d\n");返回0;} 为什么输出依赖于编译器?这是各种编译器的输出 Orwell Dev C++ IDE 上的输出(使用 gcc 4.8.1):0 Visual Studio 2010 提供的 Visual C++ 输出:0
..
(与我之前的问题有关) 在 QT 中,QMap 文档 说: QMap 的键类型必须提供 operator 指定总顺序. 然而,在qmap.h中,他们似乎使用了类似于std::less的东西来比较指针: /*QMap 使用 qMapLessThanKey() 来比较键.默认的实现使用 operator内联 bool qMapLessThanKey(const Key &key1,
..
围绕 C 语句 x = b[i] + i++; 及其定义性展开了讨论. 未定义所述语句的参数如下: C99 的第 6.5 节规定: […] 子表达式的计算顺序和副作用发生的顺序都是未指定的. 因此不能保证 i 在下标运算符中用作数组索引后递增. 但是,我对上述规范的解释不同. C99 的第 6.5 节另外指出: 在上一个和下一个序列点之间,一个对象应该有它
..
因此,自从 Debian 维护者臭名昭著地导致 RNG 种子被 注释掉未初始化数据的用法. 这个问题在网上引起了很多热烈讨论,大部分焦点似乎都集中在批评审查过程或攻击有问题的开发者上. 但是,我无法找到有关该段背后的实际思考过程的任何信息.许多用户认为“最坏的情况下,它不会受到伤害" - 然而,这对我来说似乎完全违反直觉. 毕竟,从未初始化的内存中读取会调用未定义的行为,臭名昭著
..
我是第一次尝试 nuxt.js.但我无法让 JQuery 工作. 我已经安装了 npm 包以及 bootstrap.js 和 popper.js. 还将其添加到 nuxt.config.js: vendor: ['jquery', 'bootstrap'],插件: [新的 webpack.ProvidePlugin({$:'jquery'})], 但是当我尝试在视图中使用它时它不起
..
stackoverflow 问题的共识说这是未定义的行为. 然而,我最近看到了 Charles Bay 2016 年的演讲,题为: 指令重新排序:C++“As-If"规则和序列的作用. 在 37:53,他展示了以下内容: C++ 术语 未定义行为:缺乏约束 (全局初始化顺序) 未指明行为:违反约束 (取消引用 NULL指针) 现在我有相互矛盾的信息. 这
..
参考 C11 草案,第 3.4.3 节 和 C11 草案,H.2.2 部分,我正在寻找实现除有符号整数的模运算以外的行为的“C"实现. 具体来说,我正在寻找这是默认行为的实例,这可能是由于底层机器架构造成的. 这是一个代码示例和终端会话,说明了有符号整数的模算术行为: overflow.c: #include #include int main(int argc, char *
..
我读了很多有关指针算术和未定义行为的内容(链接,链接).总是得出一个相同的结论:指针算术仅在数组类型上以及在array [0]和array [array_size + 1]之间定义得很好(对于C标准,结尾处的一个元素是有效的). 我的问题是:这是否意味着当编译器看到与任何数组都不相关的指针算术(未定义的行为)时,它可能会发出所需的内容(甚至什么也没有)?还是更高级别的“未定义行为",意味着您
..
编辑:如果我们有这个 char value_arr [8];//value_arr设置为某个值snprintf(value_arr,8,“%d",* value_arr); 此行为是否已定义? 让我说说我出于某些不合理的原因 char value_arr [8];//value_arr设置为某个值int * value_i = reinterpret_cast(v
..
我知道将const指针强制转换为非const类型可能是未定义的行为,但是如果该指针最初不是const怎么办? int i = 0;int * pi =& i;const int * const_pi = const_cast(pi);int * non_const_pi = const_cast(const_pi);* non_const_pi =
..
考虑程序 #includeint main(void){for(int curr = 0; curr
..
很明显,以下代码由于算术溢出而调用了未定义的行为: #includeint test(void){INT我= INT_MAX;i ++;/*未定义行为*/返回我} 但是小于 int 的签名类型(例如 short 或 signed char )如何呢?(更小些,我分别假设 SCHAR_MAX
..
对对象的引用构成访问吗? GCC和Clang当前正在做的事情: void test(int const volatile * ptr)noexcept {* ptr;//movl(%rdi),eax//读取* ptr[[maybe_unused]] int const volatile&ref = * ptr;//不读* ptr} 我的问题是关于陈述的 [[maybe_unuse
..
C ++ 20 草稿 [concept.default.init]不能精确定义 default_initializable template概念default_initializable = Constructible_from&&需要{T {};}&&是默认可初始化的
..
我是否正确理解该程序导致UB的标准: #includeint main(无效){char a ='A';printf(“%c \ n",a);返回0;} 在 sizeof(int)== 1&&CHAR_MIN == 0 ? 因为如果 a 是未签名的并且具有与 int 相同的大小(1),它将被提升为 unsigned int [1](2),而不是 int ,因为 i
..
在C程序中,有一个交换函数,该函数接受一个名为x的参数.我希望它通过更改主函数内部交换函数中的x值来返回它. 当我将参数值视为变量时,我会想要它,但是当我直接为参数设置整数值时,程序会产生随机输出. #includeint swap(int x){x = 20;}int main(void){整数y = 100;int a = swap(y);printf(“值:%d
..
如上所述此处以这种方式定义的函数(在c99或更高版本中) void func(int ptr [static 1]){//使用ptr做某事,知道ptr!= NULL} 具有一个指向int的类型指针的参数( ptr ),编译器可以假定该函数永远不会以null为参数调用.(例如,编译器可以优化空指针检查,或者警告是否使用nullpointer调用func-是的,我知道,编译器不需要 即可执行任
..