電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 669|回復(fù): 0
收起左側(cè)

C++發(fā)布革命性提案:“借鑒”Rust精華,內(nèi)存安全即將成為標(biāo)配?

[復(fù)制鏈接]

475

主題

475

帖子

4237

積分

四級(jí)會(huì)員

Rank: 4

積分
4237
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-26 09:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
點(diǎn)擊上方“C語(yǔ)言與CPP編程”,選擇“關(guān)注/置頂/星標(biāo)公眾號(hào)”干貨福利,第一時(shí)間送達(dá)!最近有小伙伴說(shuō)沒(méi)有收到當(dāng)天的文章推送,這是因?yàn)槲⑿鸥牧送扑蜋C(jī)制,確實(shí)會(huì)一部分有小伙伴刷不到當(dāng)天的文章,一些比較實(shí)用的知識(shí)和信息,錯(cuò)過(guò)了就是錯(cuò)過(guò)了。所以建議大家加個(gè)星標(biāo)??,就能第一時(shí)間收到推送了。

編譯 | 核子可樂(lè)、Tina    轉(zhuǎn)自 | InfoQ
                想要內(nèi)存安全?那就給你們內(nèi)存安全!我們也有自己的借用檢查器。        在被“內(nèi)存安全”議題反復(fù)折磨了兩年之后,C++ 社區(qū)已經(jīng)發(fā)布一項(xiàng)提案,旨在幫助開發(fā)人員減少代碼中的安全漏洞。
這項(xiàng) Safe C++ Extension 安全擴(kuò)展提案希望解決這種編程語(yǔ)言中的致命弱點(diǎn),保證其就此告別內(nèi)存安全漏洞。
C++ 聯(lián)盟總裁兼執(zhí)行董事 Vinnie Falco 上周四表示,“這是一項(xiàng)革命性的提案,將為 C++ 編程語(yǔ)言帶來(lái)內(nèi)存安全功能。這次合作也標(biāo)志著 C++ 生態(tài)系統(tǒng)的一個(gè)重要里程碑,相信大家也感受到行業(yè)對(duì)于安全代碼的需求從未如此迫切。”


                1 內(nèi)存安全的需求確實(shí)從未如此迫切        在過(guò)去兩年之間,各類私營(yíng)和公共部門組織一直在敦促和推動(dòng)程序員們使用內(nèi)存安全語(yǔ)言(例如 C#、Go、Java、Python 以及 Swift)編寫新應(yīng)用程序,同時(shí)重寫舊有應(yīng)用程序。其中最典型的選項(xiàng)當(dāng)數(shù) Rust,一款性能良好的低級(jí)系統(tǒng)語(yǔ)言。
軟件工程師 Alex Gaynor 早在 2019 年就提出了這個(gè)問(wèn)題,他表示大型代碼庫(kù)中的大多數(shù)嚴(yán)重漏洞都來(lái)自內(nèi)存安全缺陷,例如緩沖區(qū)溢出與釋放后使用。他強(qiáng)調(diào)稱,“數(shù)據(jù)已經(jīng)一再證明,當(dāng)項(xiàng)目使用內(nèi)存不安全語(yǔ)言(例如 C 和 C++)時(shí),就會(huì)受到大量由此產(chǎn)生的安全漏洞的困擾!
在此之后,內(nèi)存安全迅速成為學(xué)術(shù)論文和技術(shù)會(huì)議中常見的討論主題。2022 年 9 月,微軟 Azure 首席技術(shù)官 Mark Russinovich 也下場(chǎng)靜態(tài),呼吁開發(fā)人員棄用 C 和 C++,轉(zhuǎn)投 Rust 的懷抱。
幾個(gè)月后,美國(guó)國(guó)安局也采取了類似的立場(chǎng)。到 2023 年,內(nèi)存安全已然成為主流話題,Consumer Reports 消費(fèi)者報(bào)告也對(duì)此進(jìn)行了報(bào)道。
面對(duì) Rust 的浩大攻勢(shì),C++ 陣營(yíng)這邊則警惕地組織起防守陣形。兩年之前,在回應(yīng) Russinovich 對(duì)于棄用 C/C++ 的呼吁時(shí),C++ 語(yǔ)言的締造者 Bjarne Stroustrup 就在采訪中坦言,“們現(xiàn)在可以在 ISO C++ 中實(shí)現(xiàn)完美的類型與內(nèi)存安全保障。
然而這個(gè)說(shuō)法遭到了一些質(zhì)疑;ヂ(lián)網(wǎng)安全研究小組(ISRG)的聯(lián)合創(chuàng)始人兼執(zhí)行董事 Josh Aas 就負(fù)責(zé)監(jiān)督一項(xiàng)名為 Prossimo 的內(nèi)存安全計(jì)劃,他去年曾在采訪中證實(shí),盡管理論上確實(shí)可以編寫內(nèi)存安全的 C++ 代碼,但其在現(xiàn)實(shí)中其實(shí)無(wú)法實(shí)現(xiàn),因?yàn)?C++ 并沒(méi)有在立項(xiàng)之初就考慮到內(nèi)存安全設(shè)計(jì)。
安全 C++ 擴(kuò)展提案就是為了解決這些批評(píng)而生,同時(shí)也響應(yīng)了美國(guó)國(guó)安局、其他五眼國(guó)家情報(bào)機(jī)構(gòu)、美國(guó)網(wǎng)絡(luò)安全與基礎(chǔ)設(shè)施安全局(CISA)白宮以及國(guó)防高級(jí)研究計(jì)劃局(DARPA)對(duì)于各公共部門提出的內(nèi)存安全要求。
今年 8 月,Gaynor 重新討論了內(nèi)存安全問(wèn)題,并指出雖然嘗試讓 C++ 更安全確有現(xiàn)實(shí)意義,但他仍對(duì)這種意義的具體程度表示懷疑!拔业膽B(tài)度很明確,C++ 的安全性可以得到實(shí)質(zhì)性改進(jìn)。更具體地講,完全解決內(nèi)存安全問(wèn)題似乎也不是不可能。但相信大家也跟我一樣有著同樣的共識(shí),那就是對(duì)于讓 C++ 在安全性方面比肩 Swift、Go 或者 Rust 這個(gè)問(wèn)題上,恐怕并不存在一個(gè)簡(jiǎn)單易行的解決方案!
盡管如此,安全 C++ 擴(kuò)展提案仍想要一試身手。C++ 聯(lián)盟開發(fā)人員 Sean Gaxter(Circle 編譯器的創(chuàng)造者)與 Christian Mazakas 承認(rèn),目前行業(yè)對(duì)于采用內(nèi)存安全編程語(yǔ)言的呼聲可謂震耳欲聾。在他們看來(lái),雖然 Rust 只是一種流行的系統(tǒng)級(jí)編程語(yǔ)言、沒(méi)有垃圾收集功能、可以提供嚴(yán)格的內(nèi)存安全保障,但將 C++ 代碼遷移至 Rust 還是會(huì)帶來(lái)很多問(wèn)題。
                2 將大量 Rust 內(nèi)容復(fù)制到了 C++ 中?       

https://safecpp.org/draft.html
他們?cè)谔岚钢薪忉尩,“Rust 缺少函數(shù)重載、模板、繼承和異常機(jī)制,C++ 則缺少特征、重新定位與借用檢查。這些差異也導(dǎo)致這兩種語(yǔ)言在對(duì)接時(shí)產(chǎn)生種種不匹配狀況。大多數(shù)用于跨語(yǔ)言綁定的代碼生成器,根本就無(wú)法用某一種語(yǔ)言的特性來(lái)表達(dá)另一種語(yǔ)言的特性。”
盡管 DARPA 正在嘗試開發(fā)出更好的 C++ 到 Rust 自動(dòng)化轉(zhuǎn)換工具,但 Baxter 和 Mazakas 認(rèn)為,強(qiáng)迫資深 C++ 程序員們學(xué)習(xí) Rust 并不是理想的答案——不久之前,一位專注于 C 語(yǔ)言的 Linux 內(nèi)核維護(hù)者甚至因此辭去了工作。
他們爭(zhēng)辯道,“Rust 對(duì)于職業(yè) C++ 開發(fā)者來(lái)說(shuō)差異性過(guò)大,再加上互操作工具不夠便利,就導(dǎo)致通過(guò)用 Rust 重寫關(guān)鍵部分以強(qiáng)化 C++ 應(yīng)用程序變得極其困難。所以,為什么沒(méi)有針對(duì)內(nèi)存安全的語(yǔ)言解決方案?為什么就沒(méi)有安全版的 C++?”
Baxter 還在采訪中提到,盡管過(guò)去幾十年來(lái),無(wú)數(shù)計(jì)算機(jī)科學(xué)家一直在關(guān)注如何對(duì)程序的正確性做出證明,但現(xiàn)如今這個(gè)問(wèn)題已經(jīng)上升到了核心國(guó)家安全的高度。
Baxter 解釋稱,“近期政府對(duì)于內(nèi)存安全問(wèn)題的警告,促使整個(gè)科技行業(yè)都在關(guān)注這個(gè)問(wèn)題。我研究了這一理論,并從中發(fā)現(xiàn)了新機(jī)會(huì):設(shè)計(jì)新工具,幫助 C++ 工程師們編寫出質(zhì)量更高的程序,同時(shí)消除與安全漏洞相關(guān)的各類軟件缺陷。
Baxter 還指出,安全 C++ 項(xiàng)目引入了保障內(nèi)存安全的新技術(shù),而不僅僅是對(duì)原有最佳實(shí)踐的重申!鞍踩 C++ 能夠防止用戶編寫出不健全的代碼,同時(shí)輔以編譯時(shí)智能,例如通過(guò)借用檢查來(lái)防止使用后釋放錯(cuò)誤、初始化分析以確保類型安全等!
Baxter 表示,用不同編程語(yǔ)言重寫項(xiàng)目的成本很高,所以安全 C++ 的目標(biāo)是以更低的成本實(shí)現(xiàn)與 Rust 相同的健全性保證,進(jìn)而降低內(nèi)存安全的準(zhǔn)入門檻。他解釋道,“有了安全 C++,現(xiàn)有代碼能夠像以往一樣繼續(xù)正常運(yùn)行,而各利益相關(guān)方則可以更好地把控程序安全!
至于下一步,還需要科技行業(yè)的更多參與,以幫助實(shí)現(xiàn)安全 C++ 提出的項(xiàng)目目標(biāo)。
他總結(jié)道,“基礎(chǔ)已經(jīng)打好:我們有了出色的借用檢查和初始化分析機(jī)制,這也是健全性保障的實(shí)現(xiàn)基礎(chǔ)。下一步是全面對(duì)接 C++ 的所有功能特性,并為其指定內(nèi)存安全版本。這是一項(xiàng)艱巨的工作,但考慮到減少 C++ 安全漏洞的重大意義,這份付出絕對(duì)物有所值。”
社區(qū)對(duì)此提案褒貶不一。
有人提到,“這個(gè)話題如此重要,令人難以置信的是它還沒(méi)有進(jìn)入主流新聞”。他還表示,經(jīng)過(guò)幾十年不安全和脆弱代碼的困擾,終于有了一個(gè)官方且實(shí)用的“智能感知”機(jī)制來(lái)確保代碼的正確性,不過(guò)遲到總比不到好。
另一位二十多年的資深 C++ 開發(fā) James20k 認(rèn)為,“在 C++ 內(nèi)存安全的所有提案中,這個(gè)提案感覺(jué)是迄今為止最明智的!
他認(rèn)為該提案最大的優(yōu)點(diǎn)是基于實(shí)際的,且它是完全可選的,對(duì)現(xiàn)有的 C++ 不會(huì)發(fā)生任何變化。而且已被證明是可實(shí)現(xiàn)的,不像其他替代方案。Carbon、cpp2、clang-lifetimes、profiles 等要么內(nèi)存不安全,要么無(wú)法完全實(shí)現(xiàn),要么就是沒(méi)有用。另外,它提供了一個(gè)完全內(nèi)存安全的 C++ 版本,并且沒(méi)有損失表達(dá)能力。
但他指出這個(gè)提案的一個(gè)缺點(diǎn)就是“明確地基于 Rust”,“你已經(jīng)能看到這引發(fā)的強(qiáng)烈爭(zhēng)論了。遺憾的是,委員會(huì)對(duì)此類事情也并非免疫。”
很明顯,社區(qū)中一部分技術(shù)人員對(duì)借鑒 Rust 中的內(nèi)容有些異議。

我希望他們不要加入借用檢查器,也不要把 C++ 變成某種奇怪的 Rust 混合體。我真的比 Rust 更喜歡 C++。我喜歡 C++ 帶來(lái)的自由,我認(rèn)為這也是它的主要賣點(diǎn)之一。


我原本以為會(huì)看到一個(gè)關(guān)于 C++ 安全性的方案,但這個(gè)規(guī)范中大量借鑒了 Rust 的內(nèi)容,應(yīng)用在 C++ 上。正因?yàn)橛羞@樣的預(yù)期差異,閱讀過(guò)程中有時(shí)覺(jué)得像是在看一場(chǎng)惡搞。就像,作者是不是在開玩笑,把 Rust 的內(nèi)容用 C++ 語(yǔ)法呈現(xiàn),稱之為“安全 C++”?
不過(guò),看起來(lái)這確實(shí)是一個(gè)經(jīng)過(guò)深思熟慮的提案,作者投入了大量精力。對(duì)作者們來(lái)說(shuō),干得不錯(cuò)!現(xiàn)在談?wù)勎业膶?shí)際想法:我個(gè)人認(rèn)為,這個(gè)提案對(duì)語(yǔ)言的改變太大了,甚至比 C++11 的變動(dòng)還要大。我真的很想問(wèn),這是唯一的方式嗎?或許這是目前唯一經(jīng)過(guò)驗(yàn)證的方式。也許隨著更多人關(guān)注這個(gè)提案,有人可以在此基礎(chǔ)上進(jìn)一步改進(jìn)規(guī)范,如果這樣的改進(jìn)是可能的話。


我并不反對(duì)在 C++ 中加入安全性改進(jìn)的想法。但這個(gè)提案給我的感覺(jué)像是“試圖讓 C++ 變得像 Rust”。Rust 確實(shí)有一些很好的特性,但我們的目標(biāo)應(yīng)該是以 C++ 自己的方式進(jìn)行改進(jìn),而不是試圖成為另一種語(yǔ)言。
                3 Linus Torvalds 出言定性:Rust 帶來(lái)了新的“信仰之爭(zhēng)”        有開發(fā)者認(rèn)為,C++ 要么朝這個(gè)方向發(fā)展,要么輸給 Rust 并消亡。
這種觀點(diǎn)反映了編程語(yǔ)言之間的競(jìng)爭(zhēng)往往被過(guò)度情緒化,也是一種引戰(zhàn)的言論。C++ 和 Rust 都是工具,沒(méi)有誰(shuí)需要“勝利”,但每次在 C++ 社區(qū)中提到 Rust,都會(huì)引發(fā)一場(chǎng)老式的口水戰(zhàn)。這種 C++ 和 Rust 之間的“文化戰(zhàn)”往往讓人想起 C 和 Rust 之間的爭(zhēng)論。
在 Linux 締造者 Linus Torvalds 看來(lái),如今Rust 帶來(lái)的爭(zhēng)議,“幾乎上升到了帶有宗教戰(zhàn)爭(zhēng)色彩的信仰之爭(zhēng)層面”。

在 9 月 16 日最新開源峰會(huì)的主題演講當(dāng)中,Torvalds 評(píng)論了 Linux 社區(qū)中 C 與 Rust 之爭(zhēng)。最近,微軟軟件工程師、Rust for Linux 維護(hù)者之一 Wedson Almeida 在給 Linux 內(nèi)核郵件列表 (LKML) 的一封信中表示自己已經(jīng)退出了該項(xiàng)目。在 Linux 內(nèi)核圈子里,一些開發(fā)人員和維護(hù)人員不想與 Rust 有任何關(guān)系,他們毫不避諱地表達(dá)了他們認(rèn)為該編程語(yǔ)言已經(jīng)失敗的觀點(diǎn)。
對(duì)此,即使是不介意爭(zhēng)論的 Torvalds 也承認(rèn),“有些爭(zhēng)論很激烈!
Torvalds 強(qiáng)調(diào),“我其實(shí)并不反感爭(zhēng)論,畢竟真理越辯越明。我認(rèn)為 Rust 的一大優(yōu)點(diǎn),在于它能讓某些討論煥發(fā)生機(jī),但也會(huì)讓不少爭(zhēng)論變得非常激烈……這至少表明很多人正深切關(guān)心這門語(yǔ)言。可另一方面,我也不太理解為什么 Rust 總會(huì)成為激起爭(zhēng)議的核心。這讓我想起年輕那會(huì),人們關(guān)于 vi 和 emacs 的大戰(zhàn)。不過(guò)出于某種原因,感覺(jué) Rust 和 C 的討論幾乎上升到了帶有宗教戰(zhàn)爭(zhēng)色彩的信仰之爭(zhēng)層面!
這場(chǎng)爭(zhēng)議可以追溯到三年之前,當(dāng)時(shí)就有人提出“Rust 可以成為內(nèi)核項(xiàng)目的一部分甚至取代 C 語(yǔ)言”的觀點(diǎn)。此時(shí)一切還都很正常,可后續(xù)情況卻很快走向了失控的邊緣。例如,使用 C 語(yǔ)言可能在 CPU 上產(chǎn)生著名的緩沖區(qū)溢出漏洞,但目前這類情況已經(jīng)很少出現(xiàn)。雖然 Rust 能夠提供某些安全功能,但也有自己的弊端,畢竟與相對(duì)容易掌握的 C 語(yǔ)言相比,其學(xué)習(xí)曲線明顯更加陡峭。
正如 Torvalds 在演講中的解釋,C 是一種相對(duì)“容易掌握的語(yǔ)言”,這也是“我喜歡 C 的原因之一,更是很多 C 語(yǔ)言程序員喜歡它的原因之一——但同時(shí)也必須承認(rèn),正是因?yàn)樗芎?jiǎn)單,所以很容易在使用時(shí)犯錯(cuò)誤。而 Rust 則完全不同。有很多人已經(jīng)習(xí)慣了 C 的思考模式,所以不一定能接受這種差異,但這其實(shí)沒(méi)什么!
不過(guò)必須承認(rèn),C 和 Rust 兩派的分歧很大。Torvalds 進(jìn)一步指出,“有些人就是不喜歡 Rust 提出的概念,也不喜歡 Rust 侵占自己的領(lǐng)域……不少人甚至斷言 Rust 的融合之路是失敗的。我之前就對(duì)此表達(dá)過(guò)反對(duì)——我們已經(jīng)在這方面探索了幾年,所以目前下結(jié)論還為時(shí)過(guò)早。但我也認(rèn)為,哪怕是失敗了(雖然我并不支持這種失敗論),這也是學(xué)習(xí)經(jīng)歷的一部分。所以我覺(jué)得推廣 Rust 是有積極意義的,可爭(zhēng)論過(guò)程中的很多人似乎并不這么看!
Torvalds 表示,挑戰(zhàn)在于內(nèi)存安全架構(gòu)對(duì)于基礎(chǔ)設(shè)施做出了某些假設(shè)。
“基礎(chǔ)設(shè)施人員可能會(huì)對(duì)此感到害怕,但這已經(jīng)是個(gè)公開的秘密了。換言之,基礎(chǔ)設(shè)施人員似乎在抵制這些變化。公平地講,我們對(duì) C 基礎(chǔ)設(shè)施也做了不少改變。內(nèi)核編碼其實(shí)在很大程度上也超出了常規(guī)的 C 語(yǔ)言范疇,我們不僅會(huì)以某種方式編寫代碼,同時(shí)也在 C 語(yǔ)言這邊部署了很多用于執(zhí)行語(yǔ)言之外基礎(chǔ)設(shè)施規(guī)則的工具方案。這就是我們對(duì)于安全性的探索和保障。我們?cè)?C 語(yǔ)言這邊其實(shí)建設(shè)了大量?jī)?nèi)存安全基礎(chǔ)設(shè)施,從技術(shù)上講它們并不屬于 C 的組成部分——而更多是我們內(nèi)核基礎(chǔ)設(shè)施的組成部分。我們擁有調(diào)試版本,能夠讓內(nèi)核運(yùn)行得更慢,同時(shí)對(duì)更多內(nèi)存安全要素進(jìn)行測(cè)試!
很明顯,Rust 和 C 語(yǔ)言各擅勝場(chǎng)。Rust 支持者們拿出了大量有力的論據(jù)(只要能夠編譯通過(guò),代碼質(zhì)量就有保障;而且泛用性更好等),而 C 語(yǔ)言派則認(rèn)為這位老將更容易學(xué)習(xí),而且在過(guò)去數(shù)十年的開發(fā)應(yīng)用中積累下了巨大的生態(tài)財(cái)富,更適用于以內(nèi)核為中心的 eBPF 開發(fā)。
正如思科 Isovalent 首席開源官 Liz Rice 在采訪中所言,Rust 更新,具有“非常強(qiáng)大的優(yōu)勢(shì),但并不是每個(gè)人都能立即適應(yīng)并掌握 Rust 的開發(fā)思路。不少在內(nèi)核中開發(fā) eBPF 子系統(tǒng)的人們,絕不可能突然轉(zhuǎn)過(guò)身來(lái)選擇 Rust 來(lái)完成日常工作。其實(shí)很多人都在討論這個(gè)問(wèn)題,比如說(shuō)「如果我們能用 Rust 處理所有開發(fā)任務(wù),那 eBPF 驗(yàn)證器就可以直接刪掉了,根本不需要它!沟艺J(rèn)為持這種說(shuō)法的朋友,其實(shí)沒(méi)有完全理解 eBPF 驗(yàn)證器的全部作用。我們可以用 Rust 編寫 eBPF 代碼并將其編譯為 eBPF 字節(jié)碼,這才是想要編寫 eBPF 的 Rust 開發(fā)者所應(yīng)當(dāng)選擇的路線。”
與此同時(shí),Polar Signals 公司 CEO 兼創(chuàng)始人 Frederic Branczyk 也在采訪中強(qiáng)調(diào),“Rust 中亦有不少實(shí)例證明,開發(fā)者必須先做一些非安全實(shí)踐,之后在此基礎(chǔ)上建立起安全的抽象。所以我絕不認(rèn)為 Rust 會(huì)成為搞定一切的萬(wàn)靈藥。順帶一提,我本身是 Rust 的忠實(shí)粉絲,可雖然 Rust 也能完成很多工作,但我還是認(rèn)為 C 才是操作系統(tǒng)編寫方面的理想語(yǔ)言。”
延伸閱讀:
C++ 之父 Bjarne Stroustrup:我會(huì)為全球數(shù)十億行 C++ 代碼帶來(lái)一個(gè)嶄新的解決方案
參考鏈接:
https://cppalliance.org/vinnie/2024/09/12/Safe-Cpp-Partnership.html
https://safecpp.org/P3390R0.html
https://www.youtube.com/watch?v=OM_8UOPFpqE&t=510s
https://www.theregister.com/2024/09/16/safe_c_plusplus/?td=rt-3a
https://www.youtube.com/watch?v=OM_8UOPFpqE&t=510s
https://thenewstack.io/linus-torvalds-c-vs-rust-debate-has-religious-undertones/
https://www.zdnet.com/article/linus-torvalds-muses-about-maintainer-gray-hairs-and-the-next-king-of-linux/
https://www.reddit.com/r/cpp/comments/1fiuhb7/the_empire_of_c_strikes_back_with_safe_c_proposal/
你好,我是飛宇。日常分享C/C++、計(jì)算機(jī)學(xué)習(xí)經(jīng)驗(yàn)、工作體會(huì),歡迎點(diǎn)擊此處查看我以前的學(xué)習(xí)筆記&經(jīng)驗(yàn)&分享的資源。
我組建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起進(jìn)群交流。

歡迎你添加我的微信,我拉你進(jìn)技術(shù)交流群。此外,我也會(huì)經(jīng)常在微信上分享一些計(jì)算機(jī)學(xué)習(xí)經(jīng)驗(yàn)以及工作體驗(yàn),還有一些內(nèi)推機(jī)會(huì)。


加個(gè)微信,打開另一扇窗
經(jīng)常遇到有讀者后臺(tái)私信想要一些編程學(xué)習(xí)資源,這里分享 1T 的編程電子書、C/C++開發(fā)手冊(cè)、Github上182K+的架構(gòu)路線圖、LeetCode算法刷題筆記等精品學(xué)習(xí)資料,點(diǎn)擊下方公眾號(hào)會(huì)回復(fù)"編程"即可免費(fèi)領(lǐng)取~

感謝你的分享,點(diǎn)贊,在看三  

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表