के साथ टेम्पलेट्स की इनलाइनिंग को दबाने के लिए कैसे मैं कोड और शाखा कवरेज प्राप्त करने के लिए जीसीओवी के साथ जीसीसी 4.9 का उपयोग कर रहा हूं। हालांकि, शाखा कवरेज के परिणाम मेरे सी ++ कोड के लिए पूरी तरह से बेकार हैं। ऐसा लगता है कि जीसीसी सभी -fno-*-inline
झंडे का उपयोग करने के बावजूद टेम्पलेट्स को रेखांकित करता है।gcov
#include <string>
#include <iostream>
using namespace std;
int main() {
string foo;
foo = "abc";
cout << foo << endl;
}
मैं g++ -O0 -fno-inline -fno-inline-small-functions -fno-default-inline --coverage -fprofile-arcs test.cpp -o test
साथ कार्यक्रम संकलन test
, gcovr -r . -b
प्रिंट चलाने के बाद:
------------------------------------------------------------------------------
GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File Branches Taken Cover Missing
------------------------------------------------------------------------------
test.cpp 14 7 50% 7,8,9,10
------------------------------------------------------------------------------
TOTAL 14 7 50%
------------------------------------------------------------------------------
वहाँ नहीं है एक
यहाँ एक छोटा सा उदाहरण अनुप्रयोग है कि समस्या को दिखाता है हमारे main
फ़ंक्शन में एकल शाखा। उदाहरण के लिए, लाइन 7 में string foo;
शामिल है। ऐसा लगता है कि std::basic_string<...>
के निर्माता में कुछ विवरण हैं, लेकिन main
के कवरेज को देखते समय यह उपयोगी जानकारी नहीं है।
समस्या यह है कि इन सभी रेखांकित शाखाएं मिलती हैं और मेरे वास्तविक इकाई परीक्षणों के लिए गणना की गई शाखा कवरेज परिणामस्वरूप लगभग 40% होती है। मुझे अपने कोड की शाखा कवरेज में रूचि है, क्योंकि सी ++ मानक लाइब्रेरी में मैंने कितनी शाखाएं मारां।
क्या कंपाइलर में पूरी तरह से इनलाइनिंग बंद करने या इनलाइन शाखाओं पर विचार करने के लिए जीसीओवी को बताने का कोई तरीका नहीं है? मुझे उस विषय के बारे में जीसीओवी होमपेज या किसी और जगह पर कोई गाइड नहीं मिला।
किसी भी मदद की बहुत सराहना की जाती है।
और gcov आउटपुट फाइलें क्या दिखाती हैं? सभी std लाइब्रेरी कोड को बिना किसी इनलाइन के सारांश में 'test.cpp' के लिए जिम्मेदार ठहराया जाएगा, लेकिन विस्तृत आउटपुट दिखाएगा कि शाखाओं में कौन से वास्तविक कार्य होते हैं। – Useless