Agorodd Intel god system dysgu peiriant ControlFlag i nodi bygiau yn y cod

Mae Intel wedi darganfod datblygiadau sy'n ymwneud â'r prosiect ymchwil ControlFlag gyda'r nod o greu system dysgu peiriant i wella ansawdd cod. Mae’r pecyn cymorth a baratowyd gan y prosiect yn caniatáu, yn seiliedig ar fodel sydd wedi’i hyfforddi ar swm mawr o god presennol, i nodi gwallau ac anghysondebau amrywiol mewn testunau ffynhonnell a ysgrifennwyd mewn ieithoedd lefel uchel fel C/C++. Mae'r system yn addas ar gyfer nodi gwahanol fathau o broblemau yn y cod, o nodi teipiau a chyfuniadau math anghywir, i nodi gwiriadau gwerth NULL sydd ar goll mewn awgrymiadau a phroblemau cof. Mae'r cod ControlFlag wedi'i ysgrifennu yn C++ ac mae'n ffynhonnell agored o dan y drwydded MIT.

Mae'r system yn hunan-ddysgu trwy adeiladu model ystadegol o'r casgliad cod presennol o brosiectau agored a gyhoeddwyd yn GitHub a storfeydd cyhoeddus tebyg. Yn y cam hyfforddi, mae'r system yn pennu patrymau nodweddiadol ar gyfer adeiladu strwythurau yn y cod ac yn adeiladu coeden gystrawen o gysylltiadau rhwng y patrymau hyn, gan adlewyrchu llif gweithredu cod yn y rhaglen. O ganlyniad, mae coeden gwneud penderfyniadau cyfeirio yn cael ei ffurfio sy'n cyfuno profiad datblygu'r holl godau ffynhonnell a ddadansoddwyd.

Mae'r cod sy'n cael ei adolygu yn mynd trwy broses debyg o nodi patrymau sy'n cael eu gwirio yn erbyn coeden penderfyniad cyfeirio. Mae anghysondebau mawr gyda changhennau cyfagos yn dangos presenoldeb anghysondeb yn y patrwm sy'n cael ei wirio. Mae'r system hefyd yn caniatáu ichi nid yn unig nodi gwall yn y templed, ond hefyd awgrymu cywiriad. Er enghraifft, yn y cod OpenSSL, nodwyd yr adeiladwaith “(s1 == NULL) ∧ (s2 == NULL)”, a ymddangosodd yn y goeden gystrawen 8 gwaith yn unig, tra bod y gangen agosaf â'r gwerth “(s1 == NULL) || (s2 == NULL)” wedi digwydd tua 7 mil o weithiau. Canfu'r system hefyd anghysondeb “(s1 == NULL) | (s2 == NULL)” a ymddangosodd 32 o weithiau yn y goeden.

Agorodd Intel god system dysgu peiriant ControlFlag i nodi bygiau yn y cod

Wrth ddadansoddi'r darn cod "os (x = 7) y = x;" Mae'r system wedi penderfynu bod y lluniad “newidiol == rhif” yn cael ei ddefnyddio fel arfer yn y gweithredwr “os” i gymharu gwerthoedd rhifol, felly mae'n debygol iawn bod y dynodiad “newidiol = rhif” yn yr ymadrodd “os” yn cael ei achosi gan a typo. Byddai dadansoddwyr sefydlog traddodiadol wedi dal gwall o'r fath, ond yn wahanol iddynt, nid yw ControlFlag yn cymhwyso rheolau parod, lle mae'n anodd darparu ar gyfer yr holl opsiynau posibl, ond mae'n seiliedig ar ystadegau'r defnydd o wahanol strwythurau mewn nifer fawr o brosiectau.

Fel arbrawf, gan ddefnyddio ControlFlag yng nghod ffynhonnell y cyfleustodau cURL, a ddyfynnir yn aml fel enghraifft o god o ansawdd uchel ac wedi'i brofi, nodwyd gwall heb ei ganfod gan ddadansoddwyr statig wrth ddefnyddio'r elfen strwythur "s->keepon", a oedd â math rhifol, ond a gafodd ei gymharu â'r gwerth Boole CYWIR . Yn y cod OpenSSL, yn ogystal â'r broblem uchod gyda "(s1 == NULL) ∧ (s2 == NULL)", nodwyd anghysondebau hefyd yn yr ymadroddion "(-2 == rv)" (y minws oedd a teipio) a "BIO_puts(bp,":")

Ffynhonnell: opennet.ru

Ychwanegu sylw