undefined-behavior相关内容
假设我有一个接受 64 位整数的函数,我想调用它带有一个带有任意数值的 double (即它可能非常大量级,甚至无限): void DoSomething(int64_t x);双 d = [...];做某事(d); C++11 标准中 [conv.fpint] 的第 1 段是这样说的: 浮点类型的纯右值可以转换为整数类型.转换截断;也就是小数部分被丢弃.如果截断的值不能,则行为未定义以
..
我正在查看此 answer,我想知道是否使用 reinterpret_cast 将对象投射到其第一个成员并使用结果在 C++ 中可能是安全的. 假设我们有一个类 A、一个类 B 和一个 B 的实例 b: A 类{上市:诠释我;无效 foo(){}};B类{上市:一个;};乙乙; 问题 1:这样使用 ba 是否安全:reinterpret_cast(&b)->foo()? 注
..
尝试修改字符串文字会导致未定义的行为: char * p = "维基百科";p[0] = 'W';//未定义的行为 防止这种情况的一种方法是将其定义为数组而不是指针: char p[] = "维基百科";p[0] = 'W';//行 为什么 char* 会导致未定义的行为,而 char[] 不会? 解决方案 任何修改 C 字符串文字的尝试都有未定义的行为.编译器可能会安排将字符串文
..
我的问题听起来很具体,但我怀疑它仍然可能是 C++ 调试问题. 我正在使用 omnet++ 来模拟无线网络.omnet++ 本身就是一个 c++ 程序. 我在运行我的程序时遇到了一个奇怪的现象(在 Ubuntu 12.04 中使用 omnet++ 4.2.2 修改了 inet 框架):当触摸代码的某个部分时,程序以退出代码 139 退出(人们说这意味着内存碎片),当我尝试调试时,g
..
我想创建一个宏,将一对解包成两个局部变量.如果它只是一个变量,我不想创建该对的副本,这将完成: #define UNPACK_PAIR(V1, V2, PAIR) \汽车&V1 = PAIR.first;\汽车&V2 = PAIR.秒;UNPACK_PAIR(一,二,x); 但是,我也希望它不计算多次给出的表达式,例如这应该只调用一次 expensive_computation(): UNP
..
假设我有两个文件: ==文件1== extern char* foo; ==文件2== double foo; 尽管类型不匹配,这两个文件似乎与 g++ 和 clang++ 都可以很好地编译和链接.据我了解,推荐的做法是将 extern 声明放在两个文件都包含的标头中,因此 File2 将引发重新定义错误. 我的问题是: 根据 c++ 标准,这是否会导致未定义的行为?如果
..
我知道原则上这可能是未定义的行为,但为了处理大型项目,这是我关于 GCC 的问题: 假设我用 gcc -std=c++98 编译一个转换单元,另一个用 -std=c++11 编译,使用完全相同的编译器安装.有什么保证我可以链接两个目标文件并获得一个定义明确的程序吗? 据我所知,由于宏的不同,潜在的问题只能来自库头的不同视图,而那些反过来最多添加新的成员函数,但绝不是成员对象,到标准库类
..
灵感来自 这个问题,询问如何将向量附加到自身,我的第一个想法是以下(是的,我意识到 insert 现在是一个更好的选择): #include #include #include #include int main() {std::vector向量 {1, 2, 3};std::copy (std::begin (vec), std::end
..
MessageDigest.getInstance("SHA") 似乎工作并给了我一个 MessageDigest,但我不知道它给了我什么算法. 是 SHA-1 还是 SHA-0 还是 ..? 我对我的机器上发生的事情不感兴趣.我想知道它是否会为所有有效的 Java 实现返回 sha0 或 sha1(或者它是未定义的). 解决方案 JCE 规范 列出了实现应该支持的标准名称.指
..
我说了两件事: std::numeric_limits::max()+(一个小数) 给出: std::numeric_limits::max(). std::numeric_limits::max()+(a large number like: std::numeric_limits::max()/3) 提供信息. 为什么会
..
考虑 #include 主函数(){双a = 1.0/0;双 b = -1.0/0;双 c = 0.0/0;std::cout
..
我有在不同平台上运行的代码,似乎得到不同的结果.我正在寻找适当的解释. 我希望 unsigned 的转换对 float 或 double 与 int 的工作方式相同1. Windows: 双 dbl = -123.45;int d_cast = (unsigned int)dbl;//d_cast == -123 WinCE (ARM): 双 dbl = -123.45;int
..
将 reinterpret_cast 一个 float* 转换为一个 __m256* 并通过一个不同的访问 float 对象是否合法?指针类型? constexpr size_t _m256_float_step_sz = sizeof(__m256)/sizeof(float);alignas(__m256) float stack_store[100 * _m256_float_step_s
..
以下程序给我运行时错误(Segmentation Fault (SIGSEGV)). #include 使用命名空间标准;内部&酒吧(){整数 n = 10;返回 n;}int main() {内部&我 = 酒吧();cout 我的老师告诉我这是一个未定义的行为,因为悬空引用.他说得对吗?如果是,那么如何避免它? 解决方案 是的,这确实是一个未定义的行为,因为您正在返回对自动变量的引用
..
int&乐趣(){int * temp = NULL;返回*温度;} 在上述方法中,我试图取消对 NULL 指针的引用.当我调用这个函数时,它不会给出异常.我发现当返回类型是按引用时,它不会给出异常,如果它是按值,那么它会.即使将 NULL 指针的取消引用分配给引用(如以下行),它也不会给出. int* temp = NULL:内部&温度 1 = *温度; 这里我的问题是编译器在引用的情况下
..
假设一个悬空引用x.只是写是未定义的行为 &x; 甚至 x; ? 解决方案 首先,非常有趣的问题. 我会说这是未定义的行为,假设“悬空引用"意味着“被引用对象的生命周期已经结束,并且对象占用的存储已经被重用或释放."我的推理基于以下标准规则: 3.8 §3: 本国际标准中赋予对象的属性仅适用于给定的对象在它的一生中.[注意:特别是在对象的生命周期开始之前和生命周期
..
我目前正在使用一个使用类似代码的库 T&being_a_bad_boy(){返回 *reinterpret_cast(0);} 在实际上没有 T 的情况下引用 T.这是未定义的行为,特别指出不受标准支持,但这并不是闻所未闻的模式. 我很好奇是否有任何示例、平台或用法表明在实践中这会导致问题.谁能提供一些? 解决方案 传统上,编译器将“未定义行为"视为不检查各种类型错误的借口,而只
..
在 C 中,您可以转换简单的数据类型,例如 int、float 和指向这些类型的指针. 现在我假设如果你想从一个指向一种类型的指针转换成另一种类型的值(例如从 *float 到 int),强制转换和取消引用的顺序无关紧要.IE.对于变量 float* pf,你有 (int) *pf == *((int*) pf).有点像数学中的交换性...... 然而,情况似乎并非如此.我写了一个
..
假设我有这个 C 函数(以及头文件中的相应原型) void clearstring(const char *data) {char *dst = (char *)data;*dst = 0;} 上述代码中是否存在未定义行为,将 const 扔掉,还是只是一种非常糟糕的编程习惯? 假设没有使用 const 限定的对象 char name[] = "pmg";清除字符串(名称); 解决方
..
作为 C 的新手,我很困惑什么时候转换指针实际上是可以的. 据我所知,您几乎可以将任何指针类型转换为任何其他类型,编译器会让您这样做.例如: int a = 5;int* intPtr = &a;char* charPtr = (char*) intPtr; 然而,通常这会调用未定义的行为(尽管它恰好适用于许多平台).这就是说,似乎有一些例外: 你可以自由地在void*之间进行转换
..