fix: atoibase overflow check

This commit is contained in:
lohhiiccc 2026-06-18 16:13:35 +02:00
parent defcb4338b
commit fb49a1b217

View file

@ -41,9 +41,9 @@ check_base:
je .done
; if (*p == '-' || *p == '+') return -1
cmp dl, 45 ; '-'
cmp dl, 45
je .error
cmp dl, 43 ; '+'
cmp dl, 43
je .error
; r10(idx) = *p / 32
@ -83,12 +83,11 @@ check_base:
mov rax, -1
jmp .return
; skip whitespace and sign
; rdi: str
; skip whitespace
; return:
; rax str + x
; rax str + x + is_signed
; dl is_signed
; rax = 0 if 2 sign
find_start:
push r12
mov r12, rdi
@ -118,27 +117,6 @@ find_start:
inc rax
ret
; rdi base
; rsi char
is_in_base:
.loop:
mov dl, byte [rdi]
test dl, dl
je .is_not_in
cmp dl, sil
je .is_in
inc rdi
jmp .loop
.is_in:
mov rax, 1
ret
.is_not_in:
xor rax, rax
ret
; rdi: base
; rsi: char
@ -147,12 +125,12 @@ is_in_base:
; int i = 0
; while i < baselen
; if (c == base[i])
; return 1
; return base[i]
; inc i
; return -1
get_num_from_base:
xor rax, rax; rax = i = 0
xor rax, rax
.loop:
cmp rax, rdx
@ -199,7 +177,6 @@ ft_atoibase:
mov r12, rax
mov r15b, dl
; r11 = r = 0
xor r11, r11
.loop:
cmp byte [r12], 0
@ -216,9 +193,10 @@ ft_atoibase:
test rax, rax
jl .end_loop
mul r11, r14
imul r11d, r14d
jo .overflow
add r11, rax
; r += rax
jc .overflow
inc r12
jmp .loop
@ -246,5 +224,7 @@ ft_atoibase:
jmp .done
.overflow:
xor rax, rax ; TODO: LONG_MAX | LONG_MIN
jmp .done
call __errno_location wrt ..plt
mov dword [rax], 34
xor rax, rax
jmp .cleanup