2013-01-09 40 views
15

मैं 64-बिट्स पर एक बड़ा डेल्फी कोड बेस अपनाने पर काम कर रहा हूं।डेल्फी 64-बिट: गलत कास्ट ढूंढना?

var 
    p1,p2 : pointer; 
begin 
    inc(Integer(p1),10); 
    p2 := Pointer(Integer(p1) + 42); 

मैं इन डाले मैं उनके साथ जगह ले ली है कहां मिल सकती है NativeInt-डाले बजाय उन्हें 64 में सही बनाने के लिए: कई मामलों में वहाँ लाइनों जहां संकेत इस के समान 32-बिट मूल्यों से/करने के लिए casted हैं कर रहे हैं बिट मोड

हालांकि मुझे यकीन नहीं है कि मैंने उन्हें सब कुछ पाया है। कभी-कभी कस्ट अधिक सूक्ष्म होते हैं, इसलिए स्ट्रिंग "पूर्णांक (" के लिए टेक्स्ट-सर्चिंग पर्याप्त नहीं है।

चूंकि "पूर्णांक (" 64-बिट में कास्ट विफल हो जाएगा यदि सूचक मान पूर्णांक की सीमा से ऊपर है टाइप करें मेरे पास एक विचार है: क्या होगा यदि मैं मेमोरी मैनेजर को 4 जीबी से ऊपर मेमोरी आवंटित करने के लिए मजबूर कर सकता हूं (तो पॉइंटर वैल्यू 32-बिट्स से अधिक का उपयोग कर रहे हैं)? तो मुझे रनटाइम त्रुटियां मिलेंगी और गलत तरीके से उन गांवों को आसानी से ढूंढ सकती हैं। क्या यह संभव है? या कोई भी किसी अन्य तकनीक की सिफारिश कर सकता है?

उत्तर

21

इन जानवरों को आपके द्वारा उपयोग की जाने वाली टेक्स्ट खोज के प्रकार को खोजने के लिए कोई जादू चाल नहीं है। यह वास्तव में अच्छा होगा अगर संकलक ने इस तरह के कलाकारों को चेतावनी दी हो। इसे बहुत निराशाजनक लगता है कि यह नहीं है।

जब आपको ऐसी समस्या मिलती है, तो NativeInt पर न बदलें। पॉइंटर्स को टाइप पॉइंटर्स के रूप में बदलें, और पॉइंटर अंकगणित का उपयोग करें।

var 
    p1, p2: PByte; 
.... 
inc(p1, 10); 
p2 := p2; 
inc(p2, 42); 

फिर आपका कोड हमेशा के लिए सुरक्षित रहेगा।

अभी भी कुछ स्थितियां हैं जहां आपको पूर्णांक में डालने की आवश्यकता है। उदाहरण के लिए SendMessage पर पते पारित करते समय। लेकिन इन्हें उचित रूप से WPARAM या LPARAM पर डालें।

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

हालांकि, यह केवल आपके मेमोरी मैनेजर द्वारा आवंटित स्मृति के लिए शीर्ष आवंटन को मजबूर करेगा। आपकी प्रक्रिया में अन्य मॉड्यूल नीचे की डिफ़ॉल्ट नीति का उपयोग करेंगे। आप उस डिफ़ॉल्ट नीति को बदलने के लिए मशीन विस्तृत सेटिंग सेट कर सकते हैं। HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference से REG_DWORD पर 0x100000 मान और रीबूट करें।

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

+2

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