Visual studio 2019 使用AddressSanitizer检查程序码

AddressSanitizer (ASan) 是一种编译器和执行时间技术,会以 零 误报来公开许多难以发现的 bug:

  • 配置/dealloc 不符和delete 类型不符
  • 配置太大而无法堆积
  • 溢位和 溢位
  • 免费且免费使用
  • 全域变数溢位
  • 堆积缓冲区溢位
  • 对齐的值对齐无效
  • memcpy和memcpy
  • 堆叠缓冲区溢 位和 下溢
  • 堆叠使用 并在范围後使用
  • 有害之後的记忆体使用量

安装 AddressSanitizer

从 Visual Studio 2019 16.9 版开始,Microsoft C/c + + 编译器 (MSVC) 和 IDE 支援AddressSanitizer

  1. 开启Visual studio installer

    更新或确认Visual studio版本
  2. 点选编辑
  3. 安装 ASan,预设已经安装好了,若没有可以在个别元件搜寻安装

使用 Visual Studio 中的 AddressSanitizer

先根据官网提供的source code建立一个CPP档案

// basic-global-overflow.cpp
#include <stdio.h>
int x[100];
int main() {
    #ifdef __SANITIZE_ADDRESS__
    printf("Address sanitizer enabled\n");
    #else
    printf("Address sanitizer not enabled\n");
    #endif
    printf("Hello!\n");
    x[100] = 5; // Boom!
    return 0;
}

设定ASan
专案属性 → C/C++ → 一般 → 启用[ASan] 选择

MSVS的 AddressSanitizer 已知问题 有开启ASan还需进行一些设定,才能正常使用
我的环境需要将 侦错资讯格式 设定成 ,才可以正常使用

测试范例

F5执行後显示错误讯息

0x007a9350 is located 0 bytes to the right of global variable 'x' defined in 'main.cpp:3:4' (0x7a91c0) of size 400
这边显示显示错误的地方

#0 0x7a1081 in main+0x61 (D:\temp\stdThreadPrj\Debug\stdThreadPrj.exe+0x401081)
这个部分可以参考 使用visual studio trace call stack的private function 来找到错误的位置

reference
[1] AddressSanitizer | Microsoft Docs


<<:  C# Console 用法整理

>>:  如何用笔电连线到HPE服务器

[Day28] Security

在网路世界中,安全永远是最最重要的事情,而云端安全当然也不例外。任何的安全问题都来自於人为的疏忽,部...

[Day27] grid-row-start / grid-row-end + grid-column-start / grid-column-end

如果想要控制网格项目的放置位置,就要知道怎麽定义项目放置的"行"与"列...

[Day8] Fun with HTML5 Canvas

[Day8] Fun with HTML5 Canvas Canvas 的运用 需要用到的技巧与练习...

全端开发者必懂的「产品设计」——全端开发者内功 IV

from Unsplash 为什麽工程师也要懂产品设计? 前面笔记提过,现代科技秒新分异、资讯爆炸...

Day.1 「工欲善其事,必先利其器!」—— 前言 与 介绍工具

Photo by Adi Goldstein on Unsplash 大家好 我是毛毛,因为这波疫...