2012-12-11 12 views
8

fand ich dieses erstaunliche Stück Arbeit von Arthur Whitney - http://www.jsoftware.com/jwiki/Essays/IncunabulumWie kann ich dieses 1989 geschriebene C-Programm kompilieren und ausführen?

es mit einem paar Warnungen zusammengestellt

$ 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] 

Aber es segfaulted 1 + 1 eine Basis-Eingabe beim Eintritt.

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

Ich vermute, das hat etwas mit dem Unterschied in C-Compiler seit 1989

Wie würde ich in der Lage sein zu laufen, dies zu tun? Kann ich das auf aktuellen Linux/Mac arbeiten? oder auf einer VirtualBox VM? oder irgendetwas anderes?

Meine Google-Suchen aufgedeckt nichts verwandtes.

+0

Vielleicht könnten Sie versuchen, das Programm in gdb ausführen, um weitere Informationen zu sehen? –

+0

'#include ' vielleicht? Edit: korrigierte Syntax – leppie

+0

Dies sieht aus wie Pufferüberlauf wegen gets() – Zaffy

Antwort

9

Es konvertiert Zeiger auf int und long und umgekehrt. Dies bricht mit 64-Bit-Architekturen, in denen sie unterschiedliche Größen haben.

Kompilieren Sie es für ein 32-Bit-Ziel. ZB mit „-arch i386“ mit Klirren/LLVM auf Mac OS X.

+1

Oder '-m32' für gcc. Dies könnte ein großartiges Beispiel für ein Programm sein, das nicht 64-Bit-sicher ist. ;) –

+0

+1! Kombiniert dies und die obige Antwort hat es getan. – user1527166

+0

+1 für die Verwendung von clang – Zaffy

4

Ich würde eine Vermutung wetten, dass es aus diesem Grunde segfaulted:

incuna.c: 8: 15: Warnung: unvereinbar implizite Deklaration von integrierten Funktion 'malloc' [standardmäßig aktiviert]

Wenn malloc nicht deklariert ist, wird es Ihnen keinen Speicher zuweisen, und Sie werden am Ende eine Null-Dereferenzierung durchführen, was zu einem Seg-Fehler führen könnte.

Nach einschließlich:

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

Die Warnungen für printf(), malloc() und strlen() sind verschwunden. Der Code läuft und funktioniert, wenn Sie Eingabe:

1+1 

Notiere die Abstand ist wichtig hier:

1 + 1 

wird segfault.

+0

Sie haben wahrscheinlich vergessen, einzuschließen. –

+0

@SSHDieser einschließlich stdlib entfernte die Warnung, aber der segfault bleibt bestehen. – user1527166

+0

Wunderbar! Dies und die Antwort unten von Eric, um 'i386' arch zu verwenden, funktionierte auf meiner 64-Bit-Umgebung :) – user1527166

4

führen Sie es durch den Präprozessor nur:

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

Dann prettify Es in einem Editor, dann verwenden Sie einen Debugger, um zu sehen, was es tut.

1

Auf meinem System (AMD64 Win 8), scheint es, dass Pointer-Werte oft das obere Bit gesetzt haben, so wird ein Zeiger als Integer (was dieses Programm tut) falsch verhalten und abstürzen.

Ändern der qv(a) Funktion ("query Verb") ermöglicht das Programm auszuführen:

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

sollte

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

oder

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

Hier ist ein Link zu einem minimally-modified version das sollte ohne Warnungen (mit gcc, Standardoptionen) und executieren kompilieren te (mit korrekter Eingabe).

+0

Ich habe ein Github-Projekt erstellt und dieses bizarre kleine Programm erweitert. [link] (https://github.com/luser-dr00g/inca) –