|
|
1
1
我在书中第一次遇到的解决方案
Writing Solid Code
,是要“包装”的
首先,诊断
稍后,当指针从
使用内存保护保护保护页而不是sentinel模式检测缓冲区溢出是有好处的。特别是,使用基于模式的方法,只有在事实发生后才检测到非法内存访问。Sentinel模式方法只检测到非法写入。内存保护方法捕获非法的读和写,并在它们发生时立即检测到它们。
的诊断包装函数
特别是,诊断包装器可以记录所有分配和释放的块,并在程序退出时报告内存泄漏。内存泄漏是由程序执行期间未释放而分配的块。
包装时
包装这些函数的典型方法是通过预处理器宏: #define malloc(s) diagnostic_malloc(s, __FILE__, __LINE__) /* etc.... */
如果需要对标准实现的调用进行编码(例如,分配的块将传递给第三方、仅限二进制的库,该库希望使用标准释放块
|
|
|
2
1
您可以尝试使用virtuaalloc分配足够的页面+1,使用virtualprotect和上一页的page_readonly_page_guard标志,然后对齐可疑的分配,使对象的结尾接近受保护页的开头。如果一切正常,那么在访问保护页时,应该会出现访问冲突。如果您大致知道哪个分配被覆盖,这将有所帮助。否则,它需要覆盖可能需要大量额外内存的所有分配(每个分配至少2页)。我在这里命名为“统计页面保护”的这种技术的一个变化是,仅以这种方式随机分配内存以获得相对较小的分配百分比,以避免小对象出现大的膨胀。在大量的执行运行中,您应该能够命中错误。在这种情况下,随机数生成器必须以类似时间的方式播种。类似地,如果怀疑在较低的地址覆盖,可以在对象前面分配保护页(不能同时执行这两项操作,但也可能随机混淆)。 更新:原来gflags.exe(以前是pageheap.exe)微软实用程序已经支持“统计页面保护”,所以我重新设计了控制盘:)你只需要运行gflags.exe/p/enable[/random 0-100]你的application.exe并运行你的应用程序。如果在堆分配中使用自定义堆或自定义保护,那么您可以简单地切换到使用heapalloc,至少是为了捕获错误,然后切换回。gflgs.exe是支持工具包的一部分,可以从Microsoft下载中心下载,只需在那里搜索即可。 |
|
|
3
0
电脑线头可能会遇到一些形式的malloc/新的尺寸问题,但我不确定它是否会找到你的。 VS2005在调试模式下(在函数末尾运行)对堆栈对象具有良好的缓冲区溢出检查功能。它会定期检查堆。 至于它帮助跟踪问题发生的位置,我倾向于从这里开始使用宏来转储所有分配,以便稍后(在检测到损坏的内存时)与之匹配。 痛苦的过程,所以我也渴望学习更好的方法。 |
|
4
0
考虑我们 Memory Safety Check . 我想它会抓住你描述的所有错误。是的,它是运行时检查 每一个 访问,有相当大的开销(不像我们认为的valgrind那么糟糕),有利于诊断第一个错误的程序操作。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |