ControlFlag 1.0-ի թողարկում՝ C կոդում սխալները հայտնաբերելու գործիք

Intel-ը հրապարակել է ControlFlag 1.0 գործիքի առաջին հիմնական թողարկումը, որը թույլ է տալիս բացահայտել ելակետային կոդի սխալներն ու անոմալիաները՝ օգտագործելով մեքենայական ուսուցման համակարգ, որը պատրաստված է առկա կոդի մեծ քանակի վրա: Ի տարբերություն ավանդական ստատիկ անալիզատորների, ControlFlag-ը չի կիրառում պատրաստի կանոններ, որոնցում դժվար է ապահովել բոլոր հնարավոր տարբերակները, այլ հիմնված է բազմաթիվ առկա նախագծերում տարբեր լեզվական կառուցվածքների օգտագործման վիճակագրության վրա: ControlFlag կոդը գրված է C++-ով և բաց կոդով է MIT լիցենզիայի ներքո:

Համակարգը վերապատրաստվում է GitHub-ում և համանման հանրային պահեստներում հրապարակված բաց կոդով նախագծերի առկա ծածկագրային զանգվածի վիճակագրական մոդելի կառուցմամբ: Վերապատրաստման փուլում համակարգը որոշում է կոդի մեջ կառուցվածքների կառուցման բնորոշ օրինաչափություններ և կառուցում է այդ օրինաչափությունների միջև կապերի շարահյուսական ծառ՝ արտացոլելով ծրագրում կոդի կատարման հոսքը: Արդյունքում ձևավորվում է տեղեկատու որոշումների կայացման ծառ, որը միավորում է վերլուծված բոլոր կոդերի զարգացման փորձը: Վերանայվող կոդը ենթարկվում է նույնականացման օրինաչափություններին, որոնք ստուգվում են հղումային որոշումների ծառի վրա: Հարևան ճյուղերի հետ մեծ անհամապատասխանությունները վկայում են ստուգվող օրինաչափության անոմալիայի առկայության մասին:

ControlFlag 1.0-ի թողարկում՝ C կոդում սխալները հայտնաբերելու գործիք

Որպես ControlFlag-ի հնարավորությունների օրինակ՝ մշակողները վերլուծել են OpenSSL և cURL նախագծերի սկզբնական կոդերը.

  • Անոմալ կառուցվածքներ «(s1 == NULL) ∧ (s2 == NULL)» և «(s1 == NULL) | (s2 == NULL)" , որոնք չեն համապատասխանում սովորաբար օգտագործվող օրինակին "(s1 == NULL) || (s2 == NULL)»: Կոդը նաև հայտնաբերեց անոմալիաներ «(-2 == rv)» (մինուսը տառասխալ էր) և «BIO_puts(bp, «:») <= 0)» արտահայտություններում (հաջողությամբ ավարտվածությունը ստուգելու համատեքստում: ֆունկցիան պետք է լիներ «== 0»):
  • cURL-ում հայտնաբերվել է սխալ, որը չի հայտնաբերվել ստատիկ անալիզատորների կողմից «s->keepon» կառուցվածքի տարրն օգտագործելիս, որն ուներ թվային տեսակ, բայց համեմատվել է TRUE բուլյան արժեքի հետ:

ControlFlag 1.0 տարբերակի առանձնահատկությունների թվում կա C լեզվի ստանդարտ ձևանմուշների ամբողջական աջակցություն և պայմանական «եթե» արտահայտություններում անոմալիաներ հայտնաբերելու հնարավորությունը: Օրինակ, ծածկագրի հատվածը վերլուծելիս «եթե (x = 7) y = x;» Համակարգը կորոշի, որ «եթե» հայտարարությունը սովորաբար օգտագործում է «փոփոխական == թիվ» շինարարությունը՝ թվային արժեքները համեմատելու համար, ուստի մեծ է հավանականությունը, որ «եթե» արտահայտության «փոփոխական = համարը» պայմանավորված է տառասխալով: Հավաքածուն ներառում է սկրիպտ, որը թույլ է տալիս ներբեռնել գոյություն ունեցող C լեզվի պահոցները GitHub-ում և օգտագործել դրանք մոդելը կառուցելու համար: Հասանելի են նաև պատրաստի մոդելներ, որոնք թույլ են տալիս անմիջապես սկսել ստուգել կոդը:

Source: opennet.ru

Добавить комментарий