Google 如何建立程序分析生態(tài)系統(tǒng)_第1頁
Google 如何建立程序分析生態(tài)系統(tǒng)_第2頁
Google 如何建立程序分析生態(tài)系統(tǒng)_第3頁
Google 如何建立程序分析生態(tài)系統(tǒng)_第4頁
Google 如何建立程序分析生態(tài)系統(tǒng)_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Google如何

建立程序分析生態(tài)系統(tǒng)2023/2/5Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage2程序員已經很忙了工具必須非常重視是否讓開發(fā)人員花費更多額外的時間來處理工具的結果;任何自動工具的輸出都會使開發(fā)人員從原來的開發(fā)思考停頓下來;好的工具應該給盡量少的打擾開發(fā)人員,并為開發(fā)人員帶來更多的附加值;工具的問題Highfalsepositive

rates(高誤報率)Confusingoutput(令人費解的輸出報告)Poorintegrationintothedevelopers’workflow(不能很好的融合到程序員的日常的開發(fā)流程中)平臺擴展的問題Google存在不同的框架和開發(fā)語言;一個理想的平臺能夠適應這些需求能夠讓各領域的專家來編寫自己的檢查工具,而不需要額外的應用成本;Google的業(yè)務需求不能滿足google巨大代碼量的需求,一個完整的編譯過程是無法用一臺機器完成的;分析必須能夠被拆分(shared),并且能夠分析拆分的信息,得到這部分的結果。分塊的分析必須能夠在極短的時間內完成,在幾分鐘內得到結果;靜態(tài)分析存在的問題Page3能夠普遍地、積極地、主動地被程序員用來修復程序中存在的問題(bewidelyandactivelyusedbydeveloperstofixproblemsintheircode,withoutpromptingfromasmallgroupofadvocatesormanagement);無縫地整合到現(xiàn)有的開發(fā)流程中(integratesmoothlyintotheexistingdeveloperworkflow);能夠度量所有的代碼(scaletothesizeofanindustrialcodebase);授權給開發(fā)者(甚至他們不是分析專家),讓他們自己能夠編寫他們自己的檢查規(guī)則(empowerdevelopers,evennon-analysisexperts,towriteanddeploytheirownstaticanalyses).理想的靜態(tài)分析平臺Page4Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage5項目目標WepresentTRICORDER,aprogramanalysisplatformaimedatbuildingadata-driven

ecosystemaroundprogramanalysis.Wepresentasetofguiding

principlesforourprogramanalysistoolsandascalablearchitecture

forananalysisplatformimplementingtheseprinciples.

Weincludeanempirical,in-situevaluationofthetoolasitis

usedbydevelopersacross

Googlethatshowstheusefulnessand

impactoftheplatform.TRICORDER構建一個圍繞程序分析,以數據驅動的程序分析平臺;建立一套程序分析工具的應用規(guī)則;平臺通過度量(使用、效果)方式實施這些規(guī)則,并與開發(fā)流程融合。通過建立一個在開發(fā)程序員和規(guī)則開發(fā)者之間的閉環(huán)的反饋系統(tǒng),來完成問題的反饋、自動修復(部分);一個建立在程序員在開發(fā)流程中應用工具的具體信息數據來度量的平臺;一個以微服務構建的適用google的代碼項目規(guī)模的平臺。每天會產生9,3000的掃描報告,但僅由2-3人維護的系統(tǒng);Page6Page7息處理類:

可以無線下載目標終端的數據。包括非星聯(lián)系統(tǒng),并且可以處理和分析數據。三錄儀也可以作為一個數據終端,多臺可以聯(lián)網處理數據。掃描器類:

通過掃描波束來確定目標的介質,化學成分等,也可以掃描周圍的空間組成,探測此范圍內的生命信號,以及對目標物體成像,醫(yī)用的CT等。工程技術類:

可以通過掃描來診斷設備的故障。并且優(yōu)化顯示故障排除方法。TRICORDER是一種手持式的多用途儀器。它是星際旅行里經常要用到的一種必備儀器。/operations/tricorder.htmlThetricorderof2266wasacompactinstrumentthatfeaturedscanning,recording,andcomputingtechnology.

Star

trek–星際迷航星際迷航中的科技:平板電腦(PAAD)、GPS、大顯示屏、宇宙翻譯機、自動門、手機、傳送器、復制機、全息技術、曲速旅行、視屏會議等等。。。史蒂芬·霍金2002年《果殼中的宇宙》--即使把我關在果殼之中,仍然自以為無限宇宙之王Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage8許多工程師都是在一個很大的代碼庫上進行開發(fā)的performmorethan800kbuilds,run100Mtestcases,produce2PBofbuildoutputs,andsend30kchangelistsnapshots(patchdiffs)forreview大代碼庫使代碼重用和重構變得非常容易和普遍;Google有極強的整合測試的測試文化(Googlehasastrongtestingculture

backedbycontinuoustestinginfrastructure)Google采用一套統(tǒng)一的標準的構建和發(fā)布系統(tǒng)(Googleengineersuseastandardized,distributedbuildsystemtoproducehermeticbuildsfromsourcecode);統(tǒng)一的構建系統(tǒng)為代碼分析提供了統(tǒng)一的接入點Google有極強的代碼審視文化每一個Changelist都會被在checked-in之前被審視Google的開發(fā)特點Page9要求開發(fā)人員能夠方便的運行分析工具,能夠快速地得到結果Google的Codereview工具類似gerritPage10/p/gerrit/issues/listprovidestheabilitytocommentonlinesofcode,replytoexistingcomments,uploadnewsnapshotsofthecodebeingreviewed(author),approvethechangelist(reviewer).Google曾經嘗試過將以下工具整合到開發(fā)流程中Find-Bugs,Coverity,Klocwork,缺陷預測理論(faultprediction)這些工具存在的問題與工作流程的整合太晚:只有在提交代碼之后才能得到結果太早:開發(fā)人員還在調試代碼的時候就出現(xiàn)了幾乎都需要運行單獨的命令,不能與編譯器整合在一起掃描的規(guī)模。這個問題在桌面工具有為突出高誤報率結論當工具有單獨的命令或即使通過儀表盤來運行的時候,使用量會慢慢減少Google的程序分析Page11Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage12沒有誤報(Nofalsepositives)研究表明誤報是程序員不愿意采用分析工具去發(fā)現(xiàn)bug的主要原因之一Google理解為有效的誤報率(effectivefalsepositive)標示工具不確定的告警(這類問題往往是因為工具得到的信息不足)能提高代碼可讀性的缺陷,不被認為是誤報;不過度分析,不考慮實際中不會出現(xiàn)的情景(theoreticalfalsepositives)Google的程序分析理論—沒有誤報Page13讓開發(fā)人員來決定工具的作用和誤報率developerswilldecidewhetherananalysistoolhashighimpact,andwhatafalsepositiveis.Google的程序分析理論—用戶參與Page14用戶參與(Empoweruserstocontribute)只有用戶自己最了解自己的項目,讓他們自己來寫規(guī)則,并對結果負責;這些領域的專業(yè)人員并不了解如何和流程的整合,這也是平臺的作用;為了保證質量我們和開發(fā)規(guī)則人員約定規(guī)則下線條款:沒有人使用這個檢查(Nooneisfixingbugsfiledagainsttheanalyzer.)資源的使用影響了系統(tǒng)(Resourceusage(e.g.CPU/disk/memory)isaffectingTRICORDERperformance)分析報告讓開發(fā)人員困惑(Theanalyzerresultsareannoyingdevelopers)經驗表明自豪感會讓規(guī)則的開發(fā)者有著強烈的主動性去避免規(guī)則下線。Google的程序分析理論—數據提高可用性Page15數據提高可用性(Makedata-drivenusabilityimprovements)問題響應非常重要。程序員和工具建立信任關系,這種信任會因為對報告的不理解迅速減低;一款工具的bug在改進了用詞或連接到了幫助文檔后,75%被修復;建立一個反饋系統(tǒng)能很好的提升工具的可用性;Google的程序分析理論—工作流整合是關鍵Page16工作流整合是關鍵(Workflowintegrationiskey)與工作流整合是提高工具的效果的關鍵因素;工具的觸發(fā)最好由:編輯代碼editingcode,運行編譯runningabuild,創(chuàng)建或更新修改表creating/updatingachangelist,提交一個更新表submittingachangelist.掃描的報告最好在提交代碼之前得到一個調查表明程序員期望在編譯時就得到檢查報告的人數是在提交修改列表時的兩倍;在編譯時檢查,就要求有效的誤報率要幾乎等于0,最高不超過5%Tricorder與工作流的整合Page17編譯器分析工具與編譯告警一起送給開發(fā)者提交代碼審核分析工具一起送給代碼審計者要求:速度快,誤報<5%要求:5-10分鐘,誤報<10%開發(fā)流程審計流程修改代碼IDE本地分析工具遠端分析工具每日構建分析工具分析報告專職團對專職處理TricorderGoogle的程序分析理論—根據項目定制Page18根據項目定制(Projectcustomization,notusercustomization)Google的經驗表明,用戶的自定義(對告警的標準不一),將導致團隊內部的混亂;不采用告警處理優(yōu)先級和嚴重等級的設定,只顯示嚴重等級的問題;我們能夠取消或改善低優(yōu)先級、收益小的檢查由結果過濾器改為自定義分析器;我們大大減少了,為什么有些結果會出現(xiàn),為什么結果的看法不一致等問題。給項目組一定的定制權,讓項目組來決定是否采用可選分析器沒有誤報(Nofalsepositives)用戶參與(Empoweruserstocontribute)數據提高可用性(Makedata-drivenusabilityimprovements)根據項目定制(Projectcustomization,notusercustomization)Google的程序分析理論--小結Page19Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage20Tricorder的架構Page21Google-specificRPClibraryJavaAnalyzerC++AnalyzerPythonAnalyzerGoAnalyzerlanguage-specificinterfaceLanguageanalyzerservicesCommonlanguage-agnosticprotocolbufferAPICompileranalyzerservicesClangPlugInjavacjscompilerLinterworkserviceslanguage-specificinterfaceGetCategoryGetStageAnalyzeThecategory(andoptionallysubcategory)oftheanalysisresult.Thelocationoftheanalysisresultinthecode,e.g.fileandrange(line/column)withinthatfile.Theerrormessage.AURLwithmoredetailedinformationabouttheanalyzerand/orthemessage.Anorderedlistoffixes./google/shipshapeTricorder的三個階段Page22文件階段(FILES)處理修改的文件依賴階段(DEPS)處理修改文件的依賴文件編譯階段(COMPILATION)處理編譯的文件分階段的優(yōu)點能夠在更快的提供報告,而不需要等到構建完成可以降低成本高的資源的使用不影響在更早的時候開發(fā)分析Tricorder的AnalyzerPage2316of30analyzersruninTRICORDER大約9,7000與目標總數9,3000相當35Linter7analyzer告警必須簡單、容易理解,能夠明確修復(Thewarningshouldbeeasytounderstandandthe

fixshouldbeclear);告警應該有非常小的誤報率(<10%)(Thewarningshouldhaveveryfewfalsepositives.),同樣的標準也用于Coverity等其他工具告警應該有足夠的嚴重程度(Thewarningshouldbeforsomethingthathasthepotentialforsignificantimpact.)告警應該是發(fā)生次數少但經常被注意的問題(Thewarningshouldoccurwithasmallbutnoticeablefrequency.)如果這個問題經常出現(xiàn),意味著它的危害不大,不應該給出過多的告警。Tricorder的Analyzer規(guī)則評定標準Page24存在爭議的問題:檢測工具已經檢測出問題來了,還讓很忙的程序員自己來處理問題?Google鼓勵這么做,通過代碼review工具。Tricorder問題的修復Page25這樣做的好處是:讓程序員方便修復更好地解釋報告修復不是直接修改代碼,而是提供修改的按鈕。為了快速提供反饋信息,Tricorder和代碼審計工具連通(robocomment)。在每個問題上有四個連接:NOTUSEFULPLEASEFIXPREVIEWFIX(Show)APPLYFIX(Apply)not-usefulrate=NOTUSEFUL/(NOTUSEFUL+PLEASEFIX+APPLYFIX)>=10%進入觀察區(qū)>25%考慮立刻下線很多時候是和Analyzer的編制者一起來看問題的發(fā)生原因不適合的項目不在意一時的波動Tricorder反饋系統(tǒng)Page26可用性(Usability)用無用率(Not-usefulrate)來衡量工具的可用性。目前<5%Tricorder運行結果–可用性Page27Tricorder運行結果–可用性Page28Privew_fix和Please_fix相關點擊率統(tǒng)計結果的一些思考許多開發(fā)人員在審核人員查看之前完成問題修復,所以PLEASE_FIX數量低;許多開發(fā)人員在IDE里修復問題,所以APPLY_FIX數量低;開發(fā)人員會忽略他們不打算修復問題,而不是點擊NOT_USEFUL,這暗示他們對這些問題看法的強烈程度;開發(fā)人員可能錯誤地點擊了NOT_USEFUL好的Analyzer的NOT_USEFUL率在0-3%隨著時間推移,減少了問題代碼的入庫;開發(fā)人員通過問題的學習,相同的問題數量減少了;Tricorder運行結果–代碼庫的影響Page29平均一天發(fā)現(xiàn)30個分類的9,3000問題;運行5,000次構建;審核人平均點PLEASE_FIX716次,其中416次屬于Linters),48次NOT_USEFUL.Tricorder運行結果–運營能力Page30平均每個CL有兩個PLEASE_FIX,無NOT_USEFUL通過數據驅動可用性的提高;開發(fā)人員不喜歡誤報,所以需要建立一個快速反饋系統(tǒng)來聽取他們的意見;讓用戶自己來建立自己的檢查規(guī)則;檢查工具和工作流程融合非常重要,實踐表明最好的融合點是代碼審視階段;檢查工具的定制是項目定制,而不是用戶定制;簡單的規(guī)則會起到很大的作用(Google并未采用復雜技術的檢查工具);工具的目的是修復bug,而不是發(fā)現(xiàn)bug;Tricorder實施經驗回顧Page31Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage32檢查工具的結果要和IDE/代碼審視工具融合;檢查工具需要給出清晰的解釋,提供修復的方法建立信息的反饋系統(tǒng),聽取開發(fā)人員對工具的看法,及時作出反應;考慮建立編譯器的插件,完成編譯時的檢查;在掃描報告中加入更多的錯誤修改方法的說明,以及相關知識庫的連接信息;思考Page33工具最好與工作流整合,減少對程序員的干擾。最好通過編譯與代碼審視工具整合在一起;通過代碼審視工具收集工具的效果信息;收集的信息,評估工具的效果;工具需要給出盡可能詳細的幫助信息,甚至能夠輔助開發(fā)人員完成修改;Google的代碼檢查理念Page34Tricorder與工作流的整合Page35編譯器分析工具與編譯告警一起送給開發(fā)者提交代碼審核分析工具一起送給代碼審計者要求:速度快,誤報<5%要求:5-10分鐘,誤報<10%開發(fā)流程審計流程修改代碼IDE本地分析工具遠端分析工具每日構建分析工具分析報告專職團對專職處理Tricorder通過代碼審視工具收集工具的使用效果Page36Not-usefulrate=NOTUSEFUL/(NOTUSEFUL+PLEASEFIX+APPLYFIX)NOTUSEFULPLEASEFIXPREVIEWFIX(Show)APPLYFIX(Apply)Tricorder:BuildingaProgramAnalysisEcosystemmicroservices/articles/microservices.htmlReferencePage37AddressSanitizerisafastmemoryerrordetector.Itconsistsofacompilerinstrumentationmoduleandarun-timelibrary.Thetoolcandetectthefollowingtypesofbugs:Out-of-boundsaccessestoheap,stackandglobalsUse-after-freeUse-after-return(runtimeflag

ASAN_OPTIONS=detect_stack_use_after_return=1)Use-after-scope(clangflag

-fsanitize-address-use-after-scope)Double-free,invalidfreeMemoryleaks(experimental)AddressSanitizerPage38/docs/AddressSanitizer.htmlErrorProneisastaticanalysistoolforJavathatcatchescommonprogrammingmistakesatcompile-time.ErrorPronePage39/google/error-prone/bugpatternsArgumentParameterSwap

Theargumentandparameternamesdonotmatchexactly.ArrayEquals

ReferenceequalityusedtocomparearraysArrayHashCode

hashcodemethodonarraydoesnothasharraycontentsArrayToString

CallingtoStringonanarraydoesnotprovideusefulinformationArraysAsListPrimitiveArray

Arrays.asListdoesnotautoboxprimitivearrays,asonemightexpect.AsyncFunctionReturnsNull

AsyncFunctionshouldnotreturnanullFuture,onlyaFuturewhoseresultisnull.BadShiftAmount

ShiftbyanamountthatisoutofrangeChainingConstructorIgnoresParameter

Thecalledconstructoracceptsaparameterwiththesamenameandtypeasoneofitscaller'sparameters,butitscallerdoesn'tpassthatparametertoit.It'slikelythatitwasintendedto.CheckReturnValue

Ignoredreturnvalueofmethodthatisannotatedwith@CheckReturnValueClassName

Thesourcefilenameshouldmatchthenameofthetop-levelclassitcontainsComparisonOutOfRange

ComparisontovaluethatisoutofrangeforthecomparedtypeCompileTimeConstant

Non-compile-timeconstantexpressionpassedtoparameterwith@CompileTimeConstanttypeannotation.ConstantOverflow

Compile-timeconstantexpressionoverflowsDaggerProvidesNull

Dagger@Providesmethodsmaynotreturnnullunlessannotatedwith@NullableDeadException

ExceptioncreatedbutnotthrownDepAnn

Deprecateditemisnotannotatedwith@DeprecatedEqualsNaN

==NaNalwaysreturnsfalse;usetheisNaNmethodsinsteadForOverride

Methodannotated@ForOverridemustbeprotectedorpackage-privateandonlyinvokedfromdeclaringclassFuturesGetCheckedIllegalExceptionType

Futures.getCheckedrequiresacheckedexceptiontypewithastandardconstructor.GetClassOnAnnotation

CallinggetClass()onanannotationmayreturnaproxyclassGetClassOnClass

CallinggetClass()onanobjectoftypeClassreturnstheClassobjectforjava.lang.Class;youprobablymeanttooperateontheobjectdirectlyGuardedByChecker

Checksforunguardedaccessestofieldsandmethodswith@GuardedByannotationsGuavaSelfEquals

AnobjectistestedforequalitytoitselfusingGuavaLibrariesGuiceAssistedInjectScoping

ScopeannotationonimplementationclassofAssistedInjectfactoryisnotallowedGuiceAssistedParameters

Aconstructorcannothavetwo@Assistedparametersofthesametypeunlesstheyaredisambiguatedwithnamed@Assistedannotations.GuiceInjectOnFinalField

AlthoughGuiceallowsinjectingfinalfields,doingsoisdisallowedbecausetheinjectedvaluemaynotbevisibletootherthreads.HashtableContains

contains()isalegacymethodthatisequivalenttocontainsValue()IdentityBinaryExpression

Writing"a&&a","a||a","a&a",or"a|a"isequivalentto"a".InfiniteRecursion

Thismethodalwaysrecurses,andwillcauseaStackOverflowErrorInjectMoreThanOneScopeAnnotationOnClass

Aclasscanbeannotatedwithatmostonescopeannotation.InsecureCipherMode

Cipher.getInstance()isinvokedusingeitherthedefaultsettingsorECBmodeInvalidPatternSyntax

InvalidsyntaxusedforaregularexpressionIsInstanceOfClass

TheargumenttoClass#isInstance(Object)shouldnotbeaClassJUnit3TestNotRun

Testmethodwillnotberun;pleaseprefixnamewith"test"JUnit4SetUpNotRun

setUp()methodwillnotberun;Pleaseadda@BeforeannotationJUnit4TearDownNotRun

tearDown()methodwillnotberun;Pleaseaddan@AfterannotationJUnit4TestNotRun

Testmethodwillnotberun;pleaseadd@TestannotationJavaxInjectOnAbstractMethod

Abstractanddefaultmethodsarenotinjectablewithjavax.inject.InjectLongLiteralLowerCaseSuffix

Prefer'L'to'l'forthesuffixtolongliteralsMislabeledAndroidString

Certainresourcesin

android.R.string

havenamesthatdonotmatchtheircontentMisusedWeekYear

Useof"YYYY"(weekyear)inadatepatternwithout"ww"(weekinyear).Youprobablymeanttouse"yyyy"(year)instead.MockitoCast

AbuginMockitowillcausethistesttofailatruntimewithaClassCastExceptionMockitoUsage

Missingmethodcallforverify(mock)hereModifyingCollectionWithItself

Usingacollectionfunctionwithitselfastheargument.MoreThanOneInjectableConstructor

Thisclasshasmorethanone@Inject-annotatedconstructor.Pleaseremovethe@Injectannotationfromallbutoneofthem.NonCanonicalStaticImport

Staticimportoftypeusesnon-canonicalnameNonFinalCompileTimeConstant

@CompileTimeConstantparametersshouldbefinalOptionalEquality

ComparisonusingreferenceequalityinsteadofvalueequalityOverlappingQualifierAndScopeAnnotation

AnnotationscannotbebothScopeannotationsandQualifierannotations:thiscausesconfusionwhentryingtousethem.Overrides

Varargsdoesn'tagreeforoverriddenmethodOverridesJavaxInjectableMethod

Thismethodisnotannotatedwith@Inject,butito

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論