2009-05-13 12 views
15

मैं एक परियोजना को प्रोफाइल करने के लिए क्लैंग का उपयोग करने की कोशिश कर रहा हूं जिस पर मैं काम कर रहा हूं। इस परियोजना में एक बड़ी स्थिर पुस्तकालय शामिल है जिसे एक्सकोड में निर्भरता के रूप में शामिल किया गया है।कुछ फाइलों का विश्लेषण न करने के लिए कहा जा सकता है?

मैं वास्तव में निर्भरता की फ़ाइलों का विश्लेषण न करने के लिए झुकाव पसंद करूंगा, क्योंकि ऐसा लगता है कि यह असफल हो गया है। क्या यह संभव है? मैं क्लैंग दस्तावेज पढ़ रहा हूं, और मुझे यह नहीं मिला है।

+0

एप्पल http://devforums.apple.com पर एनडीए के तहत जारी की उत्पादों की गोपनीय चर्चा के लिए एक सभ्य मंच है इस तरह के प्रश्नों का उत्तर ऐप्पल लोक और अन्य खुला डेवलपर्स द्वारा दिया जा सकता है। – cdespinosa

+0

(जब तक आप http://clang.llvm.org/StaticAnalysis.html पर स्कैन-बिल्ड टूल का उपयोग करने के बारे में नहीं पूछ रहे हैं, जो वास्तव में सार्वजनिक है। उस स्थिति में, केवल उन स्रोत फ़ाइलों को सूचीबद्ध करें जिन्हें आप विश्लेषण करना चाहते हैं, जैसा दिखाया गया है उस पृष्ठ पर मूल उपयोग में।) – cdespinosa

+0

मैं सिर्फ स्कैन-निर्माण टूल के बारे में बात कर रहा हूं। दुर्भाग्यवश, मूल उपयोग के तहत, इसमें विश्लेषण से फ़ाइलों को छोड़ने के बारे में कुछ भी नहीं है। यदि आप किसी प्रोजेक्ट पर स्कैन-बिल्ड का उपयोग कर रहे हैं, तो यह डिफ़ॉल्ट रूप से उस परियोजना के भीतर की सभी फ़ाइलों का विश्लेषण करता है, जिसमें मेरी विशाल स्थैतिक लाइब्रेरी भी शामिल है। –

उत्तर

4

तो, यह वास्तव में एक उत्तर नहीं है, लेकिन यह काफी अच्छा काम करता है।

जो मैंने समाप्त किया वह समय से पहले स्थिर पुस्तकालय का निर्माण कर रहा था, और फिर स्कैन-बिल्ड का उपयोग करके परियोजना का निर्माण कर रहा था। चूंकि स्थिर पुस्तकालय का एक अप-टू-डेट निर्माण पहले से ही बनाया गया था, इसलिए इसे पुनर्निर्मित नहीं किया गया था और इस प्रकार स्कैन नहीं किया गया था।

हालांकि, मुझे अभी भी इसके लिए एक वास्तविक जवाब होना अच्छा लगेगा।

13

अंतिम उपाय के रूप में, एक ब्रूट फोर्स विकल्प है।

एक फ़ाइल की शुरुआत करने के लिए इस जोड़ें:

// Omit from static analysis. 
#ifndef __clang_analyzer__ 

समाप्त करने के लिए इस जोड़ें:

#endif // not __clang_analyzer__ 

और बजना --analyze फ़ाइल की सामग्री नहीं देख सकेंगे।

संदर्भ: Controlling Static Analyzer Diagnostics

+1

इसका तात्पर्य है कि मुझे इस मैक्रो को स्थिर पुस्तकालय में प्रत्येक स्रोत फ़ाइल पर सेट करना है, है ना? यह प्रबंधनीय आईएमओ नहीं है। मैं अपनी निर्भरताओं को बिल्कुल संशोधित नहीं करना चाहूंगा, क्योंकि मैं अपने आईओएस परियोजनाओं के लिए कोकोपोड्स का उपयोग कर रहा हूं। –

1

मैं XCode का उपयोग नहीं करते, लेकिन मेरे लिए निम्नलिखित काम करता है लिनक्स में स्कैन-निर्माण का उपयोग कर। मैं अपना मामला, मैं सभी पहली पार्टी, गैर-जेनरेट कोड पर स्थिर विश्लेषण चलाने के लिए चाहता हूं। हालांकि, मैं इसे तीसरे_party कोड और जेनरेट कोड पर चलाने से बचना चाहता हूं।

कमांड लाइन पर, क्लैंग-विश्लेषक को निर्माण में लगाया जाता है जब स्कैन-बिल्ड सीसी और सीईओ पर्यावरण परिवेश सीसीसी-विश्लेषक और सी ++ - विश्लेषक स्थानों को सेट करता है। मैंने ccc-analyzer.py और C++ - analyzer.py नामक दो सरल स्क्रिप्ट लिखीं और उन्हें डिफॉल्ट के स्थान पर संकलन में लगा दिया। इन रैपर स्क्रिप्ट में, मैंने बस फ़ाइल को संकलित करने के पथ को देखा और फिर कच्चे कंपाइलर को सीधे चलाया (यदि मैं स्थैतिक विश्लेषण से बचना चाहता हूं) या सी * -एनालिज़र (यदि मैं स्थिर विश्लेषण के लिए चाहता हूं)। मेरे स्क्रिप्ट अजगर में है और मेरी विशिष्ट निर्माण प्रणाली से बंधा है, लेकिन एक उदाहरण की जरूरत है कि संशोधन के रूप में:

import subprocess 
import sys 

def main(argv): 
    is_third_party_code = False 
    for i in range(len(argv)): 
    arg = argv[i] 
    if arg == '-c': 
     file_to_compile = argv[i + 1] 
     if '/third_party/' in file_to_compile or \ 
      file_to_compile.startswith('gen/'): 
     is_third_party_code = True 
     break 
    if is_third_party_code: 
    argv[0] = '/samegoal/bin/clang++' 
    else: 
    argv[0] = '/samegoal/scan-build/c++-analyzer' 
    return subprocess.call(argv) 

if __name__ == '__main__': 
    sys.exit(main(sys.argv))