0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺談LLVM LibFuzzer工具和實(shí)踐

沐曦MetaX ? 來(lái)源:沐曦MetaX ? 作者:肖旭東 ? 2022-10-27 10:57 ? 次閱讀

摘要

我們?cè)诖a編輯器 (IDE) 中編寫(xiě)源代碼,將源代碼保存到文本文件中,然后用對(duì)應(yīng)的編譯器讀取文件、分析代碼,并將其翻譯成適合目標(biāo)平臺(tái)的格式,比如 X86、X86-64、Nvidia-GPU。不同的目標(biāo)平臺(tái)涉及的指令集有所不同,拿 X86 指令集來(lái)說(shuō),總數(shù)上千條,如果將每條組合不同的參數(shù)一一去驗(yàn)證,可以想象這個(gè)工程量有多么的龐大。除了 CPU 指令,GPU 指令也是如此。面對(duì)如此復(fù)雜的工作,有沒(méi)有一種強(qiáng)大且智能的測(cè)試方式呢?答案是肯定的,它就是出自 LLVM 編譯器框架的 LibFuzzer 工具。

利用 LibFuzzer 可以輕松發(fā)現(xiàn)程序常見(jiàn)的致命錯(cuò)誤,包括不限于這些 crash:堆/棧/全局越界 (OOM)、內(nèi)存泄漏、未初始化、互斥作用等,這樣可以最大限度地發(fā)現(xiàn)人為很難發(fā)現(xiàn)的問(wèn)題,提高產(chǎn)品的安全和穩(wěn)定性。

本文將介紹什么是 Fuzzer、LibFuzzer,如何編譯 LLVM-Fuzzer,以及快速寫(xiě)一個(gè) Hello World 目標(biāo)函數(shù),幫助大家熟悉并了解以上工具的用法、特性和需要注意的問(wèn)題,提高代碼編譯的效率。

1什么是 Fuzzing Testing

編程和軟件開(kāi)發(fā)中,F(xiàn)uzzing 測(cè)試是一種自動(dòng)化的軟件測(cè)試技術(shù),其核心思想是將自動(dòng)或半自動(dòng)生成的隨機(jī)數(shù)據(jù)輸入到一個(gè)程序中,并檢測(cè)程序異常,如 Crash,Assertion 失敗,以盡可能地發(fā)現(xiàn)程序錯(cuò)誤,比如內(nèi)存泄漏。Fuzzing 測(cè)試常常用于檢測(cè)軟件或計(jì)算機(jī)系統(tǒng)的安全漏洞。

通常,F(xiàn)uzzer 用于測(cè)試采用參數(shù)化輸入的程序。例如,在參數(shù)一定的前提下,在一個(gè)圖片編碼過(guò)程中,區(qū)分有效和無(wú)效的編碼數(shù)據(jù),使代碼在不同分支下(比如:if…else if),產(chǎn)生不同的結(jié)果。無(wú)效輸入會(huì)導(dǎo)致程序得不到正確處理,從而發(fā)現(xiàn)問(wèn)題。

Fuzzer 可以分為以下幾類(lèi):生成型、突變型,以及前面兩種情況的結(jié)合-進(jìn)化型,今天介紹的是最后一種進(jìn)化型,即 LLVM 自帶 LibFuzzer。

2什么是 LibFuzzer

我們先了解下這個(gè)強(qiáng)大的編譯器框架 LLVM 是什么?

LLVM 是一套編譯器和工具鏈技術(shù),可用于開(kāi)發(fā)任何編程語(yǔ)言的前端和任何指令集架構(gòu)的后端。LLVM 是圍繞獨(dú)立于語(yǔ)言的中間表示 (IR) 設(shè)計(jì)的,它作為一種可移植的高級(jí)匯編語(yǔ)言,可以通過(guò)多次轉(zhuǎn)換進(jìn)行優(yōu)化。

LibFuzzer 與被測(cè)庫(kù)鏈接,并通過(guò)特定的 Fuzzy 入口函數(shù) (LLVMFuzzerTestOneInput),又稱目標(biāo)函數(shù),將 Fuzzy 隨機(jī)生成的參數(shù)提供給庫(kù);然后,F(xiàn)uzzer 跟蹤到達(dá)的代碼區(qū)域,并在輸入數(shù)據(jù)的主體上生成不同的參數(shù)組合,以最大限度地提高代碼覆蓋率。LibFuzzer 的代碼覆蓋率信息由 LLVM 的 SanitizerCoverage 工具提供。

LibFuzzer 有 3 個(gè)特性:第一個(gè)是in-process(進(jìn)程內(nèi)),即 LibFuzzer 在 fuzz 時(shí)并不是產(chǎn)生出多個(gè)進(jìn)程來(lái)分別處理不同的輸入,而是將所有的測(cè)試數(shù)據(jù)放入進(jìn)程的內(nèi)存空間中。

這有利于進(jìn)行高效的數(shù)據(jù)傳輸。為了提高這種高輸入,還可以結(jié)合 Google 序列化結(jié)構(gòu)化數(shù)據(jù)庫(kù) protobuf,如 LLVM 里面的 clang-proto-fuzzer 就是這種類(lèi)型。

第二個(gè)特性是coverage-guided(覆蓋率)。Fuzzer 測(cè)試是隨機(jī)的,不清楚覆蓋了多少代碼,那么就可以用這個(gè)特性來(lái)統(tǒng)計(jì)代碼覆蓋率。

第三個(gè)特性就是Evolutionary(進(jìn)化型), LibFuzzer 不僅可以生成數(shù)據(jù),還可以對(duì)目前的數(shù)據(jù)進(jìn)行突變,如前面講到的,結(jié)合了生成和突變兩種形式。

不過(guò)這些特性也在一定程度上約束了 LibFuzzer 在某些場(chǎng)景的使用,比如在內(nèi)存上完成生成、突變作為輸入,速度非常快,但需要避免目標(biāo)函數(shù)太大、太復(fù)雜,以及不能出現(xiàn)exit()函數(shù)。

在使用 Fuzzer 進(jìn)行測(cè)試的時(shí)候,在編譯目標(biāo)函數(shù)時(shí),需要指定-fsanitize類(lèi)型,包括 AddressSanitizer (ASAN),UndefinedBehaviorSanitizer (UBSAN), 以及 MemorySanitizer (MSAN)。

3環(huán)境準(zhǔn)備

為了能夠讓更多的程序員使用這個(gè)強(qiáng)大的工具,LibFuzzer 是獨(dú)立的,并不依賴于 LLVM 框架,使用時(shí)只需下載對(duì)應(yīng)的庫(kù)和頭文件即可,在 ubuntu , centos 以及 windows 系統(tǒng)中,都可以快速獲取到,關(guān)鍵字搜索:llvm-toolset。

不要被 LLVM 編譯器這種龐然大物嚇到,其實(shí)它與其他的編譯構(gòu)建原理類(lèi)似,下面就以 LLVM 內(nèi)置的 Fuzzer 為例來(lái)進(jìn)行詳細(xì)介紹。

首先是克隆 LLVM 的源代碼,然后編譯 LLVM 和 compile-rt,命令如下。

be5788a0-559f-11ed-a3b6-dac502259ad0.png

這里推薦編譯類(lèi)型為 Release,因?yàn)?debug 的編譯實(shí)在太慢,通常前者 10 分鐘內(nèi)可以完成,后者大概需要 2 個(gè)小時(shí)。

如果要用 LLVM 自帶的 LLVM-Fuzzer 工具,可以手動(dòng)編譯自帶的 Fuzzer 工具,參考下面的命令,編譯好之后,在 bin 目錄可以找到有 clang-fuzzer、llvm-as-fuzzer、llvm-isel-fuzzer、llvm-mc-fuzzer 等 Fuzzer (模糊測(cè)試器),能夠用于測(cè)試 LLVM 前后端的功能,包括匯編、反匯編、指令選擇、優(yōu)化等等。

be8b0e82-559f-11ed-a3b6-dac502259ad0.png

值得注意的是需要指定-DMAKE_C_COMPILER為上一步編譯 LLVM 的 clang 文件,而且是不同的 build 目錄。就地取材,用LLVM 工程自帶的compiler-rt/test/fuzzer/CompressedTest.cpp來(lái)編譯完成之后,來(lái)將程序運(yùn)行一下。

be9a9a64-559f-11ed-a3b6-dac502259ad0.png

以上程序運(yùn)行之后的日志信息里,可以看到如下信息,分別代表的意義為:

Seed 即 ./a.out -seed=xxx 可以指定的隨機(jī) seed

INFO 第一行提示沒(méi)有指定 corpus,corpus 是一個(gè)提高 fuzzer 效率的方法

#2 后面的 INITED 代表初始化、開(kāi)始執(zhí)行, pulse 代表在運(yùn)行,但沒(méi)有新的產(chǎn)生,執(zhí)行了 2 的 n 次方后會(huì)顯示 pulse,有新的輸入產(chǎn)生會(huì)顯示 new 等等

cov: 2 代表覆蓋率是 2, 執(zhí)行當(dāng)前輸入所覆蓋的代碼塊的總數(shù)

ft: 3 feature 泛指代碼覆蓋率:邊緣覆蓋率、邊緣技術(shù)、配置文件等

corp: 1/1b 當(dāng)前內(nèi)存中測(cè)試輸入 corpus 庫(kù)中的條目數(shù)及其大小(以字節(jié)為單位)

lim: 4 exec/s 當(dāng)前對(duì)語(yǔ)料庫(kù)中新條目長(zhǎng)度的限制。隨時(shí)間增加,直到達(dá)到設(shè)置的最大長(zhǎng)度 (-max_len),目前長(zhǎng)度是 4

rss: 25MB 當(dāng)前內(nèi)存消耗,當(dāng)前是25MB

./crash-xxx 是用來(lái)復(fù)現(xiàn)問(wèn)題的 binary 文件

是不是很方便?最后一個(gè)crash 文件用于復(fù)現(xiàn)問(wèn)題,這樣我們就可以有針對(duì)性的對(duì)程序進(jìn)行動(dòng)態(tài)調(diào)試,利用造成 crash 的輸入重現(xiàn)出漏洞的細(xì)節(jié)。

4提高 Fuzz 效率

從以上 CompressedTest 例子,可以看到一個(gè)簡(jiǎn)單的 Fuzzer 目標(biāo)函數(shù)執(zhí)行之后的一些打印信息。同時(shí)在執(zhí)行時(shí) LibFuzzer 還內(nèi)置了一些可選參數(shù)供程序員使用,比如最大長(zhǎng)度默認(rèn)是100,如果某個(gè) bug 輸入的參數(shù)長(zhǎng)度是 101 才能觸發(fā),那這個(gè) bug 用長(zhǎng)度 100 的輸入永遠(yuǎn)都跑不出來(lái)。

因此可見(jiàn),我們?cè)O(shè)置一些常見(jiàn)的可選參數(shù)也能夠提高效率,并找到真正的問(wèn)題所在。如下這些參數(shù)是比較常見(jiàn)的。

max_len 生成輸入的最大長(zhǎng)度

len_control 首先嘗試生成較小的輸入,越小就代表執(zhí)行的速度就越快,然后隨著時(shí)間的推移嘗試生成較大的輸入

除了這些常見(jiàn)的可選參數(shù)之外,還有兩個(gè)非常重要的能夠提高效率的參數(shù):dict 和 corpus。

Dict 字典

相信「字典」對(duì)我們來(lái)說(shuō)并不陌生,小學(xué)的時(shí)候基本人手一本「新華字典」。字典是從一種或多種特定語(yǔ)言的詞典中列出的詞匯,通常按字母順序排列。

對(duì)于 Fuzzer 的字典,就是從一個(gè)目標(biāo)函數(shù)中列舉出所有輸入特性相關(guān)的詞匯。比如對(duì)應(yīng)編譯器的 MC(machine code),字典就包括但不限于:指令集、寄存器、const 常量、寄存器寬度等等。再舉個(gè)程序員熟悉的例子,常見(jiàn)的編程語(yǔ)言,包含有條件、跳轉(zhuǎn)、邏輯處理等等,對(duì)應(yīng)的字典包括但不限于:if、else、for、defined、template、include、pragma、!=、+= 等等,這樣相對(duì)比較好理解。

bef551b6-559f-11ed-a3b6-dac502259ad0.png

Fuzzer 字典的好處是提供一組我們希望在輸入中找到的常用詞或值來(lái)作為輸入,幫助 Fuzzer更快地?cái)U(kuò)大其覆蓋范圍。使用也非常簡(jiǎn)單,用-dict參數(shù)即可:./a.out -dict=dict.txt。

程序員可以根據(jù)被測(cè)函數(shù)的特性手動(dòng)生成一個(gè)字典,除此之外,每次程序跑完之后 LibFuzzer 會(huì)提供一個(gè)建議的字典,只要更新到對(duì)應(yīng)的字典文件里即可。

bf1a4890-559f-11ed-a3b6-dac502259ad0.png

Corpus 語(yǔ)料庫(kù)

Corpus 語(yǔ)料庫(kù),可以想象為一個(gè)函數(shù)的參數(shù)及各種參數(shù)的組合,即 Fuzzer 的測(cè)試用例。

在未使用語(yǔ)料庫(kù)的情況下就得到了 crash,實(shí)屬意外收獲。如果我們?cè)谑褂米值涞那闆r下仍然暫時(shí)未得到 crash,就可以去尋找一些有效的輸入語(yǔ)料庫(kù)。因?yàn)?LibFuzzer 是進(jìn)化型的 fuzz,結(jié)合了產(chǎn)生和突變兩個(gè)方面。

如果我們可以提供一些好的語(yǔ)料庫(kù),雖然它本身無(wú)法造成程序 crash,但LibFuzzer 會(huì)在此基礎(chǔ)上進(jìn)行變異,有可能變異出更好的輸入?yún)?shù),從而增大程序 crash 的概率。具體的變異策略需閱讀 LibFuzzer 源碼或網(wǎng)上搜索相關(guān)的文章。

在多種情況下,提供語(yǔ)料庫(kù)可以將代碼覆蓋率提高一個(gè)數(shù)量級(jí)。

在學(xué)習(xí) Fuzzer 時(shí),以下資料會(huì)對(duì)大家有所幫助,可以參考 Google Oss-Fuzz 開(kāi)源倉(cāng)庫(kù)。語(yǔ)料庫(kù)不能適用所有的場(chǎng)景,但特別適用于嚴(yán)格定義的文件格式和數(shù)據(jù)傳輸協(xié)議,比如:

對(duì)于文件格式解析器,添加測(cè)試套件中的有效文件

對(duì)于協(xié)議解析器,將測(cè)試套件中的有效原始流添加到單獨(dú)的文件中

對(duì)于圖形庫(kù),添加各種小的 PNG/JPG/GIF 文件

執(zhí)行時(shí),只需要在目標(biāo)函數(shù)后面跟一個(gè)目錄即可,./a.out corpus,這里的 corpus 目錄就是用來(lái)存放corpus 集的。隨著運(yùn)行時(shí)間而增長(zhǎng)變多。

同時(shí)可以精簡(jiǎn)合并corpus,./a.out -merge=1 corpus_min corpus, 這樣,corpus_min 和 corpus 將會(huì)存放到新的 corpus 精簡(jiǎn)后的輸入樣例。

為提高效率,程序員可以從可選參數(shù)的組合、字典以及 corpus這三方面入手,即可以保證目標(biāo)函數(shù)的穩(wěn)定性。除了以上手段外,還有一個(gè)重點(diǎn)也是難點(diǎn),就是如何寫(xiě)好一個(gè)目標(biāo)函數(shù)。

5Hello World Fuzzer

下面就從幾個(gè)簡(jiǎn)單的 Hello world 入手,熟悉下 LibFuzzer 如何寫(xiě)一個(gè)目標(biāo)函數(shù)。

創(chuàng)建一個(gè)文 fuzz_target.cc, 內(nèi)容如下,不要使用 main 等作為函數(shù)名,因?yàn)?Libfuzzer 自帶了main 函數(shù)。

bf2a0014-559f-11ed-a3b6-dac502259ad0.png

需要注意的是LLVMFuzzerTestOneInput函數(shù)是要實(shí)現(xiàn)的接口函數(shù),包含兩個(gè)參數(shù) Data (LibFuzzer 的測(cè)試樣本數(shù)據(jù))及 size (樣本數(shù)據(jù)的大小)。

分析問(wèn)題:當(dāng)foo函數(shù)被調(diào)用的時(shí)候,條件 size>=4,但是 data[4], index 取到 4,相當(dāng)于 size 應(yīng)該是 5,就會(huì)觸發(fā)超出邊界的異常。

編譯這個(gè)文件,命令clang++ -g -O1 -fsanitize=fuzzer,address fuzz_target.cc -ofuzzer_target,這里的 clang 是用 LLVM 編譯出來(lái)的。

如果是直接安裝的 clang,就需要添加 LibFuzzer的庫(kù)函數(shù):clang++ -g -O1 -fsanitize=fuzzer,addresslibFuzzer/Fuzzer/libFuzzer.a fuzz_target.cc -o fuzzer_target,否則可能會(huì)報(bào)錯(cuò)。

參數(shù)的含義:

g 可選參數(shù),保留調(diào)試符號(hào)

O1 指定優(yōu)化等級(jí)為 1,對(duì)應(yīng)的還有 O0 (optimize 0,1,2),以及 OS (optimize size)使用后 binary 大小會(huì)變小

fsanitize 指定 sanitize, 類(lèi)型有幾種:fuzzer, address, 和memory(單獨(dú)使用,檢查內(nèi)存),undefined(未定義)

編譯這一步驟整體過(guò)程就是通過(guò) clang 的 -fsanitize=fuzzer 選項(xiàng)啟用 LibFuzzer,這個(gè)選項(xiàng)在編譯和鏈接過(guò)程中生效,實(shí)現(xiàn)了條件判斷語(yǔ)句和分支執(zhí)行的記錄,通過(guò)生成不同的測(cè)試樣例獲得代碼的覆蓋率情況,最終實(shí)現(xiàn)所謂的 fuzz-testing。

注意:編譯的選項(xiàng)會(huì)影響 Fuzzer 的效率,比如是否保存指針。遇到問(wèn)題可以在網(wǎng)上搜索,或問(wèn)下身邊的大佬。另外,關(guān)注「沐曦MetaX」也會(huì)有意想不到的收獲。

clang 編譯的時(shí)候,參數(shù)-fno-omit-frame-pointer對(duì)于不需要棧指針的函數(shù)就不在寄存器中保存指針,因此可以忽略存儲(chǔ)和檢索地址的代碼,同時(shí)對(duì)眾多函數(shù)提供一個(gè)額外的寄存器。在 AMD64 平臺(tái)上此選項(xiàng)默認(rèn)打開(kāi),但是在 x86 平臺(tái)上則默認(rèn)關(guān)閉,建議編譯的時(shí)候做顯式設(shè)置。

gline-tables-only 表示使用采樣分析器, 在應(yīng)用程序執(zhí)行時(shí),抽樣探查器用于收集運(yùn)行時(shí)信息(如硬件計(jì)數(shù)器)。一般情況下,這個(gè)參數(shù)非常有效,并且不會(huì)引起大量的運(yùn)行時(shí)開(kāi)銷(xiāo)。分析器收集的示例數(shù)據(jù)可用于編譯期間確定代碼中執(zhí)行最多的區(qū)域是什么,在編譯器使用分析信息之前,代碼需要在分析器下執(zhí)行,這對(duì)提高 Fuzzing 效率很重要。

常用的編譯命令就是這樣:clang++ -g -O2 -fno-omit-frame-pointer -gline-tables-only -fsanitize=address,fuzzer-no-link test.cc libFuzzer/Fuzzer/libFuzzer.a -o test

第一個(gè)目標(biāo)函數(shù)里面被調(diào)用的 foo 函數(shù)是硬編碼,有沒(méi)有一種好的方法直接生成輸入數(shù)據(jù)呢?YES,上代碼。

bf577a80-559f-11ed-a3b6-dac502259ad0.png

用 FuzzedDataProvider 這樣一個(gè) helper,組合生成我們需要的數(shù)據(jù),上面兩段代碼分別獲取 value, amount,可以達(dá)到相同的效果。

事實(shí)上筆者接觸 LibFuzzer 并不久,但在編寫(xiě) Fuzzer 過(guò)程中,也發(fā)現(xiàn)了一些小技巧,比如可以用LLVMFuzzerCustomMutator來(lái)對(duì)現(xiàn)有的數(shù)據(jù)進(jìn)行突變,然后輸入到目標(biāo)函數(shù)。此外,還可以用LLVMFuzzerCustomCrossOver來(lái)自定義數(shù)據(jù)的交叉組合,從而在相同時(shí)間內(nèi)達(dá)到更高的代碼覆蓋率。

6總結(jié)

通過(guò)本文我們可以了解 Fuzzer、LibFuzzer 工具、如何編譯 LLVM-Fuzzer,以及寫(xiě)一個(gè) Fuzzer 目標(biāo)函數(shù)。利用 LibFuzzer 的功能可以自動(dòng)發(fā)現(xiàn)一些未知的問(wèn)題,寫(xiě)好了工具,還需要用起來(lái),至于如何管理 corpus、crash bug,集成到項(xiàng)目中,也需要掌握和了解。LibFuzzer 是最常見(jiàn)的 Fuzzing 工具之一,它是獨(dú)立的、不依賴 LLVM,提供的接口和 helper 非常強(qiáng)大,在運(yùn)行的過(guò)程中,還需要用 dict、corpus 來(lái)提高 Fuzzing 的效率。corpus 語(yǔ)料庫(kù)在 Fuzzy 過(guò)程中不斷演變,我們可以找到代碼中很難人被為發(fā)現(xiàn)的問(wèn)題。隨著運(yùn)行時(shí)間的增加,要不斷優(yōu)化合并我們的 corpus,用較小的輸入達(dá)到同樣的覆蓋率。

最后,F(xiàn)uzzer 有開(kāi)源、半開(kāi)源、商業(yè)等不同類(lèi)型,如面向安全的 Google-honggfuzz、面向 HTTP 的 Fuzz-Monkey,在工作中需選擇適合項(xiàng)目的類(lèi)型。歸根結(jié)底 LibFuzzer 只是一個(gè)工具,但解決問(wèn)題還要靠程序員自己。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2943

    瀏覽量

    66570
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1608

    瀏覽量

    48979

原文標(biāo)題:【智算芯聞】淺談 LLVM LibFuzzer 工具和實(shí)踐

文章出處:【微信號(hào):沐曦MetaX,微信公眾號(hào):沐曦MetaX】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    淺談公共機(jī)房樣機(jī)制作及日常維護(hù)

    淺談公共機(jī)房樣機(jī)制作及日常維護(hù)隨著電腦和網(wǎng)絡(luò)的應(yīng)用日益普及, 電腦在日常生活中扮演著越來(lái)越重要的角色,而學(xué)校的教育,無(wú)論是高校還是中小學(xué),公共機(jī)房都是一個(gè)不可缺少的教學(xué)實(shí)踐基礎(chǔ)硬件設(shè)備。而如何高效
    發(fā)表于 10-10 15:04

    手機(jī)硬件知識(shí)淺談

    手機(jī)硬件知識(shí)淺談
    發(fā)表于 05-15 11:04

    淺談射頻PCB設(shè)計(jì)

    淺談射頻PCB設(shè)計(jì)
    發(fā)表于 03-20 15:07

    LLVM編譯器編譯過(guò)程

    LLVM 編譯器 原理解析, 插件編寫(xiě)
    發(fā)表于 04-28 08:15

    LLVM clang 公開(kāi) -std=c++23

    合入 LLVM 17 倉(cāng)庫(kù)的代碼對(duì) Clang 編譯器使用 -std=c++23 代替了 -std=c++2b。 隨著 ISO C++ 委員會(huì)投票決定 C++23 標(biāo)準(zhǔn)已達(dá)到其技術(shù)完整狀態(tài)
    發(fā)表于 05-27 11:29

    FPGA設(shè)計(jì)工具淺談

    FPGA設(shè)計(jì)工具淺談 作為一個(gè)負(fù)責(zé)FPGA企業(yè)市場(chǎng)營(yíng)銷(xiāo)團(tuán)隊(duì)工作的人,我不得不說(shuō),由于在工藝技術(shù)方面的顯著成就以及硅芯片設(shè)計(jì)領(lǐng)
    發(fā)表于 10-10 07:46 ?459次閱讀

    在Swift中使用LLVM的四個(gè)要點(diǎn)

    本文主要內(nèi)容是演示如何在Swift中使用LLVM,其包含了如下四個(gè)要點(diǎn): 獲取最新版本的LLVM使用CMake和llvm-config編譯程序編寫(xiě)簡(jiǎn)單的Swift程序,編譯并與LLVM
    發(fā)表于 10-13 16:55 ?0次下載
    在Swift中使用<b class='flag-5'>LLVM</b>的四個(gè)要點(diǎn)

    四個(gè)不同的系統(tǒng)上進(jìn)行LLVM/Clang 6.0 和 5.0 的編譯器Benchmark測(cè)試

    參與測(cè)試的 LLVM 5.0.1 和 LLVM 6.0.0 穩(wěn)定版都是來(lái)自 apt.llvm.org。測(cè)試期間,每個(gè)系統(tǒng)都將其 CFLAGS/CXXFLAGS 設(shè)置為 "-O3 -march
    的頭像 發(fā)表于 03-29 15:25 ?7673次閱讀

    智變未來(lái)-淺談人工智能技術(shù)應(yīng)用與實(shí)踐

    由騰訊優(yōu)圖主辦,騰訊云、騰訊 Ai Lab 和極客邦協(xié)辦,主題為「智變未來(lái)-淺談人工智能技術(shù)應(yīng)用與實(shí)踐」的技術(shù)沙龍活動(dòng) 3 月 23 日在北京舉辦,沙龍上來(lái)自騰訊、intel 的五位嘉賓就技術(shù)、產(chǎn)品、實(shí)踐和應(yīng)用等 Ai 話題展開(kāi)
    發(fā)表于 04-01 11:39 ?692次閱讀

    llvm-mctoll將二進(jìn)制文件轉(zhuǎn)換為LLVM IR

    ./oschina_soft/llvm-mctoll.zip
    發(fā)表于 06-22 11:35 ?0次下載
    <b class='flag-5'>llvm</b>-mctoll將二進(jìn)制文件轉(zhuǎn)換為<b class='flag-5'>LLVM</b> IR

    OLLVM和LLVM功能介紹

    LLVM是lowlevel virtual machine的簡(jiǎn)稱,它誕生于2003.10伊利諾伊大學(xué)香檳分校,創(chuàng)始人是ChrisLattner,它是一個(gè)完整的編譯器框架,它兼容大部分主流開(kāi)發(fā)語(yǔ)言例如
    的頭像 發(fā)表于 09-19 15:42 ?7300次閱讀

    LLVM源碼淺析-1

    作為一個(gè)優(yōu)秀的開(kāi)源編譯器框架,llvm的代碼比gcc代碼的可讀性更好。因此無(wú)論是學(xué)習(xí)c++,還是學(xué)習(xí)編譯原理、設(shè)計(jì)模式、數(shù)據(jù)結(jié)構(gòu),都是一個(gè)很好的學(xué)習(xí)目標(biāo)。
    的頭像 發(fā)表于 03-02 16:06 ?1994次閱讀
    <b class='flag-5'>LLVM</b>源碼淺析-1

    LLVM國(guó)際開(kāi)源軟件社區(qū)發(fā)布正式支持LoongArch架構(gòu)的版本

    前言 著名的LLVM國(guó)際開(kāi)源軟件社區(qū)于2023年3月18日發(fā)布了16.0.0版本,以正式后端(official target)的級(jí)別實(shí)現(xiàn)了對(duì)LoongArch指令集架構(gòu)的完善支持。 至此,開(kāi)源
    的頭像 發(fā)表于 03-21 09:45 ?1660次閱讀

    什么是LLVM?LLVM的優(yōu)勢(shì)和特點(diǎn)有哪些?

    LLVM是一個(gè)開(kāi)源的編譯器基礎(chǔ)設(shè)施項(xiàng)目,它以"Low-Level Virtual Machine"的縮寫(xiě)命名,盡管名稱中包含了"虛擬機(jī)"一詞,但LLVM不僅僅是一個(gè)虛擬機(jī),而是一個(gè)綜合的編譯器工具鏈。
    的頭像 發(fā)表于 06-11 15:54 ?9248次閱讀

    使用LLVM-embedded-toolchain-for-Arm-17.0.1開(kāi)發(fā)STM32

    LLVM-embedded-toolchain-for-Arm 是一個(gè) ARM 公司開(kāi)源的適用于 32 位ARM芯片的工具鏈,支持多種ARM指令集架構(gòu),包括最新的 CM85 內(nèi)核。
    的頭像 發(fā)表于 10-23 16:46 ?1493次閱讀
    使用<b class='flag-5'>LLVM</b>-embedded-toolchain-for-Arm-17.0.1開(kāi)發(fā)STM32