Програмери ЛЛВМ пројекта су предложили бројне измене које имају за циљ јачање безбедности Ц++ пројеката критичних за мисију и обезбеђивање средстава за елиминисање грешака изазваних прекорачењем бафера. Рад је фокусиран на две области: обезбеђивање развојног модела који омогућава безбедан рад са баферима и рад на ојачавању стандардне библиотеке функција либц++.
Предложени модел безбедног програмирања за Ц++ подразумева коришћење класа које обезбеђује стандардна библиотека када се ради са баферима уместо манипулације голим показивачима. На пример, предлаже се коришћење класа стд::арраи, стд::вецтор и стд::спан, које ће додати проверу времена извршавања за претерано додељену меморију.
У циљу борбе против опасних пракси програмирања у цланг-у, предлаже се да се прикажу упозорења компајлера за све аритметичке операције показивача, слично излазу упозорења цланг-тиди линтер када се користи „цппцорегуиделинес-про-боундс-поинтер-аритхметиц“ заставица, подршка за коју ће појављују се у издању ЛЛВМ 16. Да бисте омогућили таква упозорења, посебна заставица ће бити додата цланг-у, која није активна подразумевано.
Планирано је да се имплементира опциони режим побољшане заштите у либц++, који ће, када је омогућен, ухватити неке ситуације током извршавања које доводе до недефинисаног понашања. На пример, у класама стд::спан и стд::вецтор, приступ меморији ван граница ће се надгледати и ако се открије, програм ће се срушити. Програмери верују да ће додавање оваквих измена одржати либц++ у складу са Ц++ стандардима, пошто избор начина на који ће поступати у случајевима недефинисаног понашања лежи на програмерима библиотеке, који, између осталог, могу третирати недефинисано понашање као неуспех, захтевајући програм да се прекине.
Планирано је да се провере времена извршавања у либц++ поделе у категорије које се могу појединачно омогућити. Неке од предложених провера, које не доводе до сложенијих операција или промена АБИ-ја, већ су имплементиране у оквиру безбедног режима либц++.
Поред тога, планирано је да се припреме алати за ажурирање кода, који ће вам омогућити да замените варијабле голим показивачима са контејнерима и користите алтернативне руковаоце у ситуацијама када контејнер не може директно да замени показивач (на пример, конструкција „иф(арраи_поинтер)” може конвертовати у „иф(спан.дата) ()"). Подешавања се могу применити не само на локалне варијабле, већ и на параметре типова показивача.
Извор: опеннет.ру
