淺談C#互操作的內存溢出成績。本站提示廣大學習愛好者:(淺談C#互操作的內存溢出成績)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談C#互操作的內存溢出成績正文
c#挪用C++DLL代碼,發明了一個隱蔽很深的成績。 傷害很年夜,並且不容易發覺。
年夜概是聲名c++的函數時刻,有一個long類型的指針。在C#中我的聲名成了如許:
public extern void Method(ref uint para);
最後怎樣也沒有發明這外面有甚麼成績,曉得這個隱蔽的成績裸露出來,把後面聲名的一個變量轉變了, 我才豁然開朗。
uint test = 0;
int *p = new IntPtr();
Method(ref test);
在挪用Method這裡下斷點,p的值是分派的一個內存地址。F10跳過Method,p指針就指向了0x00000000!!;
初步剖析,是在棧上只給test分派了4個字節寄存值,成果經由過程互操作前往了8個字節的值,就把緊挨著的寄存p指針地址的4個字節占用了,正好這四個字節又是高位,前往數據的高位都是0。 之前懂得過c++的棧內存溢出,沒想到在c#裡被我碰到了,成績看似不年夜,若何被正好相鄰的四個字節是前往地址,說不定傷害不小啊!! 看來c#的互操作照樣得當心為好。