clang记录

  • clang: C语言编译器,类似于gcc
  • clang++: C++编译器,类似于g++。clang++只是clang的一个别名。
  • lld: 链接器,类似于ld。但是默认不用它,默认用vc的link.exe。
  • clang-format:按照固定的规范格式化C/C++代码,非常智能。文档请见:http://clang.llvm.org/docs/ClangFormat.html
  • clang-modernize:把按照C++98标准写的代码,转成C++11标准的。文档请见:http://clang.llvm.org/extra/ModernizerUsage.html
  • llvm-as - LLVM 汇编器
  • llvm-dis - LLVM 反汇编器
  • opt - LLVM 优化器
  • llc - LLVM 静态编译器
  • lli - LLVM的字节码执行器(某些平台下支持JIT)
  • llvm-link - LLVM的字节码链接器
  • llvm-ar - LLVM的静态库打包器,类似unix的ar。
  • llvm-nm - 类似于unix的nm

    Sanitizer

    clang有一个王牌功能是sanitizer。它包含三种:AddressSanitizer、MemorySanitizer、ThreadSanitizer。AddressSanitizer和MemorySanitizer最初是google开发的,用于运行时检测C/C++程序中的内存错误。在编译的时候加上-fsanitizer参数,编译器就会在生成的代码中插入一些运行时检查。比如你可以拿下面的这段代码试下:

    #include <stdio.h> #include <string.h> int main(int argc,char* argv[]){ char buf[4]; strcpy(buf,argv[1]); printf("%s\n",buf); return 0; }

    它把命令行的第一个参数复制到一个临时的缓存区中,然后打印出来。

    这段代码有两个bug:

    1. 在访问argv的时候可能会越界。(用户执行时没有加任何参数)
    2. buf不够长,写入时可能会越界,这将会造成严重的安全漏洞。

    来,编译试下:

    C:>clang++ -fsanitize=address -o t.exe badcode.cpp -g3 -DDEBUG -D_DEBUG

    然后运行:

    C:>t 3 
    3

    C:>t 355 
    355

    C:>t 3554664 
    ================================================================= 
    ==4044==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x0024fd44 at 
    pc 0x1274038 bp 0xdeadbeef sp 0x24fbf0 
    WRITE of size 8 at 0x0024fd44 thread T0 
    #0 0x127404c wrap_strcpy c:\users\cm\documents\os\llvm-3.4\projects\compile 
    r-rt\lib\asan\asan_interceptors.cc:490 
    #1 0x12612a7 main+0x0x000002a7 
    #2 0x1278212 __tmainCRTStartup f:\dd\vctools\crt\crtw32\startup\crt0.c:255 
    #3 0x772d3369 BaseThreadInitThunk+0x0x00000011 
    #4 0x77ba9f71 RtlInitializeExceptionChain+0x0x00000062 
    #5 0x77ba9f44 RtlInitializeExceptionChain+0x0x00000035

    Address 0x0024fd44 is located in stack of thread T0 at offset 228 in frame 
    #0 0x126100f main+0x0x0000000f

    This frame has 4 object(s): 
    [32, 36) ” 
    [96, 100) ” 
    [160, 164) ” 
    [224, 228) ‘buf’ <== Memory access at offset 228 overflows this variable 
    HINT: this may be a false positive if your program uses some custom stack unwind 
    mechanism or swapcontext 
    (longjmp and C++ exceptions *are* supported) 
    SUMMARY: AddressSanitizer: stack-buffer-overflow ??:0 ?? 
    Shadow bytes around the buggy address: 
    0x20049f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    0x20049f60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    0x20049f70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    0x20049f80: 00 00 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1 
    0x20049f90: 04 f4 f4 f4 f2 f2 f2 f2 04 f4 f4 f4 f2 f2 f2 f2 
    =>0x20049fa0: 04 f4 f4 f4 f2 f2 f2 f2[04]f4 f4 f4 f3 f3 f3 f3 
    0x20049fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    0x20049fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    0x20049fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    0x20049fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    0x20049ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    Shadow byte legend (one shadow byte represents 8 application bytes): 
    Addressable: 00 
    Partially addressable: 01 02 03 04 05 06 07 
    Heap left redzone: fa 
    Heap right redzone: fb 
    Freed heap region: fd 
    Stack left redzone: f1 
    Stack mid redzone: f2 
    Stack right redzone: f3 
    Stack partial redzone: f4 
    Stack after return: f5 
    Stack use after scope: f8 
    Global redzone: f9 
    Global init order: f6 
    Poisoned by user: f7 
    ASan internal: fe 
    ==4044==ABORTING

    它会提前把错误检测出来,并终止程序。

    但是memory sanitizer目前在windows下还不能用。

时间: 2024-10-09 03:30:48

clang记录的相关文章

clang format 官方文档自定义参数介绍(中英文)

英文 Configuring Style in Code When using clang::format::reformat(...) functions, the format is specified by supplying the clang::format::FormatStyle structure. Configurable Format Style Options This section lists the supported style options. Value typ

错误记录1

linker command failed with exit code 1 (use -v to see invocation) 错误具体信息如下: Undefined symbols for architecture i386: "_OBJC_CLASS_$_VRGCalendarView", referenced from: objc-class-ref in InquirePlanViewController.o ld: symbol(s) not found for arch

在centos6.4上配置vim的一些零碎记录

上一篇日志已经step by step地实录了如何在本机mac上配置vim开发环境已经各种插件. 有了一定经验之后,把配置vim的环境到了实验室远程server上centos6.4的环境下配置,这台机器是内网服务器连外网比较麻烦. 主要就是多了server无法联网的条件,这个将来在公司配置开发机环境也是基本不能联网的,所以就当提前适应了吧. 这里把遇到的一些关键点记录下来,以便后个人后续查阅. 编译vim74 由于YouCompleteMe插件需要vim7.3高版本支持:而server上的vim

[转]基于clang插件的一种iOS包大小瘦身方案

转自:http://mp.weixin.qq.com/s?__biz=MzA3ODg4MDk0Ng==&mid=2651112856&idx=1&sn=b2c74c62a10b4c9a4e7538d1ad7eb739 iOS包瘦身,对于一般团队来说并不是优化的首要目标,但是对于一些安装包已经超限的团队来说非常关键.微信和阿里移动安全都分享过相关的内容,后者采用的是去除无用代码的思路,感兴趣的同学可以阅读: iOS瘦身之删除无用的mach-O文件 而本文则将这个思路发挥到了极致,欢迎

点滴记录——Ubuntu 14.04中安装Sublime Text 3并使用SublimeClang插件

转载请说明出处:http://blog.csdn.net/cywosp/article/details/32721011 Sublime Text是个跨平台的编辑器,支持Windows.Linux.Mac系统平台,支持各种语言的代码编辑,配合上对应的插件,话上点时间学习,你将会对它爱不释手,大大的提高你的编码效率.本文将讲解在Ubuntu 14.04系统中安装SublimeText 3,并配置SublimeClang插件来配置C/C++开发环境. 1. Sublime Text 3的下载安装 到

[原创]Nexus5 源码下载、编译、真机烧录过程记录

asop使用清华镜像源https://mirror.tuna.tsinghua.edu.cn/help/AOSP/ 一开始使用每月初始化包的方式因为无法搞定版本的问题,没能通过编译,无奈,老老实实一点点下载吧 1.源码下载 mkdir aosp cd aosp repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r1sh myrepo.sh 版本号,一定要选对,不然就要来回折腾,因为虽

vim 使用点滴记录

重新要在linux下学习了,很久没折腾vim了,以前的一些技巧都基本忘了,现在重新学习,一点点折腾,把过程记录下来.打造属于自己的vim. 条目按学习的时间顺序排序. 用了几天终端下的vim, 今天(140412)发现gvim更漂亮而且更好用, 特别是换了 Consolas字体之后, 跟在windows下用vs编程的字体一样了, 瞬间感觉熟悉了好多, 继续折腾! 我的.vimrc配置文件:https://github.com/xuzhezhaozhao/my_vimrc/blob/master/

MIPS 平台 Android 移植过程记录1_编译环境搭建

在工作的空闲时间, 尝试着在公司的MIPS平台上移植了Android, 把之前记录的遇到的问题贴到blog上来, 做个记录. 1.设置上网代理   /etc/apt/apt.conf, 在文件中添加下面的内容, 注意最后的 ";" 也是需要添加的, 否则会提示这个文件的结束字符不对 Acquire::http:Proxy "user:[email protected]:port/"; 2. Installing the JDK apt-get install ope

(转)在Xcode 7上直接使用Clang Address Sanitizer

原文地址: http://www.cocoachina.com/ios/20150730/12830.html WWDC 2015上,除了Swift 2.0外,还有一个令人激动的消息:可以直接在Xcode 7上使用Clang的地址消毒剂(Address Sanitizer)了.这篇文章中我们将详细讨论下这个功能,比如它是怎样工作的,以及使用的方法.这是Konstantin Gonikman提议的话题. C语言中一种异常危险的情况 从很多方面来看,C语言都是一种伟大的编程语言.事实上,发明至今已逾