2012-12-11 13 views
8

znalazłem to niesamowite dzieło Arthur Whitney - http://www.jsoftware.com/jwiki/Essays/IncunabulumJak mogę skompilować i uruchomić ten program, napisany 1989 C?

on skompilowany z kilkoma ostrzeżeń

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

Ale segfaulted na wprowadzeniu Basic Input 1 + 1.

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

zgaduję to ma coś wspólnego z różnicą w kompilator C od 1989

Jak będę mógł uruchomić ten? Czy mogę to zrobić działając na ostatnim systemie Linux/Mac? lub na maszynie wirtualnej VirtualBox? albo coś innego?

Moje wyszukiwania Google pojawiło się nic związanego.

+0

Być może możesz spróbować uruchomić program w gdb, aby zobaczyć więcej informacji? –

+0

'#include ' może? Edycja: skorygowana składnia – leppie

+0

Wygląda to na przepełnienie bufora z powodu pobrania() – Zaffy

Odpowiedz

9

Konwertuje wskaźniki na int i long i na odwrót. To zrywa z architekturami 64-bitowymi, w których mają różne rozmiary.

zrobić to za pomocą tarczy 32-bitowym. Na przykład z „-arch i386” za pomocą LLVM/clang na Mac OS X.

+1

Lub '-m32' dla gcc. To może być świetny przykład programu, który nie jest bezpieczny w 64-bitach. ;) –

+0

+1! Połączenie tego z powyższą odpowiedzią uczyniło to. – user1527166

+0

+1 za używanie języka – Zaffy

4

chciałbym postawić przypuszczenie, że segfaulted z tego powodu:

incuna.c: 8: 15: ostrzeżenie: niezgodna niejawna deklaracja wbudowanej funkcji 'malloc' [włączoną domyślnie]

Jeśli malloc nie jest zadeklarowana, to nie zamierza przydzielić ci pamięć i skończysz dereferencing null i które mogłyby doprowadzić do winy seg.

Po tym:

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

Ostrzeżenia dla printf(), malloc() i strlen() zniknęły. Trasy kod i prace jeśli wejście:

1+1 

Uwaga oddzielające jest ważna tutaj:

1 + 1 

będzie się wysypać.

+0

Prawdopodobnie zapomniałeś dołączyć . –

+0

@SSHThis, w tym stdlib usunął ostrzeżenie, ale segfault pozostaje. – user1527166

+0

Cudownie! To i odpowiedź poniżej, którą Eric użył do użycia łuku i386' pracował na moim 64-bitowym środowisku :) – user1527166

4

uruchomić go poprzez tylko preprocesora:

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

Następnie prettify w edytorze, a następnie użyj debuggera, aby obejrzeć, co robi.

1

W moim systemie (AMD64 Win 8) wydaje się, że wartości wskaźników często mają ustawiony najwyższy bit, więc traktowanie wskaźnika jako liczby całkowitej (co robi ten program) będzie źle działać i ulegać awarii.

Zmiana funkcji qv(a) ("czasownik zapytanie") pozwala na wykonywanie programu:

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

powinny być

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

lub

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

Oto link do minimally-modified version które powinno się kompilować bez ostrzeżeń (z gcc, domyślnymi opcjami) i execu te (z poprawnym wprowadzeniem).

+0

Stworzyłem projekt Github, rozszerzając ten dziwaczny mały program. [link] (https://github.com/luser-dr00g/inca) –

Powiązane problemy