2017-11-23 16 views
0

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'); 
} 

答えて

0

はあなたの機能、int foo()int main()にreturn文が欠落しています。 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; 
} 
関連する問題