标签: undefined-behavior

指向解除分配位置的指针它是未定义的行为吗?

指向解除分配位置的指针它是未定义的行为吗?

http://ideone.com/Qp3uY

int *p = new int;

*p = 10;

delete p;

*p = 10;

cout << *p << endl;
Run Code Online (Sandbox Code Playgroud)

c++ pointers undefined-behavior

-6
推荐指数
1
解决办法
145
查看次数

当没有足够的参数传递时,printf会做什么?

假设我使用了printf没有传递足够的参数来匹配格式说明符:

#include <stdio.h>

int main(void) {
    printf("missing argument: %s\n");
}
Run Code Online (Sandbox Code Playgroud)

对结果有什么保证吗?
在我的机器上,根本没有打印.
总是这样,或者是否有可能用解析的说明符打印字符串?

例如: missing argument: %s

要么: missing argument:

c printf undefined-behavior format-specifiers

-6
推荐指数
1
解决办法
518
查看次数

函数返回局部变量的地址,但它仍然用c编译,为什么?

即使我收到一个警告,一个函数从局部变量返回一个地址,它也会编译。那不是编译器的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 x86 assembly compiler-errors undefined-behavior

-6
推荐指数
1
解决办法
116
查看次数

给定堆栈和寄存器的状态,我们可以预测printf的未定义行为的结果

以下是类测验的一些简单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)

然后的输出printf1606417352.我知道使用不正确的说明符时的输出是未定义的.出于好奇,我预计这个未定义行为的输出与正在运行的堆栈或寄存器的某些内存有关,但我还没想出如何关联它.

那么哪个地址或寄存器用于设置此输出printf?换句话说,给定运行堆栈的状态以及来自所有寄存器的所有值,我们是否可以预测(如果是这样)这种未定义行为的输出?

c gcc compilation undefined-behavior

-7
推荐指数
2
解决办法
384
查看次数

这段代码是否有未定义的行为,是或否,为什么?

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)

c++ undefined-behavior

-7
推荐指数
1
解决办法
150
查看次数

if语句的这种用法是否会导致未定义的行为?

我想知道条件语句(例如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

-8
推荐指数
1
解决办法
121
查看次数