文档章节

clang记录

 悠米海
发布于 2015/02/07 11:17
字数 840
阅读 562
收藏 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
博文 94
码字总数 37254
作品 0
浦东
程序员
私信 提问
学习C++的50条,谨以送给C++的粉丝们

1.把C++当成一门新的语言学习(和C没啥关系!真的);   2.看《Thinking In C++》,不要看《C++变成死相》(C++编程思想,翻译的非常差);   3.看《The C++ Programming Language》(这...

地瓜儿
2013/01/11
1K
7
LLVM 3.8 发布,编译器架构

LLVM 3.8 发布了,LLVM 是 Low Level Virtual Machine (低级虚拟机)的简称,这个库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用。能够进行程序语言的编译期优化、链接优...

oschina
2016/03/09
3.2K
10
STL list链表的用法详解

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

nao
2014/04/10
0
0
C语言编程学习:制作掷骰子小游戏

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/20
0
0
FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器

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

知然
2013/01/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JVM问题排查也不是很难--工具使用

目录 概述 环境准备 工具介绍 远程连接方式 开启JMX 工具远程连接 参考文献 概述 线上环境中,程序越来越慢,一头雾水?遇到程序经常宕机,但找不到原因?排查问题却经常记不住命令? 那是没找到好...

java_龙
9分钟前
2
0
MySQL

1、查看数据库中所有的数据表: SHOW DATABASES; 2、连接数据库: use (数据库名); 3、显示已经打开的数据库: SELECT DATABASE(); 4、创建数据表: CREATE TABLE (数据表的名字)(第...

墨冥
18分钟前
2
0
idea 设置背景色

编辑界面背景色 控制台背景色

暗中观察
19分钟前
1
0
Win10强制更新怎么关闭 彻底禁止Windows自动更新方

Win10强制更新怎么关闭 彻底禁止Windows自动更新方法 (全文) 百事数码原创 2018-07-06 17:39电脑百事网7843 + 关注 很多Win10用户来说经常会遇到这样的烦恼,电脑系统会不时的提醒自动更新,...

阿K1225
35分钟前
2
0
不用编写程序代码,送你一个爬虫程序批量采集猫眼电影票房数据

"大数据"是一个体量特别大,数据类别特别大的数据集,并且这样的数据集无法用传统数据库工具对其内容进行抓取、管理和处理。 "大数据"首先是指数据体量(volumes)大,指代大型数据集,一般在1...

技术阿飞
49分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部