g ++ скомпилированная сборка приводит к бесконечному циклу? - PullRequest
0 голосов
/ 24 ноября 2018

Я искал скомпилированную сборку из компилятора GNU g ++, и похоже, что это приводит к бесконечному циклу (частичный вывод g ++ -S file.c -o out):

.L3:
        movq    array2(%rip), %rax
        movq    array1(%rip), %rdx
        movq    -8(%rbp), %rcx
        salq    $3, %rcx
        addq    %rcx, %rdx
        movq    (%rdx), %rdx
        andl    $1, %edx
        salq    $3, %rdx
        addq    %rdx, %rax
        movq    (%rax), %rdx
        movq    temp(%rip), %rax
        andq    %rdx, %rax
        movq    %rax, temp(%rip)
        subq    $1, -8(%rbp)
        jmp     .L3

Все это либо команды movq, либо инструкции вычисления, кроме последней инструкции jmp, но это только возвращает нас к .L3.Это тело следующего кода:

          ull i; // unsigned long long int
          for (i = x - 1; i >= 0; i--)
               temp &= array2[array1[i] & 1];

Как происходит выход из цикла?Похоже, он просто уменьшает i (subq $ 1, -8 (% rbp)) и перезапускается без сравнения.

1 Ответ

0 голосов
/ 24 ноября 2018

Предполагая, что ull является unsigned long long, цикл никогда не заканчивается, так как:

i >= 0

всегда имеет значение.

Примечание: g++ сообщает об этой проблеме при компиляции спредупреждения включены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...