2008-09-08 24 views
57

स्थिर विश्लेषण के लिए many विकल्प हैं, और यह एक गर्म विषय है, इसलिए:स्थिर कोड विश्लेषण क्या है?

स्थिर विश्लेषण क्या है?

आपको इसका उपयोग कब करना चाहिए, और इसका उपयोग कब नहीं किया जाना चाहिए?

स्थिर विश्लेषण के उचित और अनुचित उपयोग/आवेदन के संबंध में संभावित गठिया क्या हैं?

कोई भी भाषा जिसके पास एक अच्छा स्थैतिक विश्लेषण उपकरण नहीं है, और जब आप स्वचालित विश्लेषण के लिए विकल्प नहीं रखते हैं तो आप क्या करते हैं?

-Adam

उत्तर

84

What is static analysis?

का विश्लेषण यह क्रियान्वित करने के बिना कोड। आमतौर पर बग खोजने या कोडिंग दिशानिर्देशों के अनुरूप होने के लिए उपयोग किया जाता है। क्लासिक उदाहरण एक कंपाइलर है जो लेक्सिकल, सिंटैक्टिक और यहां तक ​​कि कुछ अर्थपूर्ण गलतियों को भी पाता है।

When should you use it, and when shouldn't it be used?

स्थिर गुणवत्ता उपकरण का उपयोग तब किया जाना चाहिए जब वे कोड गुणवत्ता बनाए रखने में मदद करें। यदि उनका उपयोग किया जाता है, तो उन्हें निर्माण प्रक्रिया में एकीकृत किया जाना चाहिए, अन्यथा उन्हें अनदेखा कर दिया जाएगा।

What are potential gotchas regarding proper and improper usage/application of static analysis?

दो आम विकृतियों होते हैं जब स्थिर विश्लेषण उपकरण का उपयोग कर:

  1. उपकरण नकली चेतावनी/त्रुटियों का उत्पादन कि डेवलपर्स चुप्पी नहीं कर सकता। आखिरकार, अधिकांश चेतावनियां नकली हैं और डेवलपर्स आउटपुट पर ध्यान देना बंद कर देते हैं। यही कारण है कि कई टीमों को उस कोड को साफ-सुथरा करने की आवश्यकता होती है। यदि डेवलपर्स कंपाइलर चेतावनियों को अनदेखा करते हुए सहज महसूस करते हैं, तो संकलन चरण अंततः चेतावनी से भर जाएगा, भले ही वे कभी भी ध्यान न दें, भले ही वे बग हो।

  2. उपकरण चलाने के लिए बहुत अधिक समय लेते हैं और डेवलपर्स कभी भी उन्हें चलाने के लिए परेशान नहीं होते हैं।

Any languages that don't have a good static analysis tool, and what do you do when you don't have an option for automated analysis?

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

+6

"यूनिट परीक्षण जो (सैद्धांतिक रूप से) साबित करता है कि कोड वास्तव में काम करता है।" पेडेंट नहीं होना चाहिए (ओह, ठीक है, एक पेडेंट होने के लिए), यूनिट परीक्षण कुछ भी "सिद्ध" नहीं करते हैं, यहां तक ​​कि "सैद्धांतिक रूप से" भी नहीं। टेस्ट शुद्धता में विश्वास पैदा करते हैं, लेकिन वे –

+1

के हर व्यवहार को संभवतः कवर नहीं कर सकते हैं "उन्हें निर्माण प्रक्रिया में एकीकृत किया जाना चाहिए" सहमत हैं। हालांकि, डीबग और रिलीज बनाता है, या एक या दूसरे? –

+1

@ChrisConway Untrue; यदि आप किसी दिए गए आंशिक या कुल कार्य को कम करने के लिए व्यवस्थित सबूत या पूर्व/पोस्ट स्थितियों का उपयोग करते हैं, तो आप उन मामलों को पूरी तरह से साबित करने के लिए यूनिट परीक्षणों का उपयोग कर सकते हैं (और इसलिए एक अनिवार्य सबूत है कि कोड जो करता है वह करता है)। हालांकि कार्यों के दौरान कई बड़े पैमाने या मूल्यों के लिए यह आसान नहीं है, सैद्धांतिक रूप से और व्यावहारिक रूप से यह निश्चित रूप से संभव है। – Alice

2

स्थिर विश्लेषण संभावित समस्याओं के लिए स्रोत-कोड देख रहा है। इसे स्थिर कहा जाता है क्योंकि कोड को हल करने के लिए कोड निष्पादित नहीं किया जाता है, स्रोत का विश्लेषण विश्लेषणात्मक रूप से किया जाता है।

फिलहाल, स्थिर विश्लेषण बहुत अपरिपक्व है। अधिकांश टूल केवल बग्स का सबसे बेवकूफ पाते हैं। उदाहरण के लिए, कोई भी उपकरण जो मुझे पता है, सभी शून्य सूचक विकृतियां पा सकता है, फिर भी यह एक स्पष्ट बग है जिसे आप स्थिर विश्लेषण के साथ लक्षित करना चाहते हैं। आप कम से कम पल के लिए स्थिर विश्लेषण के साथ दौड़ की स्थिति जैसे कठिन बग खोजने की कोशिश करना भूल सकते हैं।

स्टेटिक विश्लेषण कोडिंग मानकों को लागू करने के लिए विशेष रूप से उपयोगी है। एफएक्सकॉप, जो .NET कोड का विश्लेषण करता है, में कोडिंग मानकों के दोषों के सभी प्रकार के नियम शामिल हैं।

जैसा कि आप कहते हैं, ऐसे कई टूल हैं जो स्थिर विश्लेषण करते हैं।

  • FindBugs (जावा)
  • FxCop (.NET)
  • PyLint (अजगर)

मैं उन सभी को सिफारिश कर सकते हैं: यहाँ है कि मैं व्यक्तिगत रूप से इस्तेमाल किया है मुक्त उत्पादों की एक सूची है ।

+1

स्टेटिक विश्लेषण वास्तव में स्रोत कोड को देखने की आवश्यकता नहीं है। यह ऑब्जेक्ट या इंटरमीडिएट कोड को अच्छी तरह से देख सकता है। उदाहरण के लिए, आप FindBugs का उल्लेख करते हैं जो कक्षा (बाइटकोड) फ़ाइलों को देखता है। –

+2

स्टेटिक विश्लेषण, अपरिपक्व? मैंने देखा है कि आपने कभी भी इंटेलिजे आईडीईए का उपयोग नहीं किया ...; ^) –

+2

हां, टॉम रेप्स ने पिछले हफ्ते स्टैनफोर्ड में मशीन कोड के स्थिर विश्लेषण पर http://www.s.wisc.edu/wpis/abstracts/wysinwyx पर एक वार्ता दी थी। submission.abs.html। स्रोत में दिखाई देने वाली भेद्यता के उदाहरण के लिए, देखें, , , और । –

0

आपके कोड में बग खोजने के अलावा (जैसे गारंटीकृत शून्य सूचक डीरेंसिंग, अनंत लूप, आदि), स्थिर विश्लेषण कोड के सुरक्षा विश्लेषण के लिए उपयोग किया जा सकता है। मैं फोर्टिफ़ाई सॉफ़्टवेयर के ब्रायन शतरंज से "Secure Programming with Static Analysis" प्रस्तुति को देखने की अत्यधिक अनुशंसा करता हूं। (उपकरण सिफारिशों के साथ प्रत्येक) स्थिर विश्लेषण पर

1

स्टेटिक विश्लेषण (स्थिर कोड विश्लेषण, स्रोत कोड विश्लेषण, स्थिर प्रोग्राम विश्लेषण के रूप में भी जाना जाता है) एक सॉफ्टवेयर सत्यापन गतिविधि है जिसमें स्रोत कोड का गुणवत्ता, सुरक्षा और सुरक्षा के लिए विश्लेषण किया जाता है। यह विश्लेषण सॉफ़्टवेयर डेवलपर्स और परीक्षकों को विभिन्न प्रकार की बग/त्रुटियों जैसे ओवरफ्लो, शून्य से विभाजित, स्मृति और सूचक त्रुटियों, रन-टाइम त्रुटियों और अन्य समस्याओं को पहचानने और निदान करने में सक्षम बनाता है।

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

परिष्कृत तकनीक जोड़े औपचारिक तरीकों के साथ स्थिर कोड विश्लेषण। औपचारिक तरीकों सैद्धांतिक कंप्यूटर विज्ञान मौलिक सिद्धांतों को सॉफ़्टवेयर में कठिन समस्याओं को हल करने के लिए लागू करते हैं, जैसे यह साबित करना कि सॉफ़्टवेयर रन-टाइम त्रुटि के साथ विफल नहीं होगा। स्थिर कोड विश्लेषण और औपचारिक तरीकों का संयोजन डेवलपर्स को त्रुटियों को खोजने में कठिनाई का पता लगाने और कुछ प्रकार की बग/त्रुटियों की अनुपस्थिति को साबित करने में सक्षम बनाता है। जैसे इन तकनीकों साबित कर सकते हैं कि कोड की निम्न पंक्ति शून्य रन-टाइम द्वारा विभाजन त्रुटि के साथ विफल कभी नहीं होगा:

int x, y; 
... 
x = x/(x - y); 

सामान्य, स्थिर विश्लेषण में विकास की प्रक्रिया में जल्दी इस्तेमाल किया जाना चाहिए, अधिमानतः इकाई परीक्षण से पहले। यह मजबूत कोड के विकास को सक्षम बनाता है। स्थिर मेट्रिक्स का उत्पादन करने और सॉफ्टवेयर की सुरक्षा और विश्वसनीयता के बारे में मार्गदर्शन प्रदान करने के लिए स्टेटिक विश्लेषण को बिल्ड सिस्टम के साथ जोड़ा जा सकता है। हालांकि, सामान्य रूप से स्थैतिक विश्लेषण के देर से उपयोग के लिए पहचाने गए मुद्दों को हल करने के लिए अधिक समय और संसाधन की आवश्यकता हो सकती है।

खुले स्रोत, अकादमिक और वाणिज्यिक स्थैतिक विश्लेषण उपकरण की एक किस्म उपलब्ध है। अधिकांश भाषाओं का समर्थन किया जाता है।निम्नलिखित लिंक

19

What is static analysis?

स्टेटिक विश्लेषण हमारे बारे में एक कार्यक्रम के सभी संभव फांसी तर्क करने की अनुमति देता है पर इस विषय के बारे में अधिक जानें। यह किसी भी निष्पादन के बारे में आश्वासन देता है, तैनाती से पहले, लेकिन वाणिज्यिक उपकरण डेवलपर भ्रम, झूठे सकारात्मक के साथ काम कर प्रयास की एक बहुत खर्च करते हैं, आदि

What are potential gotchas regarding proper and improper usage/application of static analysis?

मुख्य मुद्दा अमूर्त है। एब्स्ट्रक्शन हमें सभी संभावित रनों को स्केल और मॉडल करने देता है लेकिन परिशुद्धता और स्केलेबिलिटी को संतुलित करने की कोशिश कर रूढ़िवादी होना चाहिए। स्टेटिक विश्लेषण कपोल-कल्पना सफाई से डेवलपर कपोल-कल्पना

When should you use it, and when shouldn't it be used?

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

यहां प्रतीकात्मक निष्पादन का उपयोग करके स्टेटिक विश्लेषण का एक उदाहरण है जहां मुख्य विचार अज्ञात प्रतीकात्मक चर का उपयोग करके परीक्षण को सामान्य बनाना है मूल्यांकन जहां हम प्रतीकात्मक राज्यों को ट्रैक करते हैं। यदि निष्पादन पथ अज्ञात पर निर्भर करता है, तो हम प्रतीकात्मक निष्पादक निष्कर्ष निकालते हैं। प्रतीकात्मक निष्पादन के दौरान, हम यह निर्धारित करने की कोशिश कर रहे हैं कि कुछ सूत्र संतोषजनक हैं (उदाहरण के लिए एक विशेष कार्यक्रम बिंदु पहुंच योग्य है, सरणी पहुंच ए [i] सीमाओं से बाहर है? आदि)।

int a = α, b = β, c = γ; 
// symbolic 
int x = 0, y = 0, z = 0; 
if (a) { 
    x = -2; 
} 
if (b < 5) { 
    if (!a && c) { y = 1; } 
    z = 2; 
} 
assert(x+y+z!=3) 

और यह सरल कोड नमूने के विश्लेषण: Static code Analysis

यहाँ है कि स्थिर कोड विश्लेषण के लिए उपयोग किया जाता है श्रीमती/सैट समाधानकर्ताओं के लिए कुछ उपयोगी लिंक कर रहे हैं:

SAT solving, SMT solving and Program Verification

List of tools for Static Code Analysis

Symbolic Execution, SAT solving, SMT solving and Program Verification

Symbolic Execution Harvard CS252r

+0

मुझे लगता है कि यह दिखाता है कि "स्टेटिक एनालिसिस" का उपयोग विभिन्न लोगों द्वारा कई अलग-अलग चीज़ों के लिए किया जाता है। मेरे लिए, एसए इस बात का मिश्रण है कि हारून मैनेपा के उत्तर (http://stackoverflow.com/a/49731/11698) के साथ। –

+0

@ जीओ, उस आरेख में टिक और क्रॉस का क्या अर्थ है? – Pacerier

+0

@Pacerier ध्यान दें कि 'रेड क्रॉस के साथ उस विशिष्ट पथ पर' assert (x + y + z! = 3) ''गलत' हो जाता है। – BugShotGG

संबंधित मुद्दे