2010-08-09 23 views
10

मैं वर्तमान में एक सी परियोजना पर काम कर रहा हूं जिसे विभिन्न भवन वातावरण के बीच काफी पोर्टेबल होना चाहिए। परियोजना होस्टेड सी पर्यावरण पर POSIX- अनुपालन प्रणाली को लक्षित करती है।सख्त आईएसओ सी अनुरूपता परीक्षण

पोर्टेबिलिटी की अच्छी डिग्री प्राप्त करने का एक तरीका एक चुने हुए मानक के अनुरूप कोड करना है, लेकिन यह निर्धारित करना मुश्किल है कि दी गई अनुवाद इकाई आईएसओ सी के लिए सख्त अनुरूप है या नहीं, उदाहरण के लिए, यह कुछ अनुवाद का उल्लंघन कर सकती है सीमाएं, या यह एक अपरिभाषित व्यवहार पर निर्भर हो सकती है, संकलन पर्यावरण से किसी भी नैदानिक ​​संदेश के बिना। मुझे यह भी यकीन नहीं है कि बड़ी परियोजनाओं के सख्त अनुरूपता की जांच करना संभव है या नहीं।

इस बात को ध्यान में रखते हुए, सख्त किसी दिए गए मानक (उदाहरण के लिए, सी 8 9 या सी 99) के तहत एक इकाई के अनुरूप आईएसओ सी अनुरूपता के लिए परीक्षण करने के लिए कोई संकलक, उपकरण या विधि है?

किसी भी मदद की सराहना की जाती है।

उत्तर

4

सामान्य रूप से अनिर्धारित रन-टाइम व्यवहार को ढूंढना संभव नहीं है। उदाहरण के लिए,

void foo(int *p, int *q) 
{ 
    *p = (*q)++; 
    ... 

जो p == q पर अपरिभाषित है, पर विचार करें। चाहे वह हो सकता है, रोकथाम की समस्या को हल किए बिना समय से पहले निर्धारित नहीं किया जा सकता है।

(गलती CAF ठीक करने के लिए संपादित किया गया बताया। धन्यवाद, CAF।)

+0

आपका उदाहरण शानदार है। मैंने कभी इतना आसान सूचक अभिव्यक्तियों के बारे में सोचा नहीं है। मेरा मानना ​​था कि इस तरह की अनिर्धारित स्थिति को पार्स-टाइम पर देखा जा सकता है। – alecov

+3

आपका उदाहरण वास्तव में ठीक है, भले ही 'p == q' - शायद आपका मतलब' * p = (* q) ++ 'है, जो 'p == q' अगर अपरिभाषित है? – caf

3

वास्तव में नहीं। सी मानक अनुवाद इकाइयों पर कोई पूर्ण न्यूनतम सीमा निर्धारित नहीं करता है जिसे स्वीकार किया जाना चाहिए। जैसे, एक पूरी तरह से सही चेकर व्यवहार में लिखने के लिए तुच्छ है, लेकिन पूरी तरह से बेकार हो सकता है:

#include <stdio.h> 

int main(int argc, char **argv) { 
    int i; 
    for (i=1; i<argc; i++) 
     fprintf(stderr, "`%s`: Translation limit (potentially) exceeded.\n", argv[i]); 
    return 0; 
} 

हाँ, यह कोई फर्क नहीं पड़ता कि कैसे को खारिज कर दिया सब कुछ, तुच्छ। यह मानक के अनुसार है। जैसा कि मैंने कहा, यह अभ्यास में पूरी तरह से बेकार है। दुर्भाग्यवश, आप वास्तव में बहुत कुछ बेहतर नहीं कर सकते - जब आप एक अलग कार्यान्वयन के लिए बंदरगाह का निर्णय लेते हैं, तो आप कुछ विषम संसाधन सीमा में भाग सकते हैं जिसे आपने कभी नहीं देखा है, इसलिए आपके द्वारा लिखे गए किसी भी कोड (जिसमें " हैलो वर्ल्ड ") बहुत कम सिस्टम के लिए दर्जनों या यहां तक ​​कि सैकड़ों कंपाइलरों द्वारा अनुमत होने के बावजूद संसाधन संसाधन से अधिक हो सकता है।

संपादित करें:

क्यों एक "हैलो दुनिया" कार्यक्रम का कड़ाई अनुरूप नहीं है

सबसे पहले, यह है लायक फिर से बताते हुए की "कड़ाई अनुरूप" परिभाषा: "एक सख्ती अनुरूप कार्यक्रम के लिए केवल उन का उपयोग करेगा इस अंतर्राष्ट्रीय मानक में निर्दिष्ट भाषा और पुस्तकालय की विशेषताएं 2. यह किसी भी निर्दिष्ट, अपरिभाषित, या कार्यान्वयन-परिभाषित व्यवहार पर निर्भर उत्पादन का उत्पादन नहीं करेगी, और न्यूनतम कार्यान्वयन सीमा से अधिक नहीं होगी। "

वास्तव में संख्या कारणों से "हैलो, वर्ल्ड" सख्ती से अनुरूप नहीं है। सबसे पहले, जैसा कि ऊपर बताया गया है, कार्यान्वयन सीमाओं के लिए न्यूनतम आवश्यकताओं पूरी तरह से अर्थहीन हैं - हालांकि कुछ प्रोग्राम होना चाहिए जो स्वीकार की जाने वाली कुछ सीमाओं को पूरा करता है, नहीं अन्य कार्यक्रम को स्वीकार किया जाना चाहिए, भले ही यह ' टी भी उन सीमाओं के करीब आते हैं। जिस तरह से आवश्यकता बताई गई है, उसे देखते हुए, यह प्रश्न (खुले में) के लिए खुला है कि क्या ऐसी कोई ऐसी चीज है जो किसी भी न्यूनतम कार्यान्वयन सीमा से अधिक न हो, क्योंकि मानक वास्तव में न्यूनतम कार्यान्वयन सीमा को परिभाषित नहीं करता है।

दूसरा, अनुवाद के चरण 1 के दौरान: "स्रोत स्रोत फ़ाइल में कार्यान्वयन परिभाषित तरीके से, भौतिक स्रोत फ़ाइल मल्टीबाइट वर्ण मैप किए जाते हैं ..." (§5.1.1.2/1)। चूंकि "हैलो, वर्ल्ड!" (या जो भी संस्करण आप पसंद करते हैं) स्रोत फ़ाइल में एक स्ट्रिंग अक्षर के रूप में आपूर्ति की जाती है, इसे स्रोत चरित्र सेट में कार्यान्वयन-परिभाषित तरीके से मैप किया जा सकता है। एक कार्यान्वयन यह तय करने के लिए स्वतंत्र है कि (एक बेवकूफ उदाहरण के लिए) स्ट्रिंग अक्षर आरओटी 13 एन्कोड किया जाएगा, और जब तक कि तथ्य ठीक से दस्तावेज किया गया हो, यह पूरी तरह से वैध है।

तीसरा, आउटपुट आमतौर पर stdout के माध्यम से लिखा जाता है। stdout एक टेक्स्ट स्ट्रीम है। मानक के मुताबिक: "मेजबान पर्यावरण में पाठ का प्रतिनिधित्व करने के लिए अलग-अलग सम्मेलनों के अनुरूप अक्षरों को इनपुट, आउटपुट में जोड़ा, परिवर्तित या हटा दिया जाना चाहिए। इस प्रकार, पात्रों के बीच एक-एक-एक पत्राचार की आवश्यकता नहीं है एक धारा में और बाहरी प्रतिनिधित्व में उन लोगों में। " (§7.19.2/2) इस तरह, एक कार्यान्वयन (उदाहरण के लिए) आउटपुट (सोमवार, बुधवार, या शुक्रवार को) पर हफमैन संपीड़न कर सकता है।

तो, हमारे पास (कम से कम) तीन अलग-अलग बिंदु हैं जिन पर आउटपुट "हैलो, वर्ल्ड!" कार्यान्वयन-परिभाषित विशेषताओं पर निर्भर करता है - इनमें से कोई भी सख्ती से अनुरूप कार्यक्रम की परिभाषा को फिट करने से रोक देगा।

+0

यह मानक के अनुसार नहीं है। §5.2.4.1 अनुवाद सीमाएं देखें। –

+0

@ स्टीफन: हाँ, यह है। आवश्यकता है: "कार्यान्वयन कम से कम एक प्रोग्राम का अनुवाद और निष्पादन करने में सक्षम होगा जिसमें निम्नलिखित सीमाओं में से प्रत्येक का कम से कम एक उदाहरण शामिल है:"। केवल * एक * विशिष्ट कार्यक्रम - और यह भी दस्तावेज दस्तावेज करने की आवश्यकता नहीं है कि वह प्रोग्राम क्या है। प्रत्येक संभावित इनपुट एक विशिष्ट व्यक्ति को छोड़कर असफल हो सकता है जिसे पहचानने की आवश्यकता नहीं है ... –

+1

आईएसओ सी 99 मानक से, §4 अनुरूपता: "एक सख्ती से अनुरूप कार्यक्रम केवल उस भाषा और पुस्तकालय की उन विशेषताओं का उपयोग करेगा अंतर्राष्ट्रीय मानक। यह उत्पादन को किसी भी अनिर्दिष्ट, अपरिभाषित, या कार्यान्वयन-परिभाषित व्यवहार पर निर्भर नहीं करेगा, और न्यूनतम कार्यान्वयन सीमा से अधिक नहीं होगा। " इसलिए, हैलो वर्ल्ड प्रोग्राम का स्पष्ट रूप से सरल कार्यान्वयन क्यों इस मामले में सख्ती से अनुरूप नहीं होगा? – alecov

0

जीसीसी में चेतावनी के स्तर हैं जो एएनएसआई अनुरूपता के विभिन्न पहलुओं को पिन करने का प्रयास करेंगे। लेकिन टोपी केवल एक शुरुआती बिंदु है।

0

आप gcc -std=c99, या gcc -ansi -pedantic के साथ शुरू हो सकता है।

0

इसके साथ शुभकामनाएँ। हस्ताक्षरित पूर्णांक से बचने का प्रयास करें, क्योंकि:

int f(int x) 
{ 
return -x; 
} 

यूबी का आह्वान कर सकता है।