का उपयोग कर सी/सी ++ कोड इंस्ट्रूमेंटिंग मैं सिर्फ एलएलवीएम प्रोजेक्ट के बारे में पढ़ता हूं और इसका उपयोग एलएलवीएम के फ्रंट एंड विश्लेषक क्लेंग का उपयोग करके सी/सी ++ कोड पर स्थिर विश्लेषण करने के लिए किया जा सकता है। मैं जानना चाहता था कि एलएलवीएम का उपयोग कर स्रोत कोड में स्मृति (चर, स्थानीय और वैश्विक) तक सभी पहुंच निकालना संभव है या नहीं।एलएलवीएम
क्या एलएलवीएम में कोई अंतर्निहित लाइब्रेरी मौजूद है जिसे मैं इस जानकारी को निकालने के लिए उपयोग कर सकता हूं। यदि नहीं, तो कृपया मुझे सुझाव दें कि ऐसा करने के लिए कार्यों को कैसे लिखना है। (मौजूदा स्रोत कोड, संदर्भ, ट्यूटोरियल, उदाहरण ...) मैंने जो सोचा है, क्या मैं पहले स्रोत कोड को एलएलवीएम बीसी में परिवर्तित कर दूंगा और फिर उपकरण यह विश्लेषण करने के लिए, लेकिन यह नहीं पता कि यह कैसे करना है।
मैं जो आईआर मैं अपने उद्देश्य के लिए उपयोग करना चाहिए अपने आप को यह पता लगाने की कोशिश की (बजना का सार सिंटेक्स पेड़ (एएसटी) या LLVM के सर्व शिक्षा अभियान के मध्यवर्ती प्रतिनिधित्व (आईआर)।), लेकिन वास्तव में जो करने के लिए एक को समझ नहीं सकता उपयोग। यहां मैं क्या करने की कोशिश कर रहा हूं। किसी भी सी/सी ++ प्रोग्राम (जैसा कि नीचे दिया गया है) दिया गया है, मैं स्मृति से/पढ़ने/लिखने वाले प्रत्येक निर्देश से पहले और बाद में कुछ फ़ंक्शन में कॉल डालने का प्रयास कर रहा हूं। उदाहरण के लिए नीचे दिए गए सी ++ प्रोग्राम (Account.cpp)
#include <stdio.h>
class Account {
int balance;
public:
Account(int b) {
balance = b;
}
int read() {
int r;
r = balance;
return r;
}
void deposit(int n) {
balance = balance + n;
}
void withdraw(int n) {
int r = read();
balance = r - n;
}
};
int main() {
Account* a = new Account(10);
a->deposit(1);
a->withdraw(2);
delete a;
}
तो इंस्ट्रूमेंटेशन के बाद मेरे कार्यक्रम की तरह दिखना चाहिए पर विचार करें:
#include <stdio.h>
class Account {
int balance;
public:
Account(int b) {
balance = b;
}
int read() {
int r;
foo();
r = balance;
foo();
return r;
}
void deposit(int n) {
foo();
balance = balance + n;
foo();
}
void withdraw(int n) {
foo();
int r = read();
foo();
foo();
balance = r - n;
foo();
}
};
int main() {
Account* a = new Account(10);
a->deposit(1);
a->withdraw(2);
delete a;
}
जहां foo() हो सकता है जैसे किसी भी समारोह मौजूदा सिस्टम का समय मिलता है या काउंटर में वृद्धि .. इतने पर। मैं समझता हूं कि उपर्युक्त कार्य को सम्मिलित करने के लिए मुझे पहले आईआर प्राप्त करना होगा और फिर आईआर पर एक उपकरण पास करना होगा जो आईआर में ऐसी कॉल डालेगा, लेकिन मुझे वास्तव में यह नहीं पता कि इसे कैसे प्राप्त किया जाए। कृपया मुझे उदाहरण के साथ सुझाव दें कि इसके बारे में कैसे जाना है।
यह भी समझता है कि एक बार जब मैं आईआर में प्रोग्राम संकलित करता हूं, तो मेरे मूल कार्यक्रम और वाद्य यंत्र आईआर के बीच 1: 1 मैपिंग प्राप्त करना वास्तव में मुश्किल होगा। तो, मूल कार्यक्रम में आईआर (उपकरण के कारण) में किए गए परिवर्तनों को प्रतिबिंबित करना संभव है।
एलएलवीएम पास के साथ शुरू करने के लिए और अपने आप को कैसे बनाना है, मैंने एक पास का एक उदाहरण देखा जो एलएलवीएम आईआर लोड और स्टोर्स में रन-टाइम चेक जोड़ता है, SAFECode का लोड/स्टोर इंस्ट्रूमेंटेशन पास (http://llvm.org/viewvc/llvm-project/safecode/trunk/include/safecode/LoadStoreChecks.h?view=markup और http://llvm.org/viewvc/llvm-project/safecode/trunk/lib/InsertPoolChecks/LoadStoreChecks.cpp?view=markup)। लेकिन मैं यह समझ नहीं पाया कि इस पास को कैसे चलाया जाए। कृपया मुझे बताएं कि कुछ कार्यक्रमों पर इस पास को कैसे चलाया जाए, ऊपर दिए गए खाते.cpp कहते हैं।
क्या आपने पहले से ही एलएलवीएम उदाहरणों की जांच की है और क्या आपने एलएलवीएम पास को कार्यान्वित करने के तरीके को पढ़ा है (और उन्हें 'ऑप्ट' प्लगइन के रूप में चलाएं)? http://llvm.org/docs/WritingAnLLVMPass.html –
[एलएलवीएम का उपयोग कर इंस्ट्रूमेंटिंग सी/सी ++ कोड का संभावित डुप्लिकेट] (http://stackoverflow.com/questions/7806689/instrumenting-cc-code-using-llvm) – RedX