2010-09-14 18 views
7

शामिल करने के लिए होमवर्क परीक्षण प्लेटफॉर्म का विस्तार करना मैं होमवर्क परीक्षण के लिए एक मंच को बनाए/विकसित कर रहा हूं। यह ज्यादातर स्वचालित है। मुझे अब जोड़ने की जरूरत है कोड विश्लेषण है। मुझे विशिष्ट संरचनाओं के लिए कोड की जांच करने की आवश्यकता है।कोड विश्लेषण (सी/सी ++)

उदाहरण के लिए:

करता है फ़ाइल main.cpp एक वर्ग एक स्थिरांक विधि get_name() साथ user नामित होते हैं?

क्या वहां कुछ उपकरण है जो मुझे ऐसी चीजें करने की अनुमति देगा (आदर्श कुछ ऐसा होगा जो लिखित किया जा सकता है)। केवल लिनक्स

उत्तर

0

मैंने मोज़िला से डिहाइड्रा टूल की खोज की है। ऐसा लगता है कि ज्यादातर आंतरिक उद्देश्यों के लिए लिखा जाता है, लेकिन यह वही हो सकता है जो मैं खोज रहा था।

https://developer.mozilla.org/En/Dehydra/Using_Dehydra

संपादित करें: Dehydra महान है। इसमें कुछ मामूली विशेषताएं अनुपलब्ध हैं जैसे कि कॉन्स्ट तरीकों का निर्धारण करना, लेकिन अन्यथा महान।

3

एक संभावना GCC के माध्यम से कोड चलाने के लिए हो सकती है और प्रोग्राम की आंतरिक संरचना के XML विवरणों का उत्पादन करने के लिए GCC-XML एक्सटेंशन का उपयोग करें। फिर आप दस्तावेज़ को पार्स करने के लिए अपनी पसंदीदा एक्सएमएल लाइब्रेरी का उपयोग कर सकते हैं, या यदि आपको केवल इतना करना है कि इसे HTML या जो भी हो, उसे एक्सएसएलटी लागू करें।

1

आप संभवतः GCC-XML framework का उपयोग बिना किसी कठिनाई के किसी भी चीज़ को हैक कर सकते हैं।

1

यह C पर कैसे लागू होता है? :)

क्या फ़ाइल main.cpp में एक क्लास नामक क्लास है जिसे एक कॉन्स विधि get_name() है?

void test(void) { 
    const user x; 
    x.get_name(); 
} 

संकलन test.cpp और main.cpp एक साथ के साथ एक और फ़ाइल (test.cpp) बनाएँ। अगर कोई त्रुटि है (निकास कोड! = 0) तो नहीं!, फ़ाइल main.cpp विशिष्ट विधि के साथ उपयोगकर्ता नामित एक (सार्वजनिक) वर्ग को परिभाषित नहीं करता है।

चेतावनी: मुझे C++ पता नहीं है, इसलिए उपरोक्त में किसी भी प्रमुख (या मामूली) त्रुटियों को क्षमा करें।


संपादित स्क्रिप्ट जोड़ा

#! /bin/sh 

cat main.c test.c > 3710532.c 
if gcc 3710532.c > /dev/null 2>&1 
then echo OK 
else echo BZZZT 
fi 
rm 3710532.c 

मैं एक रेडी-टू-उपयोग C++ संकलक इस मशीन मैं पर हूँ पर स्थापित नहीं है, तो अपने परीक्षण एक C संकलक के साथ था और C फाइलें। मेरा कंपाइलर gcc -combine main.c test.c "के साथ काम नहीं करता था इसलिए मैंने उस हिस्से को tweaked।

main.c और test.c आउटपुट 'ओके' के कामकाजी संयोजन के साथ इस स्क्रिप्ट को चला रहा है, अन्यथा यह 'BZZZT' आउटपुट करता है।


परीक्षण के लिए मैं इस main.c

typedef int user; 

int get_name(void) { 
    return 0; 
} 

int main(void) { 
    return 0; 
} 

और इस test.c

void test(void) { 
    const user x; 
    get_name(); 
} 

नमूना रन इस्तेमाल किया

 
$ ./3710532.sh 
OK
+0

हमम ... अगर कोई त्रुटि नहीं है, तो ** हाँ! **: main.cpp कक्षा और विधि को परिभाषित करता है; अन्यथा त्रुटि कुछ भी हो सकती है – pmg

+0

यह गैर-कॉन्स विधि 'get_name' के साथ ठीक ठीक संकलित करेगा। अन्य संभावित त्रुटियों के संबंध में आपको पीएमजी के बिंदु के बावजूद 'x' एक 'const उपयोगकर्ता' बनाना होगा। –

+0

धन्यवाद मार्क। कोड बदल गया: 'x' अब' const' है। मैंने विधि के लिए 'const' भी पंजीकृत नहीं किया था। बस 'एक्स' कॉन्स गारंटी देता है कि विधि' const' भी है? – pmg

-1

आप मनमाने ढंग से कोड विश्लेषण करना चाहते हैं तो , आपको मनमाने ढंग से पार्सिंग/मिलान/आदि की आवश्यकता है। जीसीसी-एक्सएमएल आपको घोषणा जानकारी देगा, लेकिन विधियों की सामग्री नहीं।

हमारे DMS Software Reengineering Toolkit जीसीसी-एक्सएमएल के रूप में ही सार जानकारी प्रदान करेगा, लेकिन अतिरिक्त परिभाषाओं की सामग्री (जैसे, विधि शरीर जानकारी) के लिए पूर्ण विस्तार में शामिल हैं, अपने C++ Front End द्वारा समर्थित। यह आपको अपने छात्र कार्यक्रमों की जांच के लिए और सामग्री से डेलरेशन तक पहुंचने देगा।

डीएमएस एएसटी, प्रतीक सारणी और स्रोत-पैटर्न मिलान के लिए सामान्य उद्देश्य पार्सिंग प्रदान करता है। सी ++ फ्रंट एंड पूर्ण सी ++ पार्सिंग प्रदान करता है, सी ++ एएसटी और संबंधित प्रतीक जानकारी का निर्माण करता है। इसके बाद आप मान्यता के लिए क्या करते हैं, लेकिन आपका उदाहरण एक विशिष्ट पैटर्न की तलाश में प्रतीत होता है।

अपने उदाहरण के आधा सी के लिए कुछ डीएमएस स्रोत पैटर्न ++ द्वारा नियंत्रित किया जाएगा:

pattern is_correct_student_class(m:members):class = 
    " class user { \m } ". 

pattern is_correct_student_method_present(p:parameters,s:statements):method = 
    " const get_name(\p) { \s } " 

(माफ मेरी सी ++ वाक्य रचना, मैं इसके बारे में एक बहुत कुछ लिख नहीं है) जो किसी भी एएसटी क्रमशः से मेल खाएगा, , नामित उपयोगकर्ता वर्ग और वांछित कॉन्स विधि के अनुरूप। उद्धरण मेटा-कोट्स हैं, सी ++ सिंटैक्स के अंदर सामान \ p, \ m और \ मेटाएरिएबल्स पी, एम, और एस का प्रतिनिधित्व करते हुए सामान के साथ है, जो पैरामीटर सूची, विधि सूची और विवरण के अनुसार वाक्यबद्ध रूप से होना चाहिए पैटर्न से मेल खाने के क्रम में क्रमशः सूचियां। पैरामीटर सूची, आदि की परिभाषा स्वचालित रूप से C++ फ्रंट एंड के C++ व्याकरण भाग से व्युत्पन्न की जाती है। कुछ प्रस्तुति को आसान बनाने के लिए ले जाया स्वतंत्रता के साथ

(define has_student_code (lamdba (function boolean [tree AST])) 
     (AST:IsInTree tree 
      (lambda (function boolean [tree1 AST] 
       (&& (Registry:MatchPattern tree1 "is_correct_student_class") 
        (AST:IsInList (AST:GetNthGrammarChild tree1 4) ; the member list 
         (lambda (function boolean [tree2 AST]) 
          (Registry:MatchPattern tree2 ; a member 
           "is_correct_student_method_present") 
         )lambda 
     )lambda 
    ) 
    )define 

:

दूसरे आधे लागू सी ++ पार्सर और नाम/प्रकार रिसोल्वर के बाद मार डाला डीएमएस PARLANSE कोड का एक सा द्वारा कार्यान्वित किया जाता।

यह एक बहुत ही सरल जांच है; यदि आप समझ में आता है तो आप अधिक परिष्कृत जांच करने के लिए PARLANSE कोड से प्रतीक तालिका तक पहुंच सकते हैं।

जबकि डीएमएस सीधे लिनक्स के तहत नहीं चलता है, यह शराब के तहत चल रहा है।

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