GCC Оптимизирует предложение if, которое нельзя оптимизировать

Я создал небольшой код, показывающий ошибку, с которой я столкнулся

#include<stdlib.h>
#include<stdio.h>
int test(char * flag)
{
    char flagger = *flag;
    printf("test value %d", (int) flagger);
    if (flagger != 0x82)
    {
        exit(3);
    }
    else 
    {
        return 0;
    }
}


int main(void)
{
    char flag = 0x82, flag1 = 0x12, flag2 = 0x45;
    //char buf[256];
    test(&flag);
    test(&flag1);
    test(&flag2);
}

При компиляции кода: gcc -o tester test.c или gcc -o tester test.c -O0

The resulting disassembly code for the function test in gdb is:  
Dump of assembler code for function test:
0x0804849b <+0>:    push   ebp
0x0804849c <+1>:    mov    ebp,esp
0x0804849e <+3>:    sub    esp,0x18
0x080484a1 <+6>:    mov    eax,DWORD PTR [ebp+0x8]
0x080484a4 <+9>:    movzx  eax,BYTE PTR [eax]
0x080484a7 <+12>:   mov    BYTE PTR [ebp-0x9],al
0x080484aa <+15>:   movsx  eax,BYTE PTR [ebp-0x9]
0x080484ae <+19>:   sub    esp,0x8
0x080484b1 <+22>:   push   eax
0x080484b2 <+23>:   push   0x80485c0
0x080484b7 <+28>:   call   0x8048350 <printf@plt>
0x080484bc <+33>:   add    esp,0x10
0x080484bf <+36>:   sub    esp,0xc
0x080484c2 <+39>:   push   0x3
0x080484c4 <+41>:   call   0x8048370 <exit@plt>
End of assembler dump.

Как вы можете видеть, if оптимизируется до версии, в которой всегда вызывается exit.

Я пробовал много вещей (возвращая условные, используя летучие и т. Д.), Но у меня заканчиваются идеи, почему это происходит. Помогите, пожалуйста?

1 ответ

Решение

В вашей системе диапазон char является -128 в +127, Но 0x82 является 130 в десятичном. поскольку 130 > 127этот тест никогда не может быть успешным.

Чтобы исправить код, вы можете использовать:

if ( flagger != '\x82' )

или же

if ( (unsigned char)flagger != 0x82 )

Обратите внимание, что предыдущий код char flag = 0x82 это присвоение вне допустимого диапазона, которое определяется поведением реализации. Вы могли бы рассмотреть возможность использования unsigned char или же uint8_t для всех этих переменных.

Другие вопросы по тегам