undefined-behavior相关内容

如何在避免未定义行为的同时将任意双精度数转换为整数?

假设我有一个接受 64 位整数的函数,我想调用它带有一个带有任意数值的 double (即它可能非常大量级,甚至无限): void DoSomething(int64_t x);双 d = [...];做某事(d); C++11 标准中 [conv.fpint] 的第 1 段是这样说的: 浮点类型的纯右值可以转换为整数类型.转换截断;也就是小数部分被丢弃.如果截断的值不能,则行为未定义以 ..

reinterpret_cast 从对象到第一个成员

我正在查看此 answer,我想知道是否使用 reinterpret_cast 将对象投射到其第一个成员并使用结果在 C++ 中可能是安全的. 假设我们有一个类 A、一个类 B 和一个 B 的实例 b: A 类{上市:诠释我;无效 foo(){}};B类{上市:一个;};乙乙; 问题 1:这样使用 ba 是否安全:reinterpret_cast(&b)->foo()? 注 ..

为什么 char* 会导致未定义的行为,而 char[] 不会?

尝试修改字符串文字会导致未定义的行为: char * p = "维基百科";p[0] = 'W';//未定义的行为 防止这种情况的一种方法是将其定义为数组而不是指针: char p[] = "维基百科";p[0] = 'W';//行 为什么 char* 会导致未定义的行为,而 char[] 不会? 解决方案 任何修改 C 字符串文字的尝试都有未定义的行为.编译器可能会安排将字符串文 ..
发布时间:2022-01-12 20:04:50 其他开发

运行时计数器退出代码 139,但 gdb 使其通过

我的问题听起来很具体,但我怀疑它仍然可能是 C++ 调试问题. 我正在使用 omnet++ 来模拟无线网络.omn​​et++ 本身就是一个 c++ 程序. 我在运行我的程序时遇到了一个奇怪的现象(在 Ubuntu 12.04 中使用 omnet++ 4.2.2 修改了 inet 框架):当触摸代码的某个部分时,程序以退出代码 139 退出(人们说这意味着内存碎片),当我尝试调试时,g ..
发布时间:2022-01-12 15:44:19 C/C++开发

如何创建一个多次使用一个值而不复制它的宏?

我想创建一个宏,将一对解包成两个局部变量.如果它只是一个变量,我不想创建该对的副本,这将完成: #define UNPACK_PAIR(V1, V2, PAIR) \汽车&V1 = PAIR.first;\汽车&V2 = PAIR.秒;UNPACK_PAIR(一,二,x); 但是,我也希望它不计算多次给出的表达式,例如这应该只调用一次 expensive_computation(): UNP ..
发布时间:2022-01-11 20:10:57 C/C++开发

当 extern 声明和定义之间的类型不匹配时,会有什么行为?

假设我有两个文件: ==文件1== extern char* foo; ==文件2== double foo; 尽管类型不匹配,这两个文件似乎与 g++ 和 clang++ 都可以很好地编译和链接.据我了解,推荐的做法是将 extern 声明放在两个文件都包含的标头中,因此 File2 将引发重新定义错误. 我的问题是: 根据 c++ 标准,这是否会导致未定义的行为?如果 ..
发布时间:2022-01-11 15:44:00 C/C++开发

可以将不同的 GCC 方言联系在一起吗?

我知道原则上这可能是未定义的行为,但为了处理大型项目,这是我关于 GCC 的问题: 假设我用 gcc -std=c++98 编译一个转换单元,另一个用 -std=c++11 编译,使用完全相同的编译器安装.有什么保证我可以链接两个目标文件并获得一个定义明确的程序吗? 据我所知,由于宏的不同,潜在的问题只能来自库头的不同视图,而那些反过来最多添加新的成员函数,但绝不是成员对象,到标准库类 ..
发布时间:2022-01-11 15:03:28 C/C++开发

MessageDigest.getInstance(“SHA") 返回什么特定的哈希算法?

MessageDigest.getInstance("SHA") 似乎工作并给了我一个 MessageDigest,但我不知道它给了我什么算法. 是 SHA-1 还是 SHA-0 还是 ..? 我对我的机器上发生的事情不感兴趣.我想知道它是否会为所有有效的 Java 实现返回 sha0 或 sha1(或者它是未定义的). 解决方案 JCE 规范 列出了实现应该支持的标准名称.指 ..
发布时间:2022-01-10 10:32:38 Java开发

将负双精度转换为无符号整数的行为是否在 C 标准中定义?ARM 与 x86 上的不同行为

我有在不同平台上运行的代码,似乎得到不同的结果.我正在寻找适当的解释. 我希望 unsigned 的转换对 float 或 double 与 int 的工作方式相同1. Windows: 双 dbl = -123.45;int d_cast = (unsigned int)dbl;//d_cast == -123 WinCE (ARM): 双 dbl = -123.45;int ..

什么是悬空引用?

以下程序给我运行时错误(Segmentation Fault (SIGSEGV)). #include 使用命名空间标准;内部&酒吧(){整数 n = 10;返回 n;}int main() {内部&我 = 酒吧();cout 我的老师告诉我这是一个未定义的行为,因为悬空引用.他说得对吗?如果是,那么如何避免它? 解决方案 是的,这确实是一个未定义的行为,因为您正在返回对自动变量的引用 ..
发布时间:2022-01-05 12:05:24 C/C++开发

通过取消引用 NULL 指针来分配引用

int&乐趣(){int * temp = NULL;返回*温度;} 在上述方法中,我试图取消对 NULL 指针的引用.当我调用这个函数时,它不会给出异常.我发现当返回类型是按引用时,它不会给出异常,如果它是按值,那么它会.即使将 NULL 指针的取消引用分配给引用(如以下行),它也不会给出. int* temp = NULL:内部&温度 1 = *温度; 这里我的问题是编译器在引用的情况下 ..
发布时间:2022-01-05 11:58:03 C/C++开发

悬空引用和未定义行为

假设一个悬空引用x.只是写是未定义的行为 &x; 甚至 x; ? 解决方案 首先,非常有趣的问题. 我会说这是未定义的行为,假设“悬空引用"意味着“被引用对象的生命周期已经结束,并且对象占用的存储已经被重用或释放."我的推理基于以下标准规则: 3.8 §3: 本国际标准中赋予对象的属性仅适用于给定的对象在它的一生中.[注意:特别是在对象的生命周期开始之前和生命周期 ..
发布时间:2022-01-05 11:52:26 C/C++开发

是否存在取消引用(但不使用)空指针以进行空引用的平台或情况会表现不佳?

我目前正在使用一个使用类似代码的库 T&being_a_bad_boy(){返回 *reinterpret_cast(0);} 在实际上没有 T 的情况下引用 T.这是未定义的行为,特别指出不受标准支持,但这并不是闻所未闻的模式. 我很好奇是否有任何示例、平台或用法表明在实践中这会导致问题.谁能提供一些? 解决方案 传统上,编译器将“未定义行为"视为不检查各种类型错误的借口,而只 ..
发布时间:2022-01-05 11:44:33 C/C++开发

在 C 中,如果我投 &取消引用一个指针,我先做哪个重要吗?

在 C 中,您可以转换简单的数据类型,例如 int、float 和指向这些类型的指针. 现在我假设如果你想从一个指向一种类型的指针转​​换成另一种类型的值(例如从 *float 到 int),强制转换和取消引用的顺序无关紧要.IE.对于变量 float* pf,你有 (int) *pf == *((int*) pf).有点像数学中的交换性...... 然而,情况似乎并非如此.我写了一个 ..
发布时间:2021-12-31 22:01:00 其他开发

抛弃函数参数的常量性是未定义行为吗?

假设我有这个 C 函数(以及头文件中的相应原型) void clearstring(const char *data) {char *dst = (char *)data;*dst = 0;} 上述代码中是否存在未定义行为,将 const 扔掉,还是只是一种非常糟糕的编程习惯? 假设没有使用 const 限定的对象 char name[] = "pmg";清除字符串(名称); 解决方 ..
发布时间:2021-12-31 21:55:07 其他开发

何时在指针类型之间进行转换而不是 C 中的未定义行为?

作为 C 的新手,我很困惑什么时候转换指针实际上是可以的. 据我所知,您几乎可以将任何指针类型转换为任何其他类型,编译器会让您这样做.例如: int a = 5;int* intPtr = &a;char* charPtr = (char*) intPtr; 然而,通常这会调用未定义的行为(尽管它恰好适用于许多平台).这就是说,似乎有一些例外: 你可以自由地在void*之间进行转换 ..
发布时间:2021-12-31 21:35:30 其他开发