2012-03-21 9 views
10

के लिए प्रोग्राम निर्भरता ग्राफ उत्पन्न करने के लिए मैं कौन से निःशुल्क टूल का उपयोग कर सकता हूं, मैं सी स्रोत कोड से प्रोग्राम निर्भरता ग्राफ (पीडीजी) उत्पन्न करना चाहता हूं। मुझे कागजात मिलते हैं जो बताते हैं कि यह कैसे करता है, लेकिन सभी ने वाणिज्यिक कोडसुरफर टूल का उपयोग किया।सी कोड

क्या कोई निःशुल्क टूल या ओपन सोर्स प्रोजेक्ट है जो यह काम कर सकता है?

उत्तर

16

Frama-C एक कार्यक्रम निर्भरता ग्राफ की गणना के आधार पर a slicer for C programs के साथ एक ओपन सोर्स स्टेटिक विश्लेषण मंच है।

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

int a, b, d, *p; 

int f (int x) { 
    return a + x; 
} 

int main (int c, char **v) { 
    p = &b; 
    a = 1; 
    *p = 2; 
    d = 3; 
    c = f(b); 
} 

आदेश frama-c -pdg -dot-pdg graph -pdg-print t.c डॉट फ़ाइलों graph.main.dot और graph.f.dot क्रमशः main() और f() की PDG युक्त उत्पन्न करता है:

यहाँ एक उदाहरण है।

आप बहुत प्रिंट उन्हें इस प्रकार से एक के लिए dot प्रोग्राम का उपयोग कर सकते हैं: dot -Tpdf graph.main.dot > graph.pdf

परिणाम नीचे है:

PDG of main()

नोट नोड *p = 2; नोड c = f(b); से बढ़त। सी कार्यक्रमों के लिए उपयोगी होने का दावा करने वाला एक पीडीजी गणना एलियासिंग को संभालना चाहिए।

दूसरी ओर, कसौटी "बयान c = f(b); की आदानों" पर काट करने के लिए इस PDG का उपयोग कर एक स्लाइसर d = 3;, जो प्रभावित नहीं कर सकते समारोह कॉल दूर करने के लिए, यहां तक ​​कि सूचक पहुँच *p के माध्यम से कर सकेंगे। फ्रामा-सी का स्लाइसर पीडीजी द्वारा संकेतित निर्भरताओं का उपयोग करता है ताकि केवल उपयोगकर्ता द्वारा निर्दिष्ट स्लाइसिंग मानदंड के लिए उपयोगी बयानों को रखा जा सके।

/* Generated by Frama-C */ 
int a; 
int b; 
int *p; 
int f_slice_1(int x) 
{ 
    int __retres; 
    __retres = a + x; 
    return (__retres); 
} 

void main(int c) 
{ 
    p = & b; 
    a = 1; 
    *p = 2; 
    c = f_slice_1(b); 
    return; 
} 
+0

आपकी उल्लेखनीय सहायता के लिए बहुत बहुत धन्यवाद। मैं सीखना शुरू कर रहा हूं कि Frama-C का उपयोग कैसे करें। Frama-C के संदर्भ में, मुझे graph.main.dot ग्राफ में रेखा की मीनिंग नहीं मिल रही है। विभिन्न पंक्ति शैलियों का क्या अर्थ है? या इसके बारे में कोई सामग्री है। – user1283336

+0

@ user1283336 3 प्रकार के तीर हैं: क्रमशः डेटा, नियंत्रण और पता निर्भरताएं। कार्यक्रम 'int ए, बी, * पी; शून्य मुख्य (int x, int y, int z) { पी = और ए; * पी = एक्स; यदि (वाई) बी = जेड; } 'में सभी 3 प्रकार की निर्भरताएं शामिल हैं। पहले उदाहरण में समान कमांडलाइन का उपयोग करके, आपको यह पहचानने में कोई कठिनाई नहीं होनी चाहिए कि कौन सा है। स्लाइसर के आंतरिक लोगों का कोई उपयोगकर्ता-उपलब्ध विवरण नहीं है, क्षमा करें, इसका उपयोग करने के बारे में केवल एक बाहरी विवरण है। –

+1

मुझे लगता है कि यह '-dd-pdg' के बजाय' -pdg-dot' होना चाहिए? कम से कम मेरे लिए यह केवल पूर्व तरीके से काम करता है – Paddre

4

आप एक दूसरे को बुला तरीकों की निर्भरता कल्पना करने के लिए पसंद है और gcc तो उपयोग कर रहे हैं gcc के विकल्प -fdump-rtl-expand आपकी रुचि का हो सकता है।

-fdump-rtl-expandgcc विकल्प का उपयोग करके संकलित प्रत्येक स्रोत फ़ाइल के लिए *.expand फ़ाइल आउटपुट करेगा।

उपकरण egypt उपकरण से खिलाए गए फाइलें विधि की निर्भरताओं को दिखाते हुए ग्राफ उत्पन्न करती हैं।

+0

एक PDG एक ग्राफ जिसका नोड्स बयान कर रहे हैं: उदाहरण के लिए, आदेश frama-c -slice-wr c t.c -then-on 'Slicing export' -print नीचे कम कार्यक्रम है, जहां d असाइनमेंट हटा दिया गया है पैदा करता है। उदाहरण के लिए देखें http://www.grammatech.com/research/papers/slicing/slicingWhitepaper.html –