2012-06-29 2 views
2

은 내가 test.cpp 전화 할게 이것에 유사한 실제 프로그램이 있습니다g ++ 부정확 한 루프?

#include <stdlib.h> 

extern void f(size_t i); 

int sample(size_t x) 
{ 
    size_t a = x; 
    size_t i; 

    for (i = a-2; i>=0; i--) { 
      f(i); 
    } 
} 

을 그리고 내 문제는 내가 무한 루프 것입니다.

나는 다음과 같은 명령을 실행하는 경우 :

g++ -S -o test.s test.cpp 

을 나는 다음과 같은 조립 순서 얻을 : 나는 어셈블리 언어에 전문가는 아니지만,하지만 난에 대한 코드를 볼 것으로 예상 것

 .file "test.cpp" 
     .text 
     .globl _Z6samplem 
     .type _Z6samplem, @function 
_Z6samplem: 
.LFB0: 
     .cfi_startproc 
     pushq %rbp 
     .cfi_def_cfa_offset 16 
     .cfi_offset 6, -16 
     movq %rsp, %rbp 
     .cfi_def_cfa_register 6 
     subq $32, %rsp 
     movq %rdi, -24(%rbp) 
     movq -24(%rbp), %rax 
     movq %rax, -8(%rbp) 
     movq -8(%rbp), %rax 
     subq $2, %rax 
     movq %rax, -16(%rbp) 
.L2: 
     movq -16(%rbp), %rax 
     movq %rax, %rdi 
     call _Z1fm 
     subq $1, -16(%rbp) 
     jmp  .L2 
     .cfi_endproc 
.LFE0: 
     .size _Z6samplem, .-_Z6samplem 
     .ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3" 
     .section  .note.GNU-stack,"",@progbits 

을 비교 i >= 0과 조건부 점프가 루프 밖으로 빠져 나옵니다. 무슨 일 이니? 우분투 리눅스

+0

"부정적"이 될 수 있습니까? "size_t"는 결코 음수가 될 수 없으므로 i> = 0이 항상 true 인 무한 루프로 실행됩니다. – niko

+0

참으로 무한 루프입니다. 왜냐하면 모든 것들을 래핑하고 0을 계속하는 것입니다. 그렇다면 질문은 왜 어셈블리에 테스트가 없으며, 아무런 최적화가 요청되지 않았는데도 최적화 된 것입니다. 컴파일러에서. – deStrangis

답변

11

size_t

GNU C++ 4.6.3 서명되지 않은, 그래서 조건 i>=0 항상 true입니다. i은 음수가 불가능합니다.

+0

환상적! 비교가 최적화되어 있습니다! 감사. – deStrangis

+0

그것은 위의 루프가 정수 타입의 랩 어라운드 때문에 무한 루프라는 것을 의미합니까? –

+2

@JonasWielicki : 예. 'f'가 throw를하거나 그렇지 않으면'sample'으로 돌아 가지 않게하는 제어를하지 않으면 루프는 스레드가 종료 될 때까지 반복합니다. –

관련 문제