2012-11-07 15 views
6

मेरे पास कुछ कस्टम आईएल मैंने लिखा है और यह PEVerify पास नहीं करेगा। मुझे मिली त्रुटियह .Net IL क्यों सत्यापित नहीं है?

 
$ peverify foo.exe 

Microsoft (R) .NET Framework PE Verifier. Version 4.0.30319.17929 
Copyright (c) Microsoft Corporation. All rights reserved. 

[IL]: Error: [Z:\virtualbox_shared\foo.exe : HelloWorld.Program::Main][offset 0x00000021] Stack height at all points must be determinable in a single forward scan of IL. 
1 Error(s) Verifying foo.exe 

प्रोग्राम हालांकि किसी भी अपवाद के बिना ठीक चलाएगा।

.method private static hidebysig 
    default void Main (string[] args) cil managed 
{ 
// Method begins at RVA 0x2050 
.entrypoint 
// Code size 54 (0x36) 
.maxstack 2 

//custom IL 
ldc.i4 1 
ldc.i4 1 
ceq 
switch(first, second) 

first: 
ldc.i4 1 
br.s temp 
popit: pop 
br.s second 

temp: ldc.i4 1 
brfalse temp2 
temp2: br.s popit 

second: 
ldc.i4 2 
pop 

ret 

} // end of method Program::Main 

पूर्ण स्रोत कोड pastebin

पर है मैं इस त्रुटि क्यों मिल रही: यहाँ प्रासंगिक विधि के आईएल है?

+0

मैं तर्क को पूरी तरह से समझ नहीं पा रहा हूं, लेकिन यह 1.7.5 पिछड़ा शाखा नियंत्रण से संबंधित दिखता है (http://books.google.com/books?id=50PhgS8vjhwC&pg=PA500&lpg=PA500&dq=1.7.5+ बैकवर्ड + शाखा + बाधाएं और स्रोत = बीएल और ओटीएस = vZJvWiy5mP और sig = SGz2IS1A4ynarLdB5aMg2ZGQ16g और hl = en & sa = X और ei = b5KaUOzZNuHWiwK87IGgCw और ved = 0CFYQ6AEwBQ # v = onepage और q और f = false) – Prescott

+0

@ प्रिस्कॉट मैं वास्तव में यहां आवेदन करने के रूप में नहीं देख रहा हूं। [This] (http://pastebin.com/YSPY5szf) कोड पर एक नज़र डालें जो सत्यापन पास करता है। (विशेष रूप से, IL_0018 लेबल) – Earlz

उत्तर

6

है कि आईएल

की एक एकल आगे स्कैन में निर्धारण किया जाना चाहिए सत्यापन विफलता का मुख्य हिस्सा। सत्यापनकर्ता प्रत्येक एकल शाखा पथ को सत्यापित करने का प्रयास नहीं करता है, जिसे हलिंग समस्या को हल करने की आवश्यकता होगी। यह पीओपी के बारे में नाखुश है, यह में एक एकल आगे स्कैन में नहीं देख सकता है कि यह ऑपोड पिछली शाखा द्वारा एक खाली खाली स्टैक के साथ पहुंचा है और इसलिए मान्य है।

+0

तो ऐसा लगता है कि मेरा "वर्कअराउंड" केवल माइक्रोसॉफ्ट के उत्थान को पारित करने के लिए होता है। ईसीएमए स्पेक के विभाजन III 1.7.5 में देख रहे हैं यह कोड पूरी तरह गैर-अनुरूप है। मुझे लगता है कि इस मामले में स्थानीय चर का उपयोग स्टैक – Earlz

+1

के बजाय किया जाना चाहिए, यही वास्तविक कंपाइलर करेगा, हां। –

0

मैं पूरी तरह से समझ में नहीं आता क्यों इस सवाल का जवाब है, लेकिन इस PEVerify को यह कारण:

.method private static hidebysig 
    default void Main (string[] args) cil managed 
{ 
// Method begins at RVA 0x2050 
.entrypoint 
// Code size 54 (0x36) 
.maxstack 2 

//custom IL 
ldc.i4 1 
ldc.i4 1 
ceq 
switch(first, second) 

first: 
ldc.i4 1 
br.s temp 
ldc.i4 1 //not reached, but required! 
popit: pop 
br.s second 

temp: ldc.i4 1 
brfalse temp2 
temp2: br.s popit 

second: 
ldc.i4 2 
pop 

ret 

} // end of method Program::Main 
संबंधित मुद्दे