undefined-behavior相关内容
我们都听说过警告,如果您在C或C ++中调用未定义的行为,则任何东西都可能发生。 这是否限制为任何运行时行为,还是包括任何编译时行为?特别是,编译器在遇到调用未定义行为的构造时,允许拒绝代码(在标准中没有其他要求这样做),甚至崩溃? 解决方案 “您已经忽略了实际的定义并专注于注释,标准强加 / em>。“ - @ R.MartinhoFernandes 上述讯息由指定使用者
..
这绝对可以在 main 调用之前执行代码,如 但是,什么都不是,你可以打印任何东西在前进入主要功能“>这个问题。如果在前置主代码中,程序被告知要通过 std :: exit 或 std :: abort ?由于 main 被定义为程序的开始,在开始之前退出会有什么后果? 在每个部分打印,我得到以下结果: 格式: 部分:输出 主: main Init(在main之
..
假设我有一个函数接受一个64位的整数,我想调用 它带有任意数值的 double 即,它可能在 幅度非常大,甚至是无穷大): void DoSomething(int64_t x); double d = [...] DoSomething(d); C ++ 11标准中[conv.fpint]的段落1说明: 浮点类型的prvalue可以转
..
所以要更好地了解新的/删除(真的要证明自己与小例子为什么虚拟析构函数是需要的接口),我想了解内存泄漏,让我可能生活在恐惧他们。但我很难得到我的泄漏,可以这么说; 这是我最简单的版本: int * P1 = new int(43); cout
..
这个行为是否明确定义? class Foo { int A,B; public: Foo(int Bar):B(Bar),A(B + 123) { } } ; int main() { Foo MyFoo(0); return 0; } 解决方案 A 将首先被初始化(它是类定义中的第一个),并且它使用未初始化的 B 。
..
我一直在尝试 constexpr 。在我的测试编译器(g ++ 4.6),这不能编译带有超出访问的错误。是否需要编译器 在编译时发现这一点? include constexpr const char * str =“hi”; constexpr int fail(){ return str [1000] //方式结束! } template
..
我回答了关于
..
可能重复: 允许使用`char *`进行别名`T *`。 我使用的是 std :: array of char 用于保存未知原始类型的值,长度不超过10个字节,像这样: std :: array val; * reinterpret_cast(val.data())= 6.3; // blah blah blah ... d
..
1)它是未定义的行为返回一个临时的引用,即使该引用不使用?例如,这个程序保证输出“好”: int& func() { int i = 5; return i; } int main() { func(); cout
..
在我的代码中,我有效地如下: wchar_t * buffer = new wchar_t [size] //这里的无关代码 delete [] reinterpret_cast(buffer); 有问题的类型都是内置的,因此它们有微不足道的析构函数。在VC ++中,上面的代码工作allright - new [] 只是分配内存,然后 del
..
许多不好的事情发生了,并且由于未定义的行为继续发生(或不知道,任何事情都可能发生)。我理解这是为了留下一些摆动的空间为编译器优化,也许也使C ++更容易移植到不同的平台和架构。然而,由未定义的行为引起的问题似乎太大了,不能通过这些参数来证明。未定义行为的其他参数是什么?如果没有,为什么未定义的行为仍然存在? 编辑为我的问题添加一些动机: C ++ - crafty co-workers我已经
..
假设我有两个文件: == File1 == extern char * foo; == File2 == double foo; 这两个文件似乎编译和链接只是罚款与g ++和clang ++尽管类型不匹配。我理解它的推荐做法是将extern声明放在一个头文件中,这两个文件都包括所以File2将抛出一个重新定义错误。 我的问题是
..
我对在关于未定义C ++行为的文章。 在ARM架构上,移位运算符总是表现为它们发生在256位模式空间中,而不管操作数大小 - 即模式重复或“循环”只有每256个位置。另一种思考方式是,模式以指定的位数模式256移位。然后,当然,结果只包含模式空间的最低有效位。 表特别奇怪: 给定一个32位整数值为1: + -----------------------------------
..
我们知道会导致未定义行为的操作不是核心常数表达式( 草案C ++标准 ) 在测试中我做了 clang 和 gcc 将 constexpr 中的未定义行为视为错误,但在左移右移时它们不一致。例如,在所有这些被认为是根据 5.8 段运算符段 1 em> 3 : constexpr int x1 = 1
..
正如我从我的阅读中理解的,未定义的行为是编译时留下编译器有几个不相同的选择的结果。然而,这不意味着,如果一个人遵循严格的编码实践(如把每个任务和每个平等在一个单独的语句,适当的调试和评论),那么它不应该在寻找未定义的源的重大问题-behavior。 此外,对于出现的每个错误,如果您识别代码,您应该知道在该特定语句中可以使用什么语句,正确? 编辑:我不感兴趣的地方,你写的代码,你不是想写
..
如果我这样做: const char * const_str =“Some string” char * str = const_cast(const_str); //(1) str [0] =“P”; //(2) 哪里(哪一行)是未定义的行为? 我一直在搜索很多,但没有找到任何明确和精确的答案(或至少,没有一个我能理解)。
..
我知道,右移负号类型取决于实现,但如果我执行左移?例如: int i = -1; i
..
通过非const引用在try-block中引用在栈上构造的对象,捕获它并修改它,然后通过引用另一个catch块抛出一个对象是否有什么问题? 下面是我要引用的一个简短示例。 struct EC { EC(string msg){what = msg; } string where; string what; void app(string& t){其中+ = t; }
..
为什么以下给定的表达式调用未定义的行为? int i = 5; i =(i,i ++,i)+ 1 此处提问 这里回答C,序列点和部分顺序 我认为同样适用于C ++这里是我在我看到这个链接之前的回应): 逗号运算符引入一个序列点(并在某种程度上约束表达式必须求值的顺序 - 右),所以: i 的两个修改 i
..
我一直在寻找,发现公式: a =(a + b) - (b = a)它应该交换两个变量一些情况)。但是我用C ++和php测试它们,这些给我不同的结果。 php: $ a = 10; $ b = 20; $ a =($ a + $ b) - ($ b = $ a); $ b $ d echo $ a,“”,$ b; 打印 20 10 C ++ int a = 10
..