Controllo overflow intero non in grado di rilevare alcuni casi

0

Accade qualcosa di molto strano quando controllo la mia esecuzione del codice per eliminare gli overflow interi. Il programma di controllo controlla il valore del flag di overflow utilizzando l'assembly inline.

Codice:

#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); }

Questo codice rileva payload come

  123456789123

ma payload come:

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

Perché succede questo e come posso risolvere questo problema?

    
posta AXANO 16.12.2017 - 01:20
fonte

1 risposta

2

Il tuo programma funzionerà solo per x86 in quanto uint32_t è la dimensione dei registri x86. In x64 i registri sono 8 byte e non considerano l'overflow a meno che l'overflow sia superiore a 8 byte.

   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>

Il flag di overflow non era impostato in x64 anche quando il mio numero era 0xffffffff (2 ** 32-1). Anche tecnicamente scanf("%d", &quantity); non sarebbe il modo migliore per ottenere input qui.

    
risposta data 03.01.2018 - 13:10
fonte

Leggi altre domande sui tag