分配内存时Clang错误优化?

时间:2018-02-19 19:17:14

标签: c++ clang clang++

以下代码

int foobar() {
    int* i = new int;
    return *i;
}

在x86-64上使用-03到

编译Clang 5.0.0
foobar(): # @foobar()
ret

https://godbolt.org/g/uCHVo8

我理解为什么它只能返回一个未定义的值(因为新的'它返回一个未定义的值)。但为什么clang允许完全取消新的运营商;这不会改变代码的行为吗?

例如在这种情况下:

static int foobar() {
    int* i = new int;
    return *i;
}

int main(int argc, char** argv) {
    int i = 0;
    try {
        for (;;) i += foobar();
   }
    catch (...) {}
    return i;
}

Clang生成:

main: # @main
.LBB0_1: # =>This Inner Loop Header: Depth=1
  jmp .LBB0_1
另一方面,GCC做了更多工作,但至少它在运算符new中做了一些alloc(?):

main:
  push rbx
  xor ebx, ebx
.L2:
  mov edi, 4
  call operator new(unsigned long)
  add ebx, DWORD PTR [rax]
  jmp .L2
  mov rdi, rax
  call __cxa_begin_catch
  call __cxa_end_catch
  mov eax, ebx
  pop rbx
  ret

a)哪个编译器是对的? b)Clang中的错误?

0 个答案:

没有答案