Это просто сотрясения воздуха, а не ответ на вопрос.Смотри, берём такой код:
void foo(int);
int bar(int **);
void baz();
int main()
{
int *arr;
int arr_len = bar(&arr);
for(int n = 0; n < arr_len; n ++)
foo(arr[n]);
if(arr)
baz();
return 0;
}
Вызываем gcc:
gcc -O2 -S tmp.c -Wall -fverbose-asm
Получаем:
main:
.LFB0:
.cfi_startproc
pushq %rbp #
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
pushq %rbx #
.cfi_def_cfa_offset 24
.cfi_offset 3, -24
subq $24, %rsp #,
.cfi_def_cfa_offset 48
movq %rsp, %rdi #,
movq %fs:40, %rax #, tmp106
movq %rax, 8(%rsp) # tmp106, D.1788
xorl Йx, Йx # tmp106
call bar #
testl Йx, Йx # arr_len
jle .L6 #,
subl $1, Йx #, tmp101
xorl Кx, Кx # ivtmp.7
leaq 4(,%rax,4), %rbp #, _26
.p2align 4,,10
.p2align 3
.L5:
movq (%rsp), %rax # arr, arr
movl (%rax,%rbx), Мi # *_10, *_10
addq $4, %rbx #, ivtmp.7
call foo #
cmpq %rbp, %rbx # _26, ivtmp.7
jne .L5 #,
.L6:
cmpq $0, (%rsp) #, arr
je .L4 #,
xorl Йx, Йx #
call baz #
.L4:
xorl Йx, Йx #
movq 8(%rsp), %rdx # D.1788, tmp107
xorq %fs:40, %rdx #, tmp107
jne .L11 #,
addq $24, %rsp #,
.cfi_remember_state
.cfi_def_cfa_offset 24
popq %rbx #
.cfi_def_cfa_offset 16
popq %rbp #
.cfi_def_cfa_offset 8
ret
.L11:
.cfi_restore_state
call __stack_chk_fail #
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Gentoo 6.3.0 p1.0) 6.3.0"
.section .note.GNU-stack,"",@progbits
Метка .L6 это тот самый if, который по твоим словам должен быть выкинут из-за UB. И мы чётко видим, что он не выкидывается.
edit: форум смешно покорёжил att синтаксис. Но суть видна и так.