2012-12-11 14 views
8

मैं आर्थर व्हिटनी द्वारा काम के इस अद्भुत टुकड़ा मिला - http://www.jsoftware.com/jwiki/Essays/Incunabulumमैं इस 1989 लिखित सी प्रोग्राम को कैसे संकलित और चला सकता हूं?

यह कुछ ही चेतावनी

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

साथ संकलित लेकिन यह एक बुनियादी इनपुट 1 + 1 में प्रवेश पर segfaulted।

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

मेरा अनुमान है कि यह 1989

के बाद से कुछ सी संकलक में अंतर के साथ क्या करना मैं इस चलाने के लिए सक्षम हो जाएगा है? क्या मैं इसे हाल ही में लिनक्स/मैक पर काम कर सकता हूं? या वर्चुअलबॉक्स वीएम पर? या फिर कुछ और?

मेरी Google खोजों ने कुछ भी संबंधित नहीं किया।

+0

शायद आप अधिक जानकारी देखने के लिए gdb में प्रोग्राम चलाने का प्रयास कर सकते हैं? –

+0

'# शामिल ' शायद? संपादित करें: सही सिंटैक्स – leppie

+0

ऐसा लगता है जैसे बफर ओवरफ़्लो() – Zaffy

उत्तर

9

यह पॉइंटर्स को int और long और इसके विपरीत में परिवर्तित करता है। यह 64-बिट आर्किटेक्चर के साथ टूटता है जिसमें उनके अलग-अलग आकार होते हैं।

इसे 32-बिट लक्ष्य के लिए संकलित करें। जैसे, "-arch i386" के साथ मैक ओएस एक्स पर बजना/LLVM का उपयोग कर

+1

या जीसीसी के लिए '-m32'। यह एक ऐसे कार्यक्रम का एक शानदार उदाहरण हो सकता है जो 64-बिट सुरक्षित नहीं है। ;) –

+0

+1! इसे जोड़कर और उपर्युक्त उत्तर ने किया। – user1527166

+0

क्लैंग – Zaffy

4

मैं एक अनुमान दांव लगाना होगा कि यह इस वजह से segfaulted:

incuna.c: 8: 15: चेतावनी: में निर्मित समारोह 'malloc' की असंगत निहित घोषणा [डिफ़ॉल्ट रूप से सक्षम]

यदि मॉलोक घोषित नहीं किया गया है, तो यह आपको स्मृति आवंटित नहीं करेगा और आप एक शून्य को अस्वीकार कर देंगे और इससे सीजी गलती हो सकती है।

सहित के बाद:

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

चेतावनी printf(), malloc() के लिए, और strlen() चले गए हैं। कोड रन और काम करता है आप अगर इनपुट:

1+1 

नोट रिक्ति महत्वपूर्ण यहाँ है:

1 + 1 

SEGFAULT होगा।

+0

आप शायद शामिल करना भूल गए हैं। –

+0

@SSHThis, stdlib समेत चेतावनी को हटा दिया गया है, लेकिन segfault बनी हुई है। – user1527166

+0

अद्भुत! यह और मेरे 64 बिट पर्यावरण पर 'i386' आर्क का उपयोग करने के लिए एरिक द्वारा नीचे दिया गया उत्तर :) – user1527166

4

केवल पूर्वप्रक्रमक के माध्यम से यह रन:

जीसीसी -E interp.c> interp-pp.c

फिर सँवारना यह एक संपादक में, फिर यह देखने के लिए एक डीबगर का उपयोग करें कि यह क्या करता है।

1

मेरे सिस्टम (एएमडी 64 विन 8) पर, ऐसा लगता है कि पॉइंटर मूल्यों में अक्सर शीर्ष बिट सेट होता है, इसलिए एक पॉइंटर को एक पूर्णांक (जो यह प्रोग्राम करता है) का इलाज करना गलत तरीके से दुर्घटनाग्रस्त हो जाएगा।

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

होना चाहिए

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

या

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

यहाँ एक minimally-modified version के लिए एक लिंक है:

qv(a) समारोह ("क्वेरी क्रिया") बदलने कार्यक्रम चलाने के लिए अनुमति देता है जो चेतावनियों के बिना संकलित होना चाहिए (जीसीसी, डिफ़ॉल्ट विकल्प के साथ) और execu ते (सही इनपुट के साथ)।

+0

का उपयोग करने के लिए +1 मैंने इस विचित्र छोटे कार्यक्रम को विस्तारित करते हुए एक जिथब प्रोजेक्ट बनाया है। [कड़ी] (https://github.com/luser-dr00g/inca) –

संबंधित मुद्दे