LLVM Versi 5.0.0

Saya menulis kode ini dan membangun dengan dentang/llvm. Tapi, saya tidak mengerti mengapa kode ini diubah menjadi infinite loop.

Kode ini adalah kode c++ saya untuk build.

#include <stdio.h>

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

Saya menggunakan baris perintah berikut.

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

Saya dapat menemukan kesalahan di LLVM-IR juga.

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
}

Tetapi kode ini bekerja dengan sangat baik.

int main()
{
  for (int j= 0; j < 23; j++)
    putchar('a');
}
0
RollRat 23 November 2017, 05:52

1 menjawab

Jawaban Terbaik

Anda kehilangan pernyataan pengembalian pada fungsi Anda, int foo() dan int main(). Itu kemungkinan menyebabkan perilaku tidak terdefinisi seperti yang ditentukan dalam bagian standar ISO C++ 6.6.3:

Mengalir dari akhir fungsi setara dengan pengembalian tanpa nilai; ini menghasilkan perilaku yang tidak terdefinisi dalam fungsi pengembalian nilai.

Anda akan melihat kesalahan setelah clang -O0 a.cpp

a.cpp:7:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
1 warning generated.

Ini adalah versi yang cocok untuk Anda:

#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;
}
1
Will Bradley 30 November 2017, 20:14