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');
}
あなたの関数にreturn文が欠落し、している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;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加