指向解除分配位置的指针它是未定义的行为吗?
int *p = new int;
*p = 10;
delete p;
*p = 10;
cout << *p << endl;
Run Code Online (Sandbox Code Playgroud) 假设我使用了printf没有传递足够的参数来匹配格式说明符:
#include <stdio.h>
int main(void) {
printf("missing argument: %s\n");
}
Run Code Online (Sandbox Code Playgroud)
对结果有什么保证吗?
在我的机器上,根本没有打印.
总是这样,或者是否有可能用解析的说明符打印字符串?
例如:
missing argument: %s
要么:
missing argument:
即使我收到一个警告,一个函数从局部变量返回一个地址,它也会编译。那不是编译器的UB吗?生成的程序集:
.text
.LC0:
.asciz "%i\n"
.globl foo
.type foo, @function
foo:
pushq %rbp #
movq %rsp, %rbp #,
sub $16, %rsp #,
mov %rdi, -8(%rbp) #,
leaq -8(%rbp), %rax #,
# a.c:5: }
leave
ret
.size foo, .-foo
.globl main
.type main, @function
main:
pushq %rbp #
movq %rsp, %rbp #,
# a.c:8: foo();
movl $123, %edi #,
call foo #
movq (%rax), %rsi #,
leaq .LC0(%rip), %rdi #,
movl $0, %eax #,
call printf #,
movl $0, …Run Code Online (Sandbox Code Playgroud) 以下是类测验的一些简单C代码:
#include <stdio.h>
int main() {
float a = 2.3;
printf("%d\n", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译并运行:
Apple LLVM版本6.1.0(clang-602.0.53)(基于LLVM 3.6.0svn)
目标: x86_64-apple-darwin14.5.0
这段代码的输出是undefined.我试图通过检查a调试器附近的内存(Xgdb中的命令)来预测输出.例如,当地址为ais时0x7fff5fbffb98,则附近的上下文&a如下:
0x7fff5fbffb98: 1075000115
0x7fff5fbffb9c: 0
0x7fff5fbffba0: 1606417336
0x7fff5fbffba4: 32767
0x7fff5fbffba8: -1754266167
0x7fff5fbffbac: 32767
0x7fff5fbffbb0: -1754266167
0x7fff5fbffbb4: 32767
Run Code Online (Sandbox Code Playgroud)
然后的输出printf是1606417352.我知道使用不正确的说明符时的输出是未定义的.出于好奇,我预计这个未定义行为的输出与正在运行的堆栈或寄存器的某些内存有关,但我还没想出如何关联它.
那么哪个地址或寄存器用于设置此输出printf?换句话说,给定运行堆栈的状态以及来自所有寄存器的所有值,我们是否可以预测(如果是这样)这种未定义行为的输出?
int a = 0;
cout<<(a++, ++a, a++, ++a, a++)<<"\n";
Run Code Online (Sandbox Code Playgroud)
我怀疑上面的代码不是未定义的行为,我想验证一下。
我知道下面的代码有UB:
int a = 0;
cout << a++ << " " << ++a << " " << a++ << "\n";
Run Code Online (Sandbox Code Playgroud) 我想知道条件语句(例如if语句)的正确用法,以避免未定义的行为。让我们从一个例子开始:
uint8_t x = 0;
bool y = false;
bool z = false;
if ((x == 135) and !y and !z) {
//do something
}
else if ((x == 135) and y) {
x = 5;
z = true;
}
else if ((x == 5) and z) {
x = 135;
z = false;
}
else {
//do something
}
Run Code Online (Sandbox Code Playgroud)
现在,是否通过不将所有3个变量都包含在每个条件中来获得不确定的行为?是否将所有未说明的条件都放入else语句中?如果是这样,如果我放弃else语句会怎样?我有完全相同的if语句(在更复杂的情况下),而且我似乎每次都不会进入正确的语句。
如果有此规定,请赐教。
c++ conditional if-statement undefined-behavior language-lawyer
c ×3
c++ ×3
assembly ×1
compilation ×1
conditional ×1
gcc ×1
if-statement ×1
pointers ×1
printf ×1
x86 ×1