Analysis stabilis in processu deducenda, quam utendo ad cimices inveniendas

Promptus sum ut hunc articulum scriberem per magnam vim materiae in analysi statice, quae magis magisque ad mentem meam venire possunt. Uno modo, hoc PVS-studio blogqui actuose se promovet in HabrΓ© ope recognitionum errorum ab eorum instrumento in aperto fonte inceptis repertis. Nuper PVS-studio impletum Java firmamentumet, sane, tincidunt IntelliJ ideae, cuius in analysi aedificatum est verisimile antecedens pro Java hodie; non discedite.

Cum huiusmodi recensiones legentes, sensum obtines quem de elixir magica loquimur: puga pyga preme, et hic est - index vitiorum ante oculos tuos. Videtur quod cum analysres meliores, magis ac magis cimices sponte inveniantur, et producta ab his robots lustrata meliores et meliores fiant, sine ullo labore nostro.

Sed elixira magica non sunt. Loqui velim de iis quae in nuntia solet non loqui sicut "hic sunt res nostrae robotae invenire": quod analysres facere non possunt, quid earum reale munus et locus in processu programmate traditio et quomodo ea recte efficiantur. .

Analysis stabilis in processu deducenda, quam utendo ad cimices inveniendas
Ratchet (source: id).

Quod stabilis analysers non potest facere

Quid est fons analysis codicis, ex parte practica? Codicem aliquem fontem praebemus ut input, et quasi output, brevi tempore (multa probatio cursus brevior) aliquas informationes de nostro systemate obtinemus. Fundamentalis et mathematice insuperabilis limitatio est ut solum satis angustum notitiarum genus hoc modo obtinere possimus.

Praeclarissimum exemplum quaestionis quae non potest solvi usura static analysis shutdown problemaTheorema haec est quae probat impossibile algorithmum generalem evolvere qui ex fonte codice programmatis determinare potest utrum temptet an finito tempore terminetur. Huius theorematis extensio est Rice theorema, qui affirmat pro quavis proprietate functionum non parvarum computabilium, utrum programma arbitrarium aestimare functionem cum tali proprietate sit quaestio intractabilis algorithmice. Exempli gratia, impossibile est analysorem scribere, qui ex quovis codice fonte determinare potest num programma enucleandum sit exsequendam algorithm, qui calculat, dicunt quadraturam integri.

Ita functiones staticarum analysium inexsuperabiles limites habet. analystor stabilis numquam deprehendere poterit in omnibus casibus, exempli gratia, eventum "nulli indicis exceptionis" in linguis quae valorem nullitatis permittunt, vel in omnibus casibus eventum determinare ". attributum non invenitur "in linguis typus dynamically. Quidquid antecedens analyser static facere potest, casus speciales in lumine ponit, quorum numerus, inter omnes problematum possibilium cum codice tuo fonte, sine exaggeratione est gutta in situla.

Static analysis non est de inveniendo bugs

Ex superioribus sequitur conclusio: Analysis stabilis non est medium reducere numerum defectuum in ratione progressionis. Ausim dicere: cum primum ad propositum tuum applicata loca in codice "interest", sed verisimile non invenit defectus qui qualitatem progressionis tuae afficiunt.

Exempla vitiorum ab analysariis automatice inventa sunt impressiva, sed non obliviscendum est haec exempla in magna tabularum magnarum copia inventa esse. Ab eodem principio, hackers qui facultatem habent plures simplices passwords tentandi in numero rationum, tandem eas rationes reperiunt quae tesseram simplicem habent.

Hoc significat non utendum esse analysis statice? Certe non! Eadem prorsus ratione qua singulas tesseras novas cohibere valet efficere ut in indice tesserarum "simplicium" sistendi includatur.

Statica analysis plus quam invenire bugs

Re quidem vera, problemata analysi paene solvuntur multo sunt latiora. Post omnes, generatim analysin stabilis est quaevis verificationis codicum fontei peractae antequam educitur. Hic sunt quaedam quae facere potes;

  • Latissimo verbo reprehendo stilum coding. Hoc includit utrumque inhibitionem formattingum, usum parenthesi inanis/extrahendi quaerens, liminibus metricis ponendi sicut linearum cyclomaticarum multiplicitas methodi, etc. - quidquid potentia impedit promptitudinem et conservationem codicis. In Java, tale instrumentum est Checkstyle, apud Python-flake8. Programmata huius generis plerumque "lintra" vocantur.
  • Non solum codicem exsecutabile enucleari potest. Resource imagini sicut JSON, YAML, XML, .properies (et debet!) automatice ad validitatem sedari possunt. Post omnia, melius est invenire JSON structuram frangi ob aliquibus non coniugatis sententiis in praematuro latis Trahe Request verificationis quam in tempore exsecutionis vel curriculi? Instrumenta apta sunt in promptu: exempli causa. YAMLlint, JSONLint.
  • Compilatio (vel parsing pro dynamica programmandi linguarum) genus est analyseos statice. In genere, compilatores possunt monita producere quae problemata cum fonte codicis qualitate indicant et non neglecta sunt.
  • Interdum compilatio plus est quam codicem exsecutabile componens. Exempli gratia, si documenta habes in forma AsciiDoctortum in HTML/PDF tracto AsciiDoctoris vertendi (maven plugin) monere potest, exempli gratia de vinculis internis fractis. Et haec bona ratio est non acceptare petitionem trahere cum documentis mutationibus.
  • Orthographiae etiam genus analyseos stabilis est. utilitas aspell Orthographiam non solum in documentis reprimere, sed etiam in programmatis codicibus (commentis et literalibus) variarum programmandi linguarum, inter C/C++, Java et Python. Error orthographiae in usuario instrumenti seu documentis est etiam defectus!
  • Configurationis probat (de quid sint - vide. haec ΠΈ haec tradit), quamquam in unitate testi runtime, ut pytest, exsecuti sunt, re vera etiam species analyseos statice, cum codices fontes in executione non faciant.

Ut videre potes, quaerens cimices in hoc indice ludit partes minimi momenti, omniaque alia instrumenta gratis patenti fonte praesto sunt.

Uter horum generum analysis stabilis in tuo project uteris? Nempe quanto melior! Summa est ad recte efficiendum, de quo ulterius dicetur.

Partus pipeline ut multi scaena sparguntur et static analysi sicut in primo stadio

Tralatio classica ad integrationem continuam est pipeline per quam mutationes manant, a fonte codice ad partum usque ad productionem mutationes. Ordo graduum regulae in hoc pipelino similis est.

  1. static analysis
  2. compilation
  3. unitas probat
  4. probat integrationem
  5. III probat
  6. manual reprehendo

Mutationes in Nth stadio pipelini reiectae in scaenam N+1 non transferuntur.

Cur hoc ipsum, et non aliter? In parte probationis pipeline, testers agnoscet notam probationem pyramidis.

Analysis stabilis in processu deducenda, quam utendo ad cimices inveniendas
Test pyramis. Source: articulus Martin Fowler.

In fundo istius pyramidis sunt probationes, quae facilius scribere, citius exequi, nec proclives ad deficere. Plures ergo esse debent ex eis, codicem maiorem velent et prius exsecutioni mandari. In summitate pyramidis e contrario est verum, ut numerus integrationis et UI probationum reducatur ad minimum necessarium. Persona in hac catena est pretiosissima, tarda et inconveniens subsidia, ideo in ipso fine est et solum opus exercet, si vitia priora non invenit. Eadem tamen principia construere pipelines in partibus non directe ad probationem pertinentibus!

Similitudinem praebere velim in forma multi-scaena aquae systematis filtationis. Aqua sordida (mutationes cum defectibus) suppletur ad input, in output aquam mundam accipere debemus, in qua omnes contaminantes inutiles sunt corruptae.

Analysis stabilis in processu deducenda, quam utendo ad cimices inveniendas
Scaena multi- Colum. Source: Commons

Ut scis, Filtra purgatio designata sunt ut quisque casus posterior magis magisque tenuiorem fractionem contaminantium eliquare possit. Eodem tempore crassioris purificationis casus superiores per put et inferiores sumptus habent. In nostra analogia, hoc significat quod portae qualitatis initus velociores sunt, minore conatu ordiendi sunt, et ipsae in operatione vaniores sunt - et haec est consecutio in qua aedificantur. Munus analysis statice, quae, ut nunc intellegimus, potest evelli nisi crassissimis defectibus, munus est "lutei" craticulae in primordio cascades colum.

Analysis static per seipsam qualitatem producti finalis non ampliat, sicut "litum colum" aquam potabilem non facit. Et tamen, in coniunctione cum aliis organis elementis, momentum eius perspicuum est. Etsi in multis statibus eliquatis curriculis emissivis potissime capaces sunt omnia, quae initus gradus agunt, perspicuum est quid consequentia proveniet ex conatu solum scenici purificationis, sine gradibus initus.

Propositum "laquei caeni" est casus subsequentes levare a defectibus crassissimis capiendis. Exempli gratia, minimum, persona codicis agentem recognoscere non debet a codice corrupto formato et violationes signarum codingum stabilitum distrahi (sicut extra parentheses vel rami nimis alte evulsos). Cimes sicut NPEs ab unitate probationum capi debent, sed si etiam ante experimentum analystoris indicat nobis cimex contingere debere, hoc signanter velocitatem suam figens erit.

Patet nunc credo cur analysis stabilis qualitatem producti interdum non emendaverit, et mutationibus crassis cum vitiis eliquare constanter debeat. Interrogatio an analystoris stabilis utens qualitatem operis tui duriter aequivalet interroganti, "Num aqua e piscino sordido sumta emendabitur in bibendo qualitatem si per COLUM transeat?"

Exsequendam in legatum project

Quaestio practica magni momenti: quomodo analysis stabilis efficiendae in processu integratione continua tamquam "porta qualitas"? In latis probatis, omnia manifesta sunt: ​​probata est statuta, cuiuslibet eorum defectus sufficit ratio ad credendum ecclesiam qualitatem portae non transire. Conatus portam instituendi eodem modo innixus analysi statice eventus deficit: multae sunt analystae admonitiones in codice legato, eas omnino ignorare non vis, sed etiam impossibile est ut naviculas productum sistere. solum quia monita analyser continet.

Cum primum adhibitum est, analystor ingentem numerum admonitionum in quacumque re proposita producit, quarum maxima pars ad propriam producti operationem non refertur. Impossibile est omnes has commentationes statim corrigere, et multae non sunt necessariae. Post omnes scimus productum nostrum totum opera, etiam ante analysim static introducendam!

Quam ob rem multi limitantur ad usum analyseos staticae occasionaliter, vel eo tantum modo in informatione utuntur, quando analyser relatio simpliciter edita est in conventu. Hoc idem valet ad absentiam cuiuslibet analyseos, quia, si iam multa monuimus, eventum alterius (utcumque grave) in mutando codice latuit.

Sequuntur modi introducendi portas qualitatis notae sunt;

  • Terminum constituens in numerum admonitionum vel numerum admonitionum, numerum versuum in codice divisum. Hoc male operatur, quia talis porta libere permittit mutationes cum novis defectibus transire, dummodo modus eorum non excedat.
  • Certo figendi momento, omnia vetera monita in codice neglecta, et nova monita edificare recusans occurrunt. Haec functionality providetur per PVS-studio et facultatibus quibusdam online, exempli gratia, Codacy. Occasionem operandi in PVS-studio non habui, sicut experientiam meam cum Codacy, quaestio principalis eorum est determinans quid sit "vetus" et quid "novus" error sit algorithmus potius complexus qui non semper operatur. recte, praesertim si fasciculi graviter mutatae sunt vel renominatae sunt. In usu meo, Codacy novas admonitiones in petitione trahere potuit ignorare, cum simul petitionem trahere non praetermitteret propter admonitiones quae mutationes in codice PR datae non erant mutatae.
  • Opinor, efficacissima solutio est quae in libro descriptus est continua Delivery "Ratcheting modum". Praecipua notio est quod numerus analysin statice admonitionis est proprietas uniuscuiusque emissionis, et solae mutationes permittuntur quae totum numerum admonitionum non augent.

Ratchet

Hoc modo operatur:

  1. In initio, memoria fit in metadata de emissione numerorum admonitionum in codice ab analysers inventis. Cum ergo flumine aedifices, repositio procurator tuus scribit non solum "dimittere 7.0.2", sed "dimittere 7.0.2 continens 100500 monitiones checkstyle." Si procurator repositorium provectum uteris (qualem artificiatum), facilis est talis metadata de emissione tua.
  2. Nunc unaquaeque petitio trahere, cum aedificatur, numerum admonitionum consequentium comparat cum numero monitionum quae in hodierna emissione praesto sunt. Si PR in hoc numero incrementum perducit, signum non transit ad qualitatem analyseos staticae. Si numerus admonitionum decrescat vel non mutat, tunc transit.
  3. In altera emissione, numerus monitionum calculi iterum in metadata emissione notabitur.

Ita paulatim sed constanter (velut cum scalare opera), numerus admonitionum ad nihilum tendet. Nimirum ratio nova admonitionis decipi potest, sed alterius correctionis. Hoc consuetum est, quia per longam distantiam dat eventus: admonitiones, ut regulae, non singillatim, sed in quadam specie statim corriguntur, et omnia facile removentur admonitiones amovibiles satis cito.

Hoc graph indicat numerum Checkstyle admonitiones sex menses operationis talis "ratchet" on unus ex nostris inceptis OpenSource. Numerus admonitionum per ordinem magnitudinis decrevit, et hoc naturaliter factum est, in parallela cum producto progressu!

Analysis stabilis in processu deducenda, quam utendo ad cimices inveniendas

Mutata huius methodi versione utor, seorsim monitis computatis instrumenti moduli et analysi proiecti, inde in fasciculo YAML cum metadata fabricandi quae aliquid huius modi spectat:

celesta-sql:
  checkstyle: 434
  spotbugs: 45
celesta-core:
  checkstyle: 206
  spotbugs: 13
celesta-maven-plugin:
  checkstyle: 19
  spotbugs: 0
celesta-unit:
  checkstyle: 0
  spotbugs: 0

In quavis ratione CI systema provecta, scalare ad instrumenta analysin quaevis static perfici possunt sine machinis et instrumentis tertiis partium confisis. Quisque analyser suam relationem producit in textu simplici vel XML forma quae ad analysim facilis est. Reliquum est ut logicam necessariam in scripto CI scribat. Potes videre quomodo hoc impleatur in inceptis apertis nostris innixus Jenkins et Artifactorius hic aut hic. Utraque exempla in bibliotheca pendent ratchetlib': modus countWarnings() numerat xml tags in imagini generatae a Checkstyle et Spotbugs more solito, et compareWarningMaps() idem scalare proiciens errorem, cum numerus admonitionum in quolibet praedicamentorum augetur.

Interestinger exsecutio "ratchet" fieri potest ut orthographiam commentariorum, litterarum et textuum documentorum aspelli utendi. Ut scis, orthographiam reprimendo, non omnia verba ad dictionarium vexillum ignota sunt falsa, ad dictionarium usoris addi possunt. Si dictionarium consuetum faceres partem originis documenti in codice, orthographiam qualitatis portae formari potest hoc modo: aspellium currentem cum signo et usu dictionarii non opus sit nullum orthographiam errores invenio.

Circa momentum versionis figendi analyser

In fine, notandum est quod, quamvis analysin efficias in tui pipeline traditionem, versio analystoris fixa debet esse. Si permittitis analysrem sponte renovare, tunc cum proximo trahendo petitionem convocando, nova vitia "pop up" possunt quae mutationes ad codicem non referuntur, sed cum eo referuntur quod novus analystor simpliciter plura vitia invenire potest. et hoc tuum processum disrumpet accipiendi petitiones traho . Upgrading analyser actio conscia debet esse. Attamen rigida solidatio versionis uniuscuiusque conventus componentis est plerumque necessaria postulatio et thema ad discussionem separatum.

Inventiones

  • Analysis Statica cimices tibi non inveniet et qualitatem producti tui ex uno applicatione non emendabit. Effectus positivus qualitatis tantum per suum constantem usum in processu traditionis obtineri potest.
  • cimices invenire non est praecipuum munus analyseos omnino, sed maior pars utilium functionum in instrumentis apertis in promptu sunt.
  • Exsecutio qualitatis portae innituntur eventus analysis statice in primo stadio traditionis pipeline, utendo "ratchet" pro codice legato.

References

  1. continua Delivery
  2. A. Kudryavtsev: Programma analysis: quomodo intelligas te bonum programmatorem esse? referre ad varias methodos codice analysis (non solum static!)

Source: www.habr.com