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
परिणाम नीचे है:
नोट नोड *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;
}
स्रोत
2012-03-21 22:36:39
आपकी उल्लेखनीय सहायता के लिए बहुत बहुत धन्यवाद। मैं सीखना शुरू कर रहा हूं कि Frama-C का उपयोग कैसे करें। Frama-C के संदर्भ में, मुझे graph.main.dot ग्राफ में रेखा की मीनिंग नहीं मिल रही है। विभिन्न पंक्ति शैलियों का क्या अर्थ है? या इसके बारे में कोई सामग्री है। – user1283336
@ user1283336 3 प्रकार के तीर हैं: क्रमशः डेटा, नियंत्रण और पता निर्भरताएं। कार्यक्रम 'int ए, बी, * पी; शून्य मुख्य (int x, int y, int z) { पी = और ए; * पी = एक्स; यदि (वाई) बी = जेड; } 'में सभी 3 प्रकार की निर्भरताएं शामिल हैं। पहले उदाहरण में समान कमांडलाइन का उपयोग करके, आपको यह पहचानने में कोई कठिनाई नहीं होनी चाहिए कि कौन सा है। स्लाइसर के आंतरिक लोगों का कोई उपयोगकर्ता-उपलब्ध विवरण नहीं है, क्षमा करें, इसका उपयोग करने के बारे में केवल एक बाहरी विवरण है। –
मुझे लगता है कि यह '-dd-pdg' के बजाय' -pdg-dot' होना चाहिए? कम से कम मेरे लिए यह केवल पूर्व तरीके से काम करता है – Paddre