为什么这段代码会陷入无限循环?

时间:2017-11-23 02:52:48

标签: llvm-ir

LLVM版本5.0.0

我将此代码转换为使用clang / llvm构建。 但是,我无法理解为什么这段代码被转换为无限循环。

此代码是我的构建的c ++代码。

#include <stdio.h>

int foo()
{
  for (int j= 0; j < 23; j++)
    putchar('a');
}
int main()
{
  foo();
}

我使用了以下命令行。

clang -O0 a.cpp // a.out not working
clang -O1 a.cpp
-O2 -O3 ... also

我也可以在LLVM-IR中找到错误。

clang -S -O1 -emit-llvm a.cpp
clang -S -O1 -mllvm -disable-llvm-optzns -emit-llvm a.cpp 
   + opt -S -O1 a.ll
define i32 @_Z3foov() local_unnamed_addr #0 {
entry:
  br label %for.cond

for.cond:                                         ; preds = %for.cond, %entry
  %call = tail call i32 @putchar(i32 97)
  br label %for.cond
}

但这段代码效果很好。

int main()
{
  for (int j= 0; j < 23; j++)
    putchar('a');
}

1 个答案:

答案 0 :(得分:1)

您缺少函数int foo()int main()的返回语句。这可能会导致ISO C ++标准6.6.3节中指定的未定义行为:

  

离开函数末尾相当于没有返回   值;这会导致值返回时出现未定义的行为   功能

您应该在clang -O0 a.cpp

之后看到错误
a.cpp:7:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
1 warning generated.

这是一个适合你的版本:

#include <stdio.h>
#include <stdlib.h>

int foo()
{
  for (int j= 0; j < 23; j++)
    putchar('a');
  return 0;
}

int main()
{
  foo();
  return EXIT_SUCCESS;
}