Quali numeri si bloccherebbe questa funzione?


10

Quali valori di xey causeranno un arresto anomalo con alcuni compilatori C?

int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}

Poiché le scorciatoie da operatore ternario di C, direi che nessuno lo farebbe. Questa domanda non sembra adattarsi al formato di questo sito, che si concentra su puzzle di programma e code golf. Vedi la faq per i dettagli codegolf.stackexchange.com/faq .
Steven Rumbalski,

Questo non è un codice golf, ma è un puzzle. C'è una risposta, ed è solo un paio di numeri.
ugoren,

Sono corretto.
Steven Rumbalski,

2
In realtà, a giudicare dal libro di K&R, questa funzione non deve mai andare in crash. Ma secondo lo standard ANSI C, il comportamento nel caso specifico di crash non è definito e con i compilatori x86 si arresta in modo anomalo.
Ugoren,

1
@dmckee, se dai la risposta giusta, sei il vincitore. Quale cretirion potrebbe essere più chiaro e obiettivo? C'è solo una risposta (o hai un altro esempio?)
ugoren,

Risposte:


7

-2147483648 (INT_MIN) e -1

#include <stdio.h>
#include <limits.h>
int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}
int main() {
    int r = f(INT_MIN, -1);
    printf("%d\n", r);
    return 0;
}

$ gcc -Wall division.c && ./a.out # => zsh: eccezione in virgola mobile ./a.out


Infatti. Anche se questo dovrebbe dare un avvertimento, perché 2147483648 non è un numero intero valido.
ugoren,

1
Sì, è per questo che ho usato INT_MIN dopo, per usare un int valido. Immagino che il motivo sia 2147483648 non è un int valido, poiché INT_MAX è 2 ^ 31-1 con int a 32 bit.
eregon,

Ah. Complemento a due. Ho perso questo.
Steven Rumbalski,

Sì, dovrebbe essere compilato in modo pulito con INT_MIN (che è -2147483648).
ugoren,

3

La risposta giusta è già stata data, ma ho pensato subito a Microsoft Pex .

Pex genera automaticamente suite di test con un'elevata copertura del codice. Direttamente dall'editor di codice di Visual Studio, Pex trova interessanti valori di input-output dei tuoi metodi, che puoi salvare come una piccola suite di test con copertura del codice elevata. Microsoft Pex è un componente aggiuntivo di Visual Studio per il test di applicazioni .NET Framework

Dopo aver aggiunto il tuo puzzle nel sito sandbox, trova la risposta in pochi secondi, lo stesso della risposta eregons. (fai clic su chiedi a pex)

Nota: lo fa in C #, ma la lingua non è molto rilevante.

  • x: int.MinValue
  • y: -1
  • Eccezione: OverflowException
  • Messaggio: l'operazione aritmetica ha provocato un overflow.

1
Bello. Sicuramente non lo costringe a forzare, perché non finirà in pochi secondi. Immagino che qualcuno nella SM abbia capito che i numeri intorno a 0 e MAX_INT sono sempre interessanti.
Ugoren,

Spero che sia un po 'più intelligente di così. Potrebbe sembrare a (x/y)e sapere che INT_MIN, -1, 0ecc, sono tutti i casi problematici per questa espressione, e cercare di decodificare un modo per produrre questi valori al momento della valutazione.
Clueless,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.