Kulingana na Clang kwa lugha ya C, hali ya kuangalia mipaka ya bafa imetekelezwa

Wahandisi wa Apple wametangaza kuwa wako tayari kujaribu hali ya "-fbounds-safety" kwa mkusanyaji wa Clang, ambayo hutoa dhamana ya kazi salama na buffers katika msimbo wa C. Njia hiyo imejumuishwa kwenye uma wa LLVM unaodumishwa na Apple kwa mradi wa Swift. Katika siku zijazo, tunapanga kuhamisha hatua kwa hatua utendakazi wa "-fbounds-safety" hadi kwenye msingi mkuu wa msimbo wa LLVM/Clang.

Ikumbukwe kwamba utaratibu uliopendekezwa wa ulinzi tayari unatumika kikamilifu katika bidhaa za Apple, kama vile kernel ya XNU, firmware, maktaba ya kufanya kazi na vitoa sauti na picha. Kuwasha hali ya "-fbounds-safety" hupunguza utendaji wa programu kwa wastani wa 5% (fungu -1% hadi 29%), huongeza ukubwa wa msimbo kwa 9.1% (fungu -1.4% hadi 38%), na kupunguza kasi ya ukusanyaji kwa 11. %.

Kutumia hali ya "-fbounds-safety" ili kugundua kiotomatiki kumbukumbu ya nje ya mipaka inayohusishwa na pointer inahitaji kuongeza maelezo maalum kwa msimbo na kujumuisha faili ya kichwa "ptrcheck.h". Kiini cha mbinu ya ulinzi iliyopendekezwa ni kiambatisho cha kiotomatiki cha hundi kwa kufuata mipaka inayokubalika, iliyoongezwa kulingana na vidokezo vilivyowekwa kwa mikono au ukubwa unaojulikana kwa mkusanyaji.

Tofauti na matumizi ya viashiria pana katika msimbo, ambayo kwa kuongeza anwani ina habari kuhusu mipaka ya juu na ya chini ya bafa, kwa kutumia hali ya "-fbounds-usalama" haikiuki ABI (Kiolesura cha Binary cha Maombi), haikiuki. badilisha muundo wa viashiria vilivyosafirishwa, na hauhitaji kufanyia kazi upya mradi mzima mara moja. Katika hali ya "-fbounds-safety", viashirio vilivyopanuliwa hutumika tu katika maeneo ambayo hayaingiliani na ABI, na kwa viashiria vinavyoathiri ABI, viashiria vya kawaida hutumiwa pamoja na ukaguzi wa kubadilisha unaotokana na vidokezo vyenye maelezo ya mipaka.

Ufafanuzi lazima uambatishwe kwa viashiria katika sehemu za muundo na vigezo vya utendakazi vinavyoelekeza kwenye safu ya vipengee, pamoja na vigeuzo vya kimataifa vilivyo na viashiria. Vielelezo katika vigeu vya ndani havihitaji kufafanuliwa kwa sababu vinachukuliwa kiotomatiki kama viashiria vilivyopanuliwa, ambavyo tayari vinajumuisha maelezo kuhusu mipaka halali. Vidokezo kuhusu miundo katika msimbo unaohitaji maelezo hutolewa na mkusanyaji inapoendeshwa kwa alama ya "-fbounds-safety".

Mfano wa usalama "-fbounds-usalama" unaweza kutekelezwa hatua kwa hatua, faili kwa faili, bila kukatiza maendeleo ya mradi mzima. Kuongeza ulinzi kwa mradi kunatokana na kubainisha maelezo katika faili mahususi ya msimbo, kuondoa maonyo ya mkusanyaji na kujaribu programu, baada ya hapo hatua hizi hurudiwa kwa faili inayofuata. Msimbo ulio na vidokezo vilivyoongezwa husalia sambamba na msimbo wa kawaida wa C na vikusanyaji ambavyo havitumii "-fbounds-safety" (ikiwa imeundwa na vikusanyaji vingine au ikiwa imeundwa bila alama ya "-fbounds-safety", ukaguzi wa mipaka ya ziada hautaongezwa) .

Wakati programu inaendeshwa, ikiwa ufikiaji nje ya mipaka inayoruhusiwa imegunduliwa, ubaguzi huzalishwa na programu inakatisha utekelezaji wake. Kuacha kufanya kazi kunaweza pia kutokea wakati ufafanuzi usio sahihi umebainishwa, kwa hivyo unapotumia "-fbounds-safety" majaribio ya ziada ya uendeshaji wa programu ni muhimu.

Katika mfano ulio hapa chini, kigezo cha "int *p" kina kidokezo "__counted_by(n)" kilichoongezwa ili kuongeza ukaguzi wa ziada wa mipaka ya muda wa utekelezaji. Ukijaribu kukusanya msimbo katika modi ya "-fbounds-safety" bila kubainisha dokezo hili, mkusanyaji atatoa onyo kuhusu kukosa maelezo ya mipaka ya safu wakati wa kuchakata usemi "p[i] = 0". #pamoja na void init_buf(int *__counted_by(n) p, int n) {kwa (int i = 0; i < n; ++i) p[i] = 0; // katika hali ya "-fbounds-safety", mkusanyaji yenyewe ataingiza tiki sawa na msimbo "if (i <0 || i >= n) trap();" }

Kwa vigezo vya ndani vilivyo na viashiria, hundi huambatishwa kiotomatiki, kwa mfano: void foo(int i){ char *buf = (char *)malloc(10); // taarifa kuhusu mipaka itahifadhiwa kwa buf pointer buf[i] = 0xff; // tiki “ikiwa (buf + i < buf || buf + i >= buf + 10) trap();” itawekwa kiotomatiki }

Wakati wowote inapowezekana, mkusanyaji huboresha na huondoa kuongeza nambari isiyo ya lazima ikiwa msimbo tayari una ukaguzi unaohitajika. Kwa mfano: kwa (size_t i = 0; i < count; ++i) { buf[i] = i; // tiki "ikiwa (i < 0 || i >= count) trap()" haitaongezwa, kwa kuwa sharti "i < count" tayari lipo hapo juu na siwezi kuwa chini ya 0. }

Vidokezo vya msingi:

  • "__counted_by(N)" - inafafanua ukubwa wa bafa katika vipengele vya aina lengwa.
  • "__sized_by(N)" - hubainisha ukubwa wa bafa katika baiti.
  • "__ended_by(P)" - huweka kikomo cha juu cha bafa.
  • "__null_terminated" - inazingatia herufi isiyofaa kama mwisho wa bafa.
  • "__single" - hufunga pointer kwa kitu kimoja. Hili ndilo chaguomsingi la viashiria vinavyoathiri ABI isipokuwa kidokezo kimewekwa kwa uwazi.
  • "__bidi_indexable" ni faharasa iliyopanuliwa yenye taarifa kuhusu mipaka ya juu na ya chini. Hili ndilo chaguomsingi la viashiria ambavyo haviathiri ABI.
  • "__indexable" ni faharasa iliyopanuliwa yenye maelezo ya juu.
  • "__unsafe_indexable" - pointer bila kuangalia mipaka (kwa kubebeka na msimbo usiolindwa, kwa mfano, kwa kupata viashiria kutoka kwa msimbo wa nje).

Chanzo: opennet.ru

Nunua upangishaji wa kuaminika wa tovuti zilizo na ulinzi wa DDoS, seva za VPS VDS 🔥 Nunua upangishaji wa tovuti unaoaminika kwa ulinzi wa DDoS, seva za VPS VDS | ProHoster