当前位置: 首页 > news >正文

免费建一个自己的网站网站QQ互联教程

免费建一个自己的网站,网站QQ互联教程,万网部署wordpress发不出邮件,郴州seo网络优化应用 AddressSanitizer 发现程序内存错误作为 C/ C 工程师#xff0c;在开发过程中会遇到各类问题#xff0c;最常见便是内存使用问题#xff0c;比如#xff0c;越界#xff0c;泄漏。过去常用的工具是 Valgrind#xff0c;但使用 Valgrind 最大问题是它会极大地降低程序…应用 AddressSanitizer 发现程序内存错误作为 C/ C 工程师在开发过程中会遇到各类问题最常见便是内存使用问题比如越界泄漏。过去常用的工具是 Valgrind但使用 Valgrind 最大问题是它会极大地降低程序运行的速度初步估计会降低 10 倍运行速度。而 Google 开发的 AddressSanitizer 这个工具很好地解决了 Valgrind 带来性能损失问题它非常快只拖慢程序 2 倍速度。AddressSanitizer 概述AddressSanitizer 是一个基于编译器的测试工具可在运行时检测 C/C 代码中的多种内存错误。严格上来说AddressSanitizer 是一个编译器插件它分为两个模块一个是编译器的 instrumentation 模块一个是用来替换 malloc/free 的动态库。Instrumentation 主要是针对在 llvm 编译器级别对访问内存的操作storeloadalloc等将它们进行处理。动态库主要提供一些运行时的复杂的功能比如 poison/unpoison shadow memory以及将 malloc/free 等系统调用函数 hook 住。AddressSanitizer 基本使用根据 AddressSanitizer Wiki 可以检测下面这些内存错误 - Use after free访问堆上已经被释放的内存 - Heap buffer overflow堆上缓冲区访问溢出 - Stack buffer overflow栈上缓冲区访问溢出 - Global buffer overflow全局缓冲区访问溢出 - Use after return访问栈上已被释放的内存 - Use after scope栈对象使用超过定义范围 - Initialization order bugs初始化命令错误 - Memory leaks内存泄漏这里我只简单地介绍下基本的使用详细的使用文档可以看官方的编译器使用文档比如 Clang 的文档https://clang.llvm.org/docs/AddressSanitizer.htmlUse after free 实践例子下面这段代码是一个很简单的 Use after free 的例子//use_after_free.cpp #include iostream int main(int argc, char **argv) {int *array new int[100];delete [] array;std::cout array[0] std::endl;return 1; } 编译代码并且运行这里可以看到只需要在编译的时候带上 -fsanitizeaddress 选项就可以了。clang -O -g -fsanitizeaddress ./use_after_free.cpp ./a.out最终我们会看到如下的输出10960ERROR: AddressSanitizer: heap-use-after-free on address 0x614000000040 at pc 0x00010d471df0 bp 0x7ffee278e6b0 sp 0x7ffee278e6a8 READ of size 4 at 0x614000000040 thread T0#0 0x10d471def in main use_after_free.cpp:6#1 0x7fff732c17fc in start (libdyld.dylib:x86_640x1a7fc)0x614000000040 is located 0 bytes inside of 400-byte region [0x614000000040,0x6140000001d0) freed by thread T0 here:#0 0x10d4ccced in wrap__ZdaPv (libclang_rt.asan_osx_dynamic.dylib:x86_64h0x51ced)#1 0x10d471ca1 in main use_after_free.cpp:5#2 0x7fff732c17fc in start (libdyld.dylib:x86_640x1a7fc)previously allocated by thread T0 here:#0 0x10d4cc8dd in wrap__Znam (libclang_rt.asan_osx_dynamic.dylib:x86_64h0x518dd)#1 0x10d471c96 in main use_after_free.cpp:4#2 0x7fff732c17fc in start (libdyld.dylib:x86_640x1a7fc)SUMMARY: AddressSanitizer: heap-use-after-free use_after_free.cpp:6 in main可以看到一目了然非常清楚的告诉了我们在哪一行内存被释放而又在哪一行内存再次被使用。还有一个是内存泄漏比如下面的代码显然 p 所指的内存没有被释放。void *p;int main() {p malloc(7);p 0; // The memory is leaked here.return 0; }编译然后运行clang -fsanitizeaddress -g ./leak.c ./a.out可以看到如下的结果 17756ERROR: LeakSanitizer: detected memory leaksDirect leak of 7 byte(s) in 1 object(s) allocated from:#0 0x4ffc80 in malloc (/home/simon.liu/workspace/a.out0x4ffc80)#1 0x534ab8 in main /home/simon.liu/workspace/./leak.c:4:8#2 0x7f127c42af42 in __libc_start_main (/usr/lib64/libc.so.60x23f42)SUMMARY: AddressSanitizer: 7 byte(s) leaked in 1 allocation(s).不过这里要注意内存泄漏的检测只会在程序最后退出之前进行检测也就是说如果你在运行时如果不断地分配内存然后在退出的时候对内存进行释放AddressSanitizer 将不会检测到内存泄漏这种时候可能你就需要另外的工具了 JeMalloc / TCMalloc。AddressSanitizer 基本原理这里简单介绍一下 AddressSanitizer 的实现更详细的算法实现可以看《AddressSanitizer: a fast address sanity checker》https://www.usenix.org/system/files/conference/atc12/atc12-final39.pdfAddressSanitizer 会替换你的所有 malloc 以及 free然后已经被分配malloc的内存区域的前后会被标记为 poisoned 主要是为了处理 overflow 这种情况)而释放free的内存会被标记为 poisoned主要是为了处理 Use after free。你的代码中的每一次的内存存取都会被编译器做类似下面的翻译.before:*address ...; // or: ... *address;after:shadow_address MemToShadow(address); if (ShadowIsPoisoned(shadow_address)) {ReportError(address, kAccessSize, kIsWrite); } *address ...; // or: ... *address;这里可以看到首先会对内存地址有一个翻译MemToShadow的过程然后再来判断当所访问的内存区域是否为 poisoned如果是则直接报错并退出。这里之所以会有这个翻译是因为 AddressSanitizer 将虚拟内存分为了两部分Main application memoryMem也就是被当前程序自身使用的内存Shadow memory 简单来说就是保存了主存元信息的一块内存比如主存的那些区域被 posioned 都是在 Shadow memory 中保存的AddressSanitizer 和其他内存检测工具对比下图是 AddressSanitizer 与其他的一些内存检测工具的对比:参数说明DBI: dynamic binary instrumentation动态二进制插桩CTI: compile-time instrumentation 编译时插桩UMR: uninitialized memory reads 读取未初始化的内存UAF: use-after-free (aka dangling pointer) 使用释放后的内存UAR: use-after-return 使用返回后的值OOB: out-of-bounds 溢出x86: includes 32- and 64-bit.可以看到相比于 ValgrindAddressSanitizer 只会拖慢程序 2 倍运行速度。当前 AddressSanitizer 支持 GCC 以及 Clang其中 GCC 是从 4.8 开始支持而 Clang 的话是从 3.1 开始支持。AddressSanitizer 的使用注意事项AddressSanitizer 在发现内存访问违规时应用程序并不会自动崩溃。这是由于在使用模糊测试工具时它们通常都是通过检查返回码来检测这种错误。当然我们也可以在模糊测试进行之前通过将环境变量 ASAN_OPTIONS 修改成如下形式来迫使软件崩溃export ASAN_OPTIONSabort_on_error1/AddressSanitizer 需要相当大的虚拟内存大约 20 TB不用担心这个只是虚拟内存你仍可以使用你的应用程序。但像 american fuzzy lop 这样的模糊测试工具就会对模糊化的软件使用内存进行限制不过你仍可以通过禁用内存限制来解决该问题。唯一需要注意的就是这会带来一些风险测试样本可能会导致应用程序分配大量的内存进而导致系统不稳定或者其他应用程序崩溃。因此在进行一些重要的模糊测试时不要去尝试在同一个系统上禁用内存限制。在 Nebula Graph 中开启 AddressSanitizer我们在 Nebula Graph 中也使用了 AddressSanitizer它帮助我们发现了非常多的问题。而在 Nebula Graph 中开启 AddressSanitizer 很简单只需要在 Cmake 的时候带上打开 ENABLE_ASAN 这个 Option 就可以比如:Cmake -DENABLE_ASANOn这里建议所有的开发者在开发完毕功能运行单元测试的时候都打开 AddressSanitizer 来运行单元测试这样可以发现很多不容易发现的内存问题节省很多调试的时间。附录Nebula Graph一个开源的分布式图数据库GitHubhttps://github.com/vesoft-inc/nebula官方博客https://nebula-graph.io/cn/posts/微博weibo.com/nebulagraph推荐阅读Jepsen 测试框架在图数据库 Nebula Graph 中的实践
http://www.huolong8.cn/news/311495/

相关文章:

  • 惠州网站小程序建设手机动画制作软件app
  • 外贸网站建设收款通道有找猎聘网站做简历优化的
  • 网站的折线图怎么做如何借用别人静态网站做模板
  • 免费电子商务网站模板网站字体加载不出来怎么办
  • 郑州 网站 公司网站是先解析后备案
  • 建设网站自学搬瓦工做网站方法
  • 做网站公司的未来网站问题解决
  • 电脑网站制作wordpress 500错误解决
  • 物流企业网站有哪些在那个网站做推广实用
  • 设计一个个人求职网站广东佛山建网站
  • 进行网站建设的上市公司高端网站设计报价
  • 怎么建立企业网站平台做公众号的网站有哪些
  • 电子商务网站体系结构有哪些?在网上做黑彩网站会怎样
  • 西安市阎良区建设局网站网页制作基础课件
  • 苏州做网站平台代码审计wordpress
  • 山西省建设监理协会网-官方网站石家庄房产信息网查询系统
  • 成都优化网站建设沈阳seo推广公司
  • 南安网站定制网络产品营销策略范文
  • 企业电子商务网站设计的原则网站目录做301
  • 做网站运营工资是不是很低网站不被百度收录
  • 网站设计说明书怎么写我想学网站建设
  • 网站的构建百度网页版下载安装
  • 网站建设方案新闻室内空间设计
  • 花都营销型网站建设公司seo俱乐部
  • 网站加速 wordpress苏州百度推广分公司电话
  • 织梦怎么做门户网站在线seo诊断
  • 实验室网站建设的意义做网站能设置关键词在百度中搜索到
  • 网站开发与管理郴州本地网站建设
  • 中明建投建设集团 网站中国建设银行网站进不去
  • 保定的网站建设asp网站文章自动更新