文档章节

clang记录

 悠米海
发布于 2015/02/07 11:17
字数 840
阅读 558
收藏 2
  • 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 


    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下还不能用。

本文转载自:http://blog.sunchangming.com/post/79532506473

共有 人打赏支持
粉丝 12
博文 93
码字总数 37069
作品 0
浦东
程序员
【转载】数据结构利器之私房STL

数据结构利器之私房STL 此系列的文章适合初学有意剖析STL和欲复习STL的同学们。 学过c++的同学相信都有或多或少接触过STL。STL不仅仅是c++中很好的编程工具(这个词可能有点歧义,用类库更恰...

悠米海
2012/12/02
0
0
STL list链表的用法详解

------------------------------------------------------------------------------- 原来... STL list链表的用法详解 本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通...

nao
2014/04/10
0
0
CSDN回帖得分大全(近两年)

√ vs2005调用dll的时候Initialize()函数返回错误 [VC/MFC 基础类] √ 为什么我创建登陆框之后,然后获取登陆框的数据时候总是出现非法操作! [VC/MFC 界面] √ CFileFind::FindFile 支持通配...

junwong
2012/03/09
0
0
FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器

摘要: 在使用C++做服务器开发中,经常会使用到脚本技术,Lua是最优秀的嵌入式脚本之一。Lua的轻量、小巧、概念之简单,都使他变得越来越受欢迎。本人也使用过python做嵌入式脚本,二者各有特...

知然
2013/01/27
0
0
C#调用C的Dll(类型对照)

C#调用C的DLL //C++中的DLL函数原型为 //extern "C" declspec(dllexport) bool 方法名一(const char 变量名1, unsigned char 变量名2) //extern "C" declspec(dllexport) bool 方法名二(cons......

KavenSu
2014/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
今天
2
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
5
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
4
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
5
0
中秋快乐!!!

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部