自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何從代碼層提高產(chǎn)品質(zhì)量

開發(fā) 開發(fā)工具 前端
本文的主題是如何從代碼層提高產(chǎn)品質(zhì)量,目前基本的方法是通過靜態(tài)代碼掃描和二進(jìn)制文件掃描,獲取產(chǎn)品代碼的漏洞,本文在此基礎(chǔ)上,對(duì)獲取的產(chǎn)品代碼漏洞進(jìn)行了深挖探索。

一、導(dǎo)讀

文章主要從四個(gè)方面說明:

  • 產(chǎn)品代碼漏洞檢查的背景和方法
  • 代碼漏洞的搜索深挖技術(shù)
  • 提高產(chǎn)品質(zhì)量的方法
  • 總結(jié)與展望

二、產(chǎn)品代碼漏洞檢查的背景和方法

1. why-為什么要檢查產(chǎn)品代碼的漏洞

一般情況下,產(chǎn)品質(zhì)量的問題多數(shù)與程序代碼相關(guān)。比如銀行軟件出現(xiàn)漏洞,導(dǎo)致十幾個(gè)客戶信用卡被盜刷。2003年阿麗亞娜5型火箭升空爆炸造成5億美元的損失。由于電控系統(tǒng)的軟件問題導(dǎo)致大面積停電事故,給交通,通信,居民生活造成嚴(yán)重影響等等,都是和產(chǎn)品代碼相關(guān)。代碼的漏洞檢查與分析可以幫助用戶從根源上減少70%-80%的產(chǎn)品崩潰和安全性問題。只有代碼中的崩潰和安全缺陷得以及時(shí)消除,最終形成的產(chǎn)品才能具備較高的質(zhì)量,有效降低整個(gè)產(chǎn)品風(fēng)險(xiǎn)。

2. when-什么時(shí)候檢查產(chǎn)品代碼的漏洞

在產(chǎn)品開發(fā)測(cè)試發(fā)布過程中,流程越往后,漏洞造成的影響越大。漏洞發(fā)現(xiàn)的越早,修復(fù)成本越低。

如下圖中紅色的曲線,橫坐標(biāo)是產(chǎn)品發(fā)布流程,縱坐標(biāo)是修復(fù)缺陷成本,可以看出,在測(cè)試階段,修復(fù)成本比較低,在產(chǎn)品發(fā)布之后,修復(fù)成本是成指數(shù)增長(zhǎng)的。

所以在產(chǎn)品測(cè)試階段,最好把產(chǎn)品代碼中的漏洞都檢查出來。那怎么對(duì)產(chǎn)品代碼的漏洞進(jìn)行檢查。

3. how-檢查產(chǎn)品代碼漏洞的方法

現(xiàn)階段一般有2種方法,而且這2種方法我們已經(jīng)實(shí)現(xiàn)了。

一種是源代碼的漏洞掃描與檢查,主要方法是對(duì)編碼規(guī)范的檢查,常見的編碼規(guī)范有4類,分別是錯(cuò)誤類,安全類,禁用類和建議類,具體內(nèi)容詳見下圖。自定義代碼規(guī)范的制定與實(shí)時(shí)更新,根據(jù)具體業(yè)務(wù)場(chǎng)景的代碼規(guī)范的制定等等方法都能很好的檢查出產(chǎn)品代碼的漏洞。

另外一種是對(duì)二進(jìn)制文件的漏洞掃描與檢查,比如google提供的veridex工具,可以掃描非法API調(diào)用,該工具將非法API分了3類。

4. 深度挖掘產(chǎn)品代碼漏洞的方法

通過上面介紹的2種方法,只能對(duì)特定代碼或二進(jìn)制進(jìn)行檢查,但是對(duì)產(chǎn)品,乃至整個(gè)公司的代碼倉(cāng)庫(kù),隱藏的bug卻是驚人的。

由此,在上述2種基礎(chǔ)的方法上,我們引入了另外一個(gè)技術(shù),代碼漏洞的搜索深挖技術(shù),簡(jiǎn)而言之,即代碼搜索。

[[316255]]

此外,經(jīng)過調(diào)研發(fā)現(xiàn),國(guó)外也有類似的研究,NASA,microsoft等機(jī)構(gòu)已經(jīng)利用代碼搜索技術(shù),發(fā)現(xiàn)了多個(gè)零日漏洞。

三、代碼漏洞的搜索深挖技術(shù)

1. 代碼搜索的問題和挑戰(zhàn)

主要是6個(gè)困難點(diǎn),如下圖所示。

  • 代碼特征的確定
  • 搜索速度慢
  • 代碼信息量太少,不好定位漏洞。
  • 代碼入庫(kù)非常緩慢
  • 過濾條件不好兼容
  • 數(shù)據(jù)量大,搜索數(shù)據(jù)量高達(dá)千萬級(jí)代碼文件。

針對(duì)這些問題我們做了一序列的優(yōu)化和改進(jìn)。

2. 代碼搜索的技術(shù)架構(gòu)

主要是5部分,如下圖所示。

  • python后臺(tái)部分用于增量更新數(shù)據(jù)源信息和實(shí)時(shí)更新索引。
  • 正排數(shù)據(jù)源,主要采用mysql數(shù)據(jù)庫(kù),包括表結(jié)構(gòu)的設(shè)計(jì),索引和分表設(shè)計(jì)等。
  • Sphinx實(shí)時(shí)分布式索引,用于提供索引創(chuàng)建服務(wù)和搜索索引服務(wù)等。
  • Php+nginx服務(wù)端部分,為前端提供接口服務(wù)。
  • 前端部分,用于展示搜索結(jié)果和后臺(tái)管理等。

3. 代碼搜索的服務(wù)端

代碼搜索的服務(wù)端為前端或其他系統(tǒng)提供API接口,一共有6大模塊,包括搜索模型,登錄模型,校驗(yàn)?zāi)P?,用戶模塊,日志模塊,代碼review模塊。數(shù)據(jù)庫(kù)為上述6大模塊提供數(shù)據(jù)支持。

4. 代碼搜索的后臺(tái)

大致分為3層:最下面一層數(shù)據(jù)來源層,支持svn和git的代碼倉(cāng)庫(kù),來源包括qbuild系統(tǒng)和授權(quán)系統(tǒng),獲取代碼日志,增量下載文件,最后存儲(chǔ)在數(shù)據(jù)庫(kù)中。索引層主要是從數(shù)據(jù)源中獲取文檔信息,然后經(jīng)過分詞模型,倒排索引算法,將索引存儲(chǔ)在文件系統(tǒng)中。

服務(wù)層主要是sphinx索引工具提供的索引服務(wù),通過排序,獲取索引文檔信息后,從正排數(shù)據(jù)庫(kù)中拿到文檔全部信息,返回結(jié)果數(shù)據(jù)。

5. 數(shù)據(jù)源增量入庫(kù)方案

代碼搜索的困難點(diǎn)之一是數(shù)據(jù)源入庫(kù)非常慢,針對(duì)這個(gè)問題,我們有如下的優(yōu)化方案,數(shù)據(jù)源的增量入庫(kù)方案。

主要有8個(gè)步驟:

  • 分別是從qbuild或授權(quán)系統(tǒng)獲取代碼地址
  • 獲取當(dāng)前代碼地址的提交日期
  • 根據(jù)提交日期獲取代碼提交日志
  • 通過解析日志,獲取增量文件列表,然后每個(gè)文件進(jìn)行下面的處理,先進(jìn)行去重判斷
  • 然后下載該文件,再進(jìn)行去重判斷
  • 存儲(chǔ)在數(shù)據(jù)源中
  • 經(jīng)過分詞工具
  • 最終實(shí)時(shí)存儲(chǔ)索引

這個(gè)過程比較長(zhǎng),但是分解到每一步,卻比較容易實(shí)現(xiàn),比如獲取代碼提交日志和代碼文件下載,svn對(duì)應(yīng)的命令可以參考如下。

  1. svn log -r {0} --xml -v "{1}" --username "{2}" --password "{3}" --non-interactive --no-auth-cache --trust-server-cert> {4} 
  2. svn export -r {0} "{1}" "{2}" --force --username {3} --password "{4}" --non-interactive --no-auth-cache --trust-server-cert 

在數(shù)據(jù)源增量入庫(kù)方案中,有一個(gè)很大的問題需要解決,就是重復(fù)的問題??梢钥匆幌?,對(duì)于svn有路徑包含重復(fù)的問題,下面那個(gè)路徑是包含上面那個(gè)路徑的,上面那個(gè)路徑將會(huì)被入庫(kù)2次。

  1. http://svn.example.com/svn/testxxx/111/222/333 
  2. http://svn.example.com/svn/testxxx/111 

Git也有相似的問題,分支重復(fù),不同分支代碼會(huì)有大量重復(fù)提交的記錄。

  1. http://git.example.com/root/11 分支:master 
  2. http://git.example.com/root/11 分支:v1.1 

我們的去重方法是,針對(duì)svn,利用模塊id+revision的方式,對(duì)于svn,同一個(gè)模塊id下的revison是遞增的,不會(huì)有重復(fù)問題。相應(yīng)的,git是通過倉(cāng)庫(kù)id+提交sha1值去重的,對(duì)于同一個(gè)倉(cāng)庫(kù),提交的sha1值是唯一的。

6. 實(shí)時(shí)分布式索引技術(shù)

代碼搜索系統(tǒng)遇到的另外一個(gè)困難是搜索太慢,為此我們引入了sphinx索引工具,為什么選擇sphinx索引工具呢。該工具支持高達(dá)數(shù)十億個(gè)文檔,數(shù)TB的數(shù)據(jù)和每秒數(shù)千個(gè)查詢。支持各種數(shù)據(jù)源,包括xml,sql,python等。支持結(jié)果的各種過濾聚合功能,快速高效的索引,應(yīng)用場(chǎng)合廣泛,比如維基百科,優(yōu)酷土豆,github等。下圖是今年的索引工具的排行榜,可以看到sphinx排在第5,受眾范圍廣。

(1) sphinx工具使用

Sphinx主要包括3個(gè)可用的工具:

分別是index實(shí)時(shí)索引工具,主要是對(duì)數(shù)據(jù)源的數(shù)據(jù)進(jìn)行倒排索引,并存儲(chǔ),使用命令如下,sphinx.conf是sphinx的配置文件。

  1. eg: /usr/local/sphinx/bin/indexer -c sphinx.conf code 

Searchd搜索服務(wù)工具,php可以通過sphinx擴(kuò)展,訪問該服務(wù),使用命令如下。

  1. eg: /usr/local/sphinx/bin/searchd -c sphinx.conf & 

Search搜索工具,客戶端搜索工具,可以用該工具測(cè)試索引的正確性,一般只是測(cè)試使用。

  1. eg: /usr/local/sphinx/bin/search -c sphinx.conf mykeyword 

可以看到這3個(gè)命令都用到了sphinx的配置文件,那么這個(gè)文件怎么配置。

(2) sphinx實(shí)時(shí)分布式的配置詳情

一般情況下,最初會(huì)采用主索引和增量索引的方式,但是隨著數(shù)據(jù)的增加,服務(wù)和運(yùn)維都有壓力,通過優(yōu)化,我們最終采用實(shí)時(shí)分布式的方式。實(shí)時(shí)索引的好處有,代碼索引無延時(shí),沒有額外的定時(shí)程序更新和合并索引服務(wù),降低運(yùn)維成本,提高搜索精確性和可靠性。分布式的好處有,資源利用率提高,搜索效率提高,搜索并發(fā)性提高等

實(shí)時(shí)分布式的配置如下:

  • 第1個(gè)實(shí)時(shí)索引的配置,type是rt,也就是realtime,path表示該索引存儲(chǔ)的位置,下面幾行是字段的定義,rt_field就是需要索引的字段,rt_attr_uint和rt_attr_timestamp是索引字段的屬性,一個(gè)是int類型,一個(gè)是時(shí)間戳類型。
  • 第2個(gè)配置是分布式配置,type是distributed,下面幾行是分布式位置。
  • 第3個(gè)配置是索引服務(wù)配置,9312接口是提供索引服務(wù)的,9306是接收實(shí)時(shí)索引服務(wù)的,下面2行是日志位置。
    1. index coderealtime 
    2. {   
    3.   type = rt 
    4.   path = user/local/sphinx/indexer/files/coderealtime 
    5.   rt_field = content 
    6.   rt_field = filename 
    7.   rt_attr_uint = rpid 
    8.   rt_attr_timestamp = cdate 
    9. index codedistributed 
    10.   type = distributed 
    11.   local = coderealtime 
    12.   agent = localhost:9312:crt1 
    13.   agent = localhost:9312:crt2 
    14. searchd 
    15.   listen      = 9312 
    16.   listen      = 9306:mysql41 
    17.   log        = /user/local/sphinx/indexer/logs/searchd.log 
    18.   query_log    = /user/local/sphinx/indexer/logs/query.log 

(3) 代碼搜索排序方法

代碼搜索最重要的一個(gè)指標(biāo)就是排序方法,本方案,主要從3個(gè)方面對(duì)代碼結(jié)果進(jìn)行排序,分別是詞組評(píng)分,代碼提交時(shí)間,和BM25算法。這3個(gè)指標(biāo)中最重要的是BM25算法,下面簡(jiǎn)單的介紹該算法的實(shí)現(xiàn)方法,公式如下:

Score(Q,d)是衡量某次query查詢和文檔的相關(guān)性計(jì)算公式,d表示當(dāng)前文檔,Q是query中所有的關(guān)鍵字集合,qi是其中的某個(gè)關(guān)鍵詞,n是Q的長(zhǎng)度,Wi是這個(gè)詞的權(quán)重,R(q,d)是這個(gè)詞和文檔的權(quán)重。Wi默認(rèn)是IDF值,N表示所有文檔數(shù),n(qi)表示包含該關(guān)鍵詞的文檔數(shù),0.5是避免n(qi)為0的情況。大致的意思是關(guān)鍵詞在所有文檔中出現(xiàn)頻率越多說明越普遍,就越不重要,權(quán)重越低。R(q,d)是這個(gè)詞和文檔的權(quán)重,大致的意思是某個(gè)關(guān)鍵詞在該篇文檔出現(xiàn)的次數(shù)越多,說明越重要。

Wi突出的全局的權(quán)重,R(q,d)表示的局部權(quán)重。舉個(gè)通俗的例子,在圖書查找過程中,比如[作者]這個(gè)詞,幾乎在所有書中都會(huì)出現(xiàn),所以[作者]這個(gè)詞的權(quán)重很低,[人工智能]這個(gè)詞不常見,如果某個(gè)圖書中經(jīng)常提到人工智能這個(gè)詞,大概率這本書在講人工智能。BM25算法通過統(tǒng)計(jì)的方法,就能對(duì)代碼進(jìn)行合理的排序。

四、提高產(chǎn)品質(zhì)量的方法

如何利用代碼搜索技術(shù)提高產(chǎn)品質(zhì)量,主要是2種方法:

  • 第1種方法是結(jié)合業(yè)務(wù)督促開發(fā)修復(fù)代碼漏洞,一方面根據(jù)前面介紹的檢查產(chǎn)品代碼漏洞的2種方法,根據(jù)這些檢查出來的漏洞進(jìn)行深度搜索,將產(chǎn)品和公司代碼庫(kù)中隱藏的漏洞都修復(fù)了,去除產(chǎn)品隱患,另一方面結(jié)合業(yè)務(wù),比如某個(gè)函數(shù)實(shí)現(xiàn)有漏洞,可以根據(jù)函數(shù)名進(jìn)行搜索,查看函數(shù)調(diào)用的模塊,避免代碼漏洞的擴(kuò)散。
  • 第2種方法是對(duì)產(chǎn)品代碼的敏感詞的檢查,比如代碼審計(jì)系統(tǒng)的敏感詞和禁用api的檢查,文件簽名系統(tǒng)的敏感簽名信息的檢查等。

下面這個(gè)圖是代碼搜索的一個(gè)demo,主要有3部分構(gòu)成,最上面是搜索輸入,中間是過濾條件,包括時(shí)間,代碼語(yǔ)言,歸屬人,代碼倉(cāng)庫(kù)。最下面是搜索的結(jié)果,主要包括文件名,倉(cāng)庫(kù)名,文件位置,版本號(hào),提交日期和歸屬人,測(cè)試人員可以根據(jù)倉(cāng)庫(kù)和歸屬人信息找到對(duì)應(yīng)的開發(fā)負(fù)責(zé)人,進(jìn)而督促修復(fù)漏洞。

五、總結(jié)與展望

本文主要從3個(gè)部分闡述了如何從代碼層提高產(chǎn)品質(zhì)量:

  • 第一部分是產(chǎn)品代碼漏洞檢查的背景和方法,主要講了檢查產(chǎn)品代碼漏洞的2種方法,即源代碼漏洞掃描與檢查、二進(jìn)制文件漏洞掃描與檢查,但是這2種方法只能對(duì)特定項(xiàng)目的代碼進(jìn)行檢查,隱藏的bug量是巨大的,從而引出第二部分,代碼漏洞的搜索深挖技術(shù)。
  • 第二部分是本文的重點(diǎn),展開講了代碼搜索的技術(shù)方案及實(shí)現(xiàn)細(xì)節(jié)
  • 第三部分從2個(gè)方面說明了如何利用代碼搜索技術(shù)提高產(chǎn)品質(zhì)量。

代碼搜索系統(tǒng)能夠快速定位問題,通過對(duì)細(xì)節(jié)的不斷探索,搜索速度顯著提升,搜索排序質(zhì)量提高了,本系統(tǒng)輔助優(yōu)化了產(chǎn)品代碼質(zhì)量。接下來,我們將從2方面進(jìn)一步優(yōu)化,分別是代碼推薦結(jié)合代碼語(yǔ)義上下文和AI的方法,進(jìn)一步提升代碼推薦的精確度,以及函數(shù)式的代碼推薦。

【本文是51CTO專欄機(jī)構(gòu)360技術(shù)的原創(chuàng)文章,微信公眾號(hào)“360技術(shù)( id: qihoo_tech)”】

戳這里,看該作者更多好文

 

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2020-12-15 11:14:55

物聯(lián)網(wǎng)工業(yè)4.0數(shù)據(jù)

2019-08-21 14:08:21

物聯(lián)網(wǎng)維護(hù)性維護(hù)傳感器

2019-08-26 10:10:37

物聯(lián)網(wǎng)技術(shù)數(shù)據(jù)

2009-03-12 10:36:42

軟件測(cè)試職場(chǎng)

2024-11-12 15:03:26

2019-08-15 15:40:14

2022-02-09 10:00:08

人工智能工業(yè)物聯(lián)網(wǎng)

2023-05-19 10:49:39

2017-05-31 11:57:17

云計(jì)算小鳥云質(zhì)量

2022-07-28 09:54:41

Testin

2022-08-01 15:43:00

性能指標(biāo)軟件開發(fā)

2021-02-05 12:58:18

開發(fā)人員CICD

2023-11-29 15:53:45

2017-05-26 10:45:49

云計(jì)算公有云質(zhì)量

2020-06-10 21:57:41

工業(yè)4.0預(yù)測(cè)性維護(hù)物聯(lián)網(wǎng)

2019-07-16 09:20:44

人工智能硬件Linux

2019-12-24 10:28:35

開發(fā)者技能工具

2012-11-05 10:51:08

2021-07-16 14:12:57

數(shù)字化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)