Mae'r prosiect LLVM yn datblygu trin byffer yn ddiogel yn C++

Mae datblygwyr y prosiect LLVM wedi cynnig nifer o newidiadau gyda'r nod o gryfhau diogelwch prosiectau C++ sy'n hanfodol i genhadaeth a darparu modd i ddileu gwallau a achosir gan orwario byffer. Mae'r gwaith yn canolbwyntio ar ddau faes: darparu model datblygu sy'n eich galluogi i weithio'n ddiogel gyda byfferau, a gweithio ar galedu diogelwch llyfrgell swyddogaethau safonol libc++.

Y model rhaglennu diogel arfaethedig ar gyfer C++ yw defnyddio'r dosbarthiadau a ddarperir gan y llyfrgell safonol wrth weithio gyda byfferau yn hytrach na thrin awgrymiadau noeth. Er enghraifft, cynigir defnyddio'r dosbarthiadau std::array, std::vector, a std::span, a fydd yn cael eu hychwanegu gyda gwiriad amser rhedeg ar gyfer cof y tu allan i ffiniau.

Er mwyn brwydro yn erbyn arferion rhaglennu peryglus mewn clang, cynigir cyhoeddi rhybuddion casglwr ar gyfer yr holl weithrediadau rhifyddeg pwyntydd, yn debyg i rybuddion clang-tidy wrth ddefnyddio'r faner "cppcoreguidelines-pro-bounds-pointer-rithmetic", a bydd cefnogaeth ar ei gyfer yn ymddangos yn rhyddhau LLVM 16. Er mwyn galluogi rhybuddion o'r fath, bydd baner ar wahân yn cael ei hychwanegu at y clang, nad yw'n weithredol yn ddiofyn.

Bwriedir gweithredu modd amddiffyn caledu dewisol yn libc++, a fydd, o'i alluogi, yn dal rhai sefyllfaoedd sy'n arwain at ymddygiad amhenodol ar amser rhedeg. Er enghraifft, yn y dosbarthiadau std::span a std::vector, bydd mynediad y tu allan i ffiniau yn cael ei fonitro, ac os felly bydd y rhaglen yn chwalu. Mae'r datblygwyr o'r farn y bydd ychwanegu newidiadau o'r fath yn cadw libc++ i gydymffurfio â safonau C++, gan mai datblygwyr y llyfrgell sydd â'r dewis o sut i drin achosion o ymddygiad amhenodol, a all, ymhlith pethau eraill, ddehongli ymddygiad heb ei ddiffinio fel damwain sy'n gofyn am y rhaglen i ymadael.

Bwriedir rhannu gwiriadau amser rhedeg yn libc++ yn gategorïau y gellir eu cynnwys yn unigol. Mae rhai o'r gwiriadau a awgrymir nad ydynt yn arwain at weithrediadau mwy cymhleth neu newidiadau ABI eisoes wedi'u gweithredu ym modd diogel libc++.

Yn ogystal, bwriedir paratoi pecyn cymorth ar gyfer cywiro'r cod, sy'n eich galluogi i roi awgrymiadau noeth yn lle'r newidynnau ar gynwysyddion a gosod teclynnau trin amgen mewn sefyllfaoedd lle na all y cynhwysydd ailosod y pwyntydd yn uniongyrchol (er enghraifft, yr "os (array_pointer)" Gellir trosi lluniad i “os (span.data ()”) Gellir cymhwyso addasiadau nid yn unig i newidynnau lleol, ond hefyd i baramedrau teipio gydag awgrymiadau.

Ffynhonnell: opennet.ru

Ychwanegu sylw