Кодын алдааг тодорхойлох Intel нээлттэй эхийн ControlFlag машин сургалтын систем

Intel нь кодын чанарыг сайжруулахын тулд машин сургалтын системийг бий болгох зорилготой ControlFlag судалгааны төсөлтэй холбоотой хөгжүүлэлтийг олж илрүүлсэн. Төслийн бэлтгэсэн хэрэгсэл нь одоо байгаа олон тооны код дээр бэлтгэгдсэн загвар дээр үндэслэн C/C++ зэрэг өндөр түвшний хэлээр бичигдсэн эх бичвэрийн янз бүрийн алдаа, гажигийг илрүүлэх боломжийг олгодог. Энэхүү систем нь код дахь янз бүрийн төрлийн асуудлуудыг тодорхойлоход тохиромжтой, үсгийн алдаа, буруу төрлийн хослолыг тодорхойлохоос эхлээд заагч дахь NULL утгыг шалгах, санах ойн асуудлуудыг тодорхойлоход тохиромжтой. ControlFlag код нь C++ хэл дээр бичигдсэн бөгөөд MIT лицензийн дагуу нээлттэй эх сурвалж юм.

Энэхүү систем нь GitHub болон ижил төстэй олон нийтийн мэдээллийн санд нийтлэгдсэн нээлттэй төслүүдийн одоо байгаа кодын массивын статистик загварыг бий болгосноор өөрөө суралцдаг. Сургалтын үе шатанд систем нь код доторх бүтцийг бий болгох ердийн хэв маягийг тодорхойлж, програм дахь кодыг гүйцэтгэх урсгалыг тусгасан эдгээр хэв маягийн хоорондын холболтын синтаксийн модыг бий болгодог. Үүний үр дүнд дүн шинжилгээ хийсэн бүх эх кодын хөгжүүлэлтийн туршлагыг нэгтгэсэн жишиг шийдвэр гаргах мод бий болно.

Хянаж буй код нь жишиг шийдвэрийн модтой харьцуулан шалгасан хэв маягийг тодорхойлох ижил төстэй процессыг хэрэгжүүлдэг. Хөрш зэргэлдээ салбаруудтай их хэмжээний зөрүүтэй байгаа нь шалгаж буй загварт гажиг байгааг илтгэнэ. Систем нь загвар дахь алдааг тодорхойлох төдийгүй залруулга санал болгох боломжийг олгодог. Жишээлбэл, OpenSSL кодонд "(s1 == NULL) ∧ (s2 == NULL)" бүтцийг тодорхойлсон бөгөөд энэ нь синтаксийн модонд ердөө 8 удаа гарч ирсэн бол хамгийн ойрын салбар нь "(s1 ==) утгатай байв. NULL) || (s2 == NULL)” 7 мянга орчим удаа тохиолдсон. Систем мөн гажиг илрүүлсэн "(s1 == NULL) | (s2 == NULL)” гэсэн үг нь модонд 32 удаа гарч ирсэн.

Кодын алдааг тодорхойлох Intel нээлттэй эхийн ControlFlag машин сургалтын систем

Кодын фрагментийг шинжлэхдээ “хэрэв (x = 7) y = x;” Тоон утгыг харьцуулахын тулд "хэрэв" операторт "хувьсагч == тоо" гэсэн бүтцийг ихэвчлэн ашигладаг болохыг систем тогтоосон тул "хэрэв" илэрхийлэл дэх "хувьсагч = тоо" гэсэн заалт нь үсгийн алдаа. Уламжлалт статик анализаторууд ийм алдаа гаргах байсан ч тэднээс ялгаатай нь ControlFlag нь бүх боломжит хувилбаруудыг өгөхөд хэцүү байдаг бэлэн дүрмийг ашигладаггүй, гэхдээ олон тооны янз бүрийн бүтцийг ашиглах статистик дээр үндэслэсэн байдаг. төслүүдийн.

Туршилтын хувьд өндөр чанартай, шалгагдсан кодын жишээ болгон ихэвчлэн дурдагддаг cURL хэрэгслийн эх кодонд ControlFlag-ийг ашиглан "s->keepon" бүтцийн элементийг ашиглах үед статик анализаторууд илрүүлээгүй алдааг илрүүлсэн. Энэ нь тоон төрөлтэй боловч TRUE Boolean утгатай харьцуулсан. OpenSSL кодын дээр дурдсан "(s1 == NULL) ∧ (s2 == NULL)"-тай холбоотой асуудлаас гадна "(-2 == rv)" илэрхийлэлд гажиг илэрсэн (хасах нь үсгийн алдаа) болон "BIO_puts(bp, ":")

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх