2017-11-23 14 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()에 반환 문을 누락되었습니다. C++는 ISO 표준 섹션 6.6.3에 명시된 바와 같이 그 가능성이 정의되지 않은 동작을 일으키는 :

함수의 끝을 흐르는없이 값 리턴 동등하다; 이로 인해 값을 반환하는 함수에서 정의되지 않은 동작이 발생합니다.

#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; 
} 
: clang -O0 a.cpp

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

여기 당신을 위해 작동합니다 버전입니다

오류를보고해야한다