2012-05-12 11 views
18

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

उत्तर

15

यह JVM Specification: Chapter 4.10. Verification of class Files में निर्दिष्ट है।

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

अन्य बातों के यह सत्यापित करता है शामिल हैं, लेकिन निम्नलिखित तक सीमित नहीं है:

  • शाखाओं विधि के लिए कोड सरणी की सीमा के भीतर होना चाहिए।

  • सभी नियंत्रण-प्रवाह निर्देशों के लक्ष्य प्रत्येक निर्देश की शुरुआत हैं। विस्तृत निर्देश के मामले में, विस्तृत ऑपोड को निर्देश की शुरुआत माना जाता है, और उस विस्तृत निर्देश द्वारा संशोधित ऑपरेशन देने वाले ऑपोड को निर्देश शुरू करने के लिए नहीं माना जाता है। निर्देश के बीच में शाखाओं को अस्वीकार कर दिया गया है।

  • कोई भी निर्देश स्थानीय वैरिएबल की संख्या से अधिक या उसके बराबर किसी इंडेक्स पर स्थानीय चर को एक्सेस या संशोधित नहीं कर सकता है, जिसकी विधि यह आवंटित करती है।

  • निरंतर पूल के सभी संदर्भ उपयुक्त प्रकार की प्रविष्टि के लिए होना चाहिए। (उदाहरण के लिए, निर्देश गेटफील्ड को एक फ़ील्ड का संदर्भ देना चाहिए।)

  • कोड निर्देश के मध्य में समाप्त नहीं होता है।

  • निष्पादन कोड के अंत से नहीं गिर सकता है।

  • प्रत्येक अपवाद हैंडलर के लिए, हैंडलर द्वारा संरक्षित कोड का प्रारंभिक और समापन बिंदु निर्देश की शुरुआत में होना चाहिए या अंतिम बिंदु के मामले में, कोड के अंत से तुरंत होना चाहिए। शुरुआती बिंदु अंतिम बिंदु से पहले होना चाहिए। अपवाद हैंडलर कोड एक वैध निर्देश पर शुरू होना चाहिए, और इसे विस्तृत निर्देश द्वारा संशोधित एक ऑपोड में प्रारंभ नहीं होना चाहिए।

एक अंतिम कदम के रूप में सत्यापनकर्ता भी एक डेटा प्रवाह विश्लेषण, जो सुनिश्चित करें कि कोई अनुदेश संदर्भ किसी भी अप्रारंभीकृत स्थानीय चर बनाता प्रदर्शन करती है।

+0

क्या स्थानीय सत्यापन प्रणाली से कक्षाएं लोड करते समय जावा सत्यापनकर्ता सक्षम है? उदाहरण के लिए जब ग्रहण या अपाचे कक्षा को लोड करता है, तो क्या बाइटकोड सत्यापित है? –

2

यह करता है निम्नलिखित:

  • कोई ऑपरैंड ढेर अतिप्रवाह हैं या underflows
  • सभी बाईटकोड निर्देश के मापदंडों के प्रकार हमेशा होने की सही
  • वस्तु क्षेत्र पहुंच रहे हैं जाना जाता है कानूनी - निजी, सार्वजनिक, या संरक्षित

संदर्भ: http://java.sun.com/docs/white/langenv/Security.doc3.html

7

वैकल्पिक रूप से आप जेम्स गोस्लिंग द्वारा Java Language Environment श्वेत पत्र पर एक नज़र डालना चाहेंगे।

enter image description here

बाईटकोड सत्यापनकर्ता bytecodes को पार करता, प्रकार राज्य सूचना का निर्माण करती है, और सभी बाईटकोड निर्देशों के मापदंडों के प्रकार पुष्टि करता है।

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

  • कोई संकार्य ढेर अतिप्रवाह रहे हैं या underflows
  • सभी बाईटकोड निर्देश के मापदंडों के प्रकार हमेशा सही होने के लिए जाना जाता है
  • वस्तु क्षेत्र पहुंच कानूनी माना जाता है - निजी, सार्वजनिक, या

यह सब जाँच पीड़ा विस्तृत प्रतीत होता है की रक्षा की, समय से बाईटकोड सत्यापनकर्ता अपने काम किया है, जावा int erpreter आगे बढ़ सकता है, यह जानकर कि कोड सुरक्षित रूप से चलाएगा। इन गुणों को जानना जावा दुभाषिया को बहुत तेज बनाता है, क्योंकि यह को कुछ भी जांचना नहीं है। कोई ऑपरेंड प्रकार चेक नहीं है और कोई स्टैक अतिप्रवाह चेक नहीं है। इस प्रकार दुभाषिया विश्वसनीयता की समझौता किए बिना पूर्ण गति पर कार्य कर सकता है।

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