日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

在windows下使用llvm+clang

發布時間:2025/6/15 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在windows下使用llvm+clang 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

clang是FreeBSD和Mac下C/C++語言的默認編譯器。如果你在蘋果下做過開發,那么應該對它很熟悉。

這套工具鏈有很多優點:

  • 代碼很新,架構優良。
  • 錯誤信息更友好。
  • 靜態檢查功能更強大。
  • 版權限制小,易于自定義模塊來擴展它的功能。
  • 背后有Apple和Google這兩家商業公司的大力支持。比如XCode現在只支持clang而不支持gcc。
  • 支持JIT。這使得C/C++可以像java那樣半編譯半解釋,一次編譯到處執行。
  • 支持所有主流的操作系統。
  • clang只是一個前端,它背后用來生成二進制機器碼的叫llvm。

    llvm+clang 在windows下有兩種,一個是用mingw編譯的,使用gcc的頭文件和庫。一個是用vc編譯的,使用vc的頭文件和庫。

    mingw版本的下載地址是:http://llvm.org/releases/3.4/LLVM-3.4-win32.exe?這是由官方提供的

    vc版本的下載地址是:http://pan.baidu.com/s/1eQf6E90這是我自己編譯的,32位版本。

    我建議你安裝vc版本的,

    因為優點是:

  • 它編譯出來的是更原生態的程序。不依賴于mingw,只依賴于vc的dll。
  • 我自己編譯的這個版本功能更全,包含了llvm的JIT執行器、clang的擴展工具(如把老風格的代碼轉換成c++11)等等。
  • 性能更高。
  • 但也有一些缺點:

  • 必須依賴于visual studio。請先安裝visual studio再安裝llvm。
  • 沒有安裝visual studio的可以從微軟的官方網站下載:?http://www.microsoft.com/en-us/download/details.aspx?id=40778?。沒有密鑰的發郵件找我要。

    如果已經有visual studio但是版本不是2013的,請安裝vc 2013的可再分發包:http://www.microsoft.com/en-us/download/details.aspx?id=40784


    clang安裝好以后,你可以先打開它下面的bin目錄看一眼,里面有30多個exe。主要比較常用的是:

    • 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。

    Hello World

    然后寫一個hello world試下。

    #include <windows.h>int main(){MessageBox(NULL,"hello\n",NULL,MB_OK); return 0; }


    由于默認情況下clang的鏈接器用的還是vc的鏈接器,所以在執行編譯操作之前,得先設置vc所需要的環境變量。打開C:\Program Files (x86)\VS\Common7\Tools\Shortcuts,執行那個名為“VS2013 x86 Native Tools Command Prompt”的快捷方式。



    然后在這里面執行

    C:> clang++ -o hello.exe hello.cpp -Wl,”user32.lib”

    ?這個版本的clang有一個缺陷,它不會自動把-lxxx 這樣的參數正確傳遞給vc的link.exe。所以我只能用-Wl這樣的方式傳。

    編譯好的exe執行結果如下:

    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:

  • 在訪問argv的時候可能會越界。(用戶執行時沒有加任何參數)
  • 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下還不能用。

    This article is from:https://www.sunchangming.com/blog/post/4614.html

    原文鏈接: http://blog.sunchangming.com/post/79532506473

    總結

    以上是生活随笔為你收集整理的在windows下使用llvm+clang的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。