LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

если вставить вот это в compiler explorer

extern void func1( void* fp); ///типа внешняя функция, чтобы не заоптимизировалось в нуль.

void test__test() {
   auto lp = malloc(1000);
   auto lpp = malloc(1000);
   func1(lp);
   if (lp == lpp) func1(lpp);
}

то clang при -02 выкидывает второй вызов func1, считая что указатели не могут быть одинаковыми. но поскольку по стандарту malloc может вернуть и NULL, то такое утверждение слишком сильно.

test__test():                        # @test__test()
        push    rax
        mov     edi, 1000
        call    malloc@PLT
        mov     rdi, rax
        pop     rax
        jmp     func1(void*)@PLT                  

Исходная версия alysnix, :

если вставить вот это в compiler explorer

extern void func1( void* fp); ///типа внешняя функция, чтобы на заоптимизировалось в нуль.

void test__test() {
   auto lp = malloc(1000);
   auto lpp = malloc(1000);
   func1(lp);
   if (lp == lpp) func1(lpp);
}

то clang при -02 выкидывает второй вызов func1, считая что указатели не могут быть одинаковыми. но поскольку по стандарту malloc может вернуть и NULL, то такое утверждение слишком сильно.

test__test():                        # @test__test()
        push    rax
        mov     edi, 1000
        call    malloc@PLT
        mov     rdi, rax
        pop     rax
        jmp     func1(void*)@PLT