2012-12-11 14 views
8

ho trovato questo incredibile pezzo di lavoro di Arthur Whitney - http://www.jsoftware.com/jwiki/Essays/IncunabulumCome posso compilare ed eseguire questo programma C scritto nel 1989?

E 'stato compilato con alcune avvertenze

$ gcc-4.7 incuna.c -o incuna.o 
incuna.c: In function 'ma': 
incuna.c:8:15: warning: incompatible implicit declaration of built-in function 'malloc' [enabled by default] 
incuna.c: In function 'pi': 
incuna.c:26:7: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default] 
incuna.c: In function 'nl': 
incuna.c:26:24: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default] 
incuna.c: In function 'pr': 
incuna.c:28:10: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default] 
incuna.c: In function 'ex': 
incuna.c:35:36: warning: assignment makes integer from pointer without a cast [enabled by default] 
incuna.c:35:25: warning: return makes pointer from integer without a cast [enabled by default] 
incuna.c: In function 'noun': 
incuna.c:37:57: warning: return makes integer from pointer without a cast [enabled by default] 
incuna.c: In function 'wd': 
incuna.c:39:21: warning: incompatible implicit declaration of built-in function 'strlen' [enabled by default] 

Ma segfaulted entrando un input di base 1 + 1.

./incuna.o 
warning: this program uses gets(), which is unsafe. 
1 + 1 
[1] 11525 segmentation fault ./incuna.o 

Sto indovinando questo ha qualcosa a che fare con la differenza di compilatore C dal 1989.

Come vorrei essere in grado di eseguire questo? Posso farlo funzionare su Linux/Mac recenti? o su una VirtualBox VM? o qualsiasi altra cosa?

Le mie ricerche Google non hanno restituito nulla.

+0

Forse potresti provare a eseguire il programma in gdb per visualizzare maggiori informazioni? –

+0

'#include ' forse? Modifica: sintassi corretta – leppie

+0

Sembra che l'overflow del buffer sia dovuto a gets() – Zaffy

risposta

9

Converte i puntatori su int e long e viceversa. Questo rompe con architetture a 64 bit in cui hanno dimensioni diverse.

Compilarlo per un obiettivo a 32 bit. Ad esempio, con “i386 -arch” utilizzando clangore/LLVM su Mac OS X.

+1

Oppure '-m32' per gcc. Questo potrebbe essere un ottimo esempio di un programma che non è sicuro a 64 bit. ;) –

+0

+1! Combinando questo e la risposta sopra lo ha fatto. – user1527166

+0

+1 per usare clang – Zaffy

4

Vorrei scommettere una supposizione che segfaulted a causa di questo:

incuna.c: 8: 15: warning: incompatibili dichiarazione implicita di funzione built-in 'malloc' [abilitato per impostazione predefinita]

Se malloc non viene dichiarato, non assegnerà la memoria e terminerà il dereferenziamento di null e ciò potrebbe causare un errore di seg.

Dopo aver incluso:

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

Le avvertenze per printf(), malloc(), e strlen() se ne sono andati. Le piste di codice e opere se in ingresso:

1+1 

nota la distanza è importante qui:

1 + 1 

sarà segfault.

+0

Probabilmente hai dimenticato di includere . –

+0

@SSHQuesto, incluso stdlib ha rimosso l'avviso, ma il segfault rimane. – user1527166

+0

Meraviglioso! Questa e la risposta che segue da Eric per usare l'arco 'i386' funzionava sul mio ambiente a 64 bit :) – user1527166

4

Run attraverso solo il preprocessore:

gcc -E interp.c> interp-pp.c

Poi prettify in un editor, quindi usa un debugger per vedere cosa fa.

1

Sul mio sistema (AMD64 Win 8), sembra che i valori del puntatore spesso abbiano il bit più alto impostato, quindi il trattamento di un puntatore come un intero (che questo programma fa) si comporta in modo anomalo e si blocca.

Modifica della funzione qv(a) ("interrogazione verb") permette l'esecuzione del programma:

qv(a){R a<'a';} 

dovrebbe essere

qv(a){R a<'a'&&a>0;} 

o

qv(a)unsigned a;{R a<'a';} 

Ecco un link ad un minimally-modified version che dovrebbe compilare senza avvisi (con gcc, opzioni predefinite) ed execu te (con input corretto).

+0

Ho creato un progetto github, estendendo questo bizzarro programma. [Link] (https://github.com/luser-dr00g/inca) –

Problemi correlati