La comprobación de desbordamiento de enteros no detecta algunos casos

0

Algo muy raro sucede cuando controlo la ejecución de mi código para eliminar los desbordamientos de enteros. El programa de control verifica el valor de la bandera de desbordamiento utilizando el ensamblaje en línea.

Código:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

int add_u32(uint32_t a, uint32_t b, uint32_t* r) {
volatile int no_overflow = 1; 
volatile uint32_t result = a * b;
    __asm__ __volatile__ ( 
    "jno 1f ;"
    "movl $0, %[xo] ;" "1: ;"
    : [xo] "=m" (no_overflow) );
    if (r) 
        *r = result;
     printf("overflow flag:%d\n", no_overflow);
     return no_overflow; 
     }
int main(void) { 
    uint32_t quantity; 
    uint32_t price = 5;
    uint32_t total; 
    printf("Please enter desired quantity\n"); 
    scanf("%d", &quantity);
     if (add_u32(quantity, price, &total) == 0) { 
    printf("Wrong input, program shutting down...");
     return (1); 
    }
     else { 
    printf("Total price:%d\n", total); 
    } 
    return (0); }

Este código detecta cargas útiles como

  123456789123

pero las cargas útiles como:

//123456789123222900000 results in 836000
//123456789123222800000 results in 336000
//123456789123222733000 results in 1000
//123456789123222732801 results in 5

¿Por qué sucede esto y cómo puedo solucionarlo?

    
pregunta AXANO 16.12.2017 - 01:20
fuente

1 respuesta

2

Su programa solo funcionará para x86 ya que uint32_t es el tamaño de los registros x86. En x64, los registros son de 8 bytes y no se consideran desbordamiento a menos que el desbordamiento sea superior a 8 bytes.

   0x40066e <add_u32+40>    mov    eax, dword ptr [rbp - 0x14]
   0x400671 <add_u32+43>    imul   eax, dword ptr [rbp - 0x18]
   0x400675 <add_u32+47>    mov    dword ptr [rbp - 0xc], eax
 ► 0x400678 <add_u32+50>  ✔ jno    add_u32+59                    <0x400681>

El indicador de desbordamiento no se estableció en x64 incluso cuando mi número era 0xffffffff (2 ** 32-1). Además, técnicamente scanf("%d", &quantity); no sería la mejor manera de obtener información aquí.

    
respondido por el sudhackar 03.01.2018 - 13:10
fuente

Lea otras preguntas en las etiquetas