Questions tagged «undefined-behavior»

编译或执行程序的不可预测结果破坏了编译器,解释器或运行时系统都不必执行的语言规则。请勿对数据类型或返回值“ undefined”的问题使用此标记。在这些情况下,应改用[undefined]标签。

1
是string.assign(string.data(),5)定义明确的还是UB?
一位同事想这样写: std::string_view strip_whitespace(std::string_view sv); std::string line = "hello "; line = strip_whitespace(line); 我说过归来string_view使我先天不安,而且,在我看来,这里的别名看起来像UB。 我可以肯定地说line = strip_whitespace(line)在这种情况下等于line = std::string_view(line.data(), 5)。我相信will call string::operator=(const T&) [with T=string_view],其定义为等同于line.assign(const T&) [with T=string_view],其定义为等同于line.assign(line.data(), 5),定义为执行此操作: Preconditions: [s, s + n) is a valid range. Effects: Replaces the string controlled by *this with a copy of the range …


2
如果未定义的C ++行为符合C定义的行为会发生什么?
我有一个*.cpp使用C ++编译的文件(不是C编译器)。包含函数依赖于强制转换(请参见最后一行),该强制转换似乎是在C中定义的(如果我错了,请更正!),但对于这种特殊类型,则不在C ++中定义。 [...] C++ code [...] struct sockaddr_in sa = {0}; int sockfd = ...; sa.sin_family = AF_INET; sa.sin_port = htons(port); bind(sockfd, (struct sockaddr *)&sa, sizeof sa); [...] C++ code [...] 由于我将其编译为C ++文件,因此这是现在定义的还是未定义的行为?还是我需要将其移动到*.c文件中以使其定义为行为?

1
GCC无法报告格式错误的constexpr lambda调用
以下是两个未定义行为的测试用例,表示为IIFE(即所谓的Lambda-Axpression): constexpr auto test3 = []{ int* p{}; { int x{}; p = &x; } return *p; // Undefined Behaviour }(); // IIFE constexpr auto test4 = []{ int x = std::numeric_limits<int>::min(); int y = -x; // Undefined Behaviour return y; }(); int main() {} 使用GCC主干编译时,test4由于它在中显示出Undefined Behavior ,因此被正确拒绝constexpr。另一方面test3被接受。 GCC有权接受test3吗?

1
非常简单的代码中的“非法硬件指令”
在调查可疑的索赔时,我编写了这个小测试程序noway.c int proveit() { unsigned int n = 0; while (1) n++; return 0; } int main() { proveit(); return 0; } 测试一下,我得到: $ clang -O noway.c $ ./a.out zsh: illegal hardware instruction ./a.out 笏。 如果我不进行优化就进行编译,则它会按预期挂起。我看了看程序集,没有所有的花哨main功能,函数看起来像这样: _main: ## @main pushq %rbp movq %rsp, %rbp ud2 哪里 ud2显然是一个指令专门为未定义行为。前面提到的可疑声明“永不返回的函数是UB”得到了增强。我仍然很难相信。真!?您不能安全地编写自旋循环吗? 所以我想我的问题是: 这是对正在发生的事情的正确阅读吗? 如果是这样,有人可以指出我的官方资源吗? …

2
转换产生无效指针的函数引用?
我正在跟踪第三方代码中的错误,并将其缩小到类似的范围。 use libc::c_void; pub unsafe fn foo() {} fn main() { let ptr = &foo as *const _ as *const c_void; println!("{:x}", ptr as usize); } 在稳定的1.38.0上运行,这会打印函数指针,但是beta(1.39.0-beta.6)和夜间返回'1'。(游乐场) _推断出什么,为什么行为发生了变化? 我认为正确的方法只是foo as *const c_void,但这不是我的代码。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.