时间:2021-05-02
c#调用C++DLL代码,发现了一个隐藏很深的问题。 危害很大,而且不易察觉。
大概是申明c++的函数时候,有一个long类型的指针。在C#中我的申明成了这样:
public extern void Method(ref uint para);
最初怎么也没有发现这里面有什么问题,知道这个隐藏的问题暴露出来,把前面申明的一个变量改变了, 我才恍然大悟。
复制代码 代码如下:
在调用Method这里下断点,p的值是分配的一个内存地址。F10跳过Method,p指针就指向了0x00000000!!;
初步分析,是在栈上只给test分配了4个字节存放值,结果通过互操作返回了8个字节的值,就把紧挨着的存放p指针地址的4个字节占用了,恰好这四个字节又是高位,返回数据的高位都是0。 以前了解过c++的栈内存溢出,没想到在c#里被我遇到了,问题看似不大,如何被恰好相邻的四个字节是返回地址,说不定危害不小啊!! 看来c#的互操作还是得小心为好。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
首先引起对这个溢出问题进行研究是因为看到一个朋友的帖子,里面提到ie7下出现的文字溢出问题;于是又重新翻了以前怿飞斑竹的帖子,他提到的是注释引起的文字溢出问题,
sprintf是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误。下面对sprintf常出错误问题进行简单的总结:1、缓冲区溢出
一、引言 这个系列是在C#基础知识中遗留下来的一个系列的,因为在C#4.0中的一个新特性就是对COM互操作改进,然而COM互操作性却是.NET平台下其中一种互
C#学习笔记-浅谈数组复制,排序,取段,元组usingSystem;usingSystem.Collections.Generic;namespaceAppli
c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managedmemory,大部分时候我