LLVM ව්යාපෘතියේ සංවර්ධකයින් විසින් මෙහෙවර-විවේචනාත්මක C++ ව්යාපෘතිවල ආරක්ෂාව ශක්තිමත් කිරීම සහ බෆර ඉක්මවා යාමෙන් සිදුවන දෝෂ ඉවත් කිරීමට මාධ්යයක් සැපයීම ඉලක්ක කරගත් වෙනස්කම් ගණනාවක් යෝජනා කර ඇත. කාර්යය අංශ දෙකක් කෙරෙහි අවධානය යොමු කර ඇත: බෆර සමඟ ආරක්ෂිතව වැඩ කිරීමට ඉඩ සලසන සංවර්ධන ආකෘතියක් සැපයීම සහ libc++ සම්මත ශ්රිත පුස්තකාලය දැඩි කිරීමට ක්රියා කිරීම.
C++ සඳහා යෝජිත ආරක්ෂිත ක්රමලේඛන ආකෘතියට හිස් පොයින්ටර් හැසිරවීම වෙනුවට බෆර සමඟ වැඩ කිරීමේදී සම්මත පුස්තකාලය මඟින් සපයන පන්ති භාවිතා කිරීම ඇතුළත් වේ. උදාහරණයක් ලෙස, std::array, std::vector සහ std::span පන්ති භාවිතා කිරීමට යෝජිත වන අතර, එය වැඩිපුර වෙන් කළ මතකය සඳහා ධාවන කාල පරික්ෂාවක් එක් කරයි.
ක්ලැන්ග් හි භයානක ක්රමලේඛන භාවිතයන්ට එරෙහිව සටන් කිරීම සඳහා, "cppcoreguidelines-pro-bounds-pointer-arithmetic" ධජය භාවිතා කරන විට clang-tidy linter අනතුරු ඇඟවීම් ප්රතිදානයට සමානව, සියලුම පොයින්ටර් අංක ගණිත මෙහෙයුම් සඳහා සම්පාදක අනතුරු ඇඟවීම් ප්රදර්ශනය කිරීමට යෝජනා කෙරේ. නිකුතුවේ LLVM 16 දිස්වේ. එවැනි අනතුරු ඇඟවීම් සක්රීය කිරීමට, clang වෙත වෙනම ධජයක් එක් කරනු ඇත, පෙරනිමියෙන් සක්රිය නොවේ.
libc++ හි විකල්ප වැඩිදියුණු කළ ආරක්ෂණ මාදිලියක් ක්රියාත්මක කිරීමට සැලසුම් කර ඇත, එය සක්රීය කළ විට, නිර්වචනය නොකළ හැසිරීම් වලට තුඩු දෙන සමහර අවස්ථා ධාවන වේලාවේදී අල්ලා ගනු ඇත. උදාහරණයක් ලෙස, std::span සහ std::දෛශික පන්ති වලදී, සීමාවෙන් පිටත මතක ප්රවේශයක් නිරීක්ෂණය කරනු ලබන අතර, අනාවරණය වුවහොත්, වැඩසටහන බිඳ වැටේ. සංවර්ධකයින් විශ්වාස කරන්නේ එවැනි වෙනස්කම් එකතු කිරීම C++ ප්රමිතීන්ට අනුකූලව libc++ තබා ගත හැකි බවයි, මන්ද නිර්වචනය නොකළ හැසිරීම් සම්බන්ධයෙන් කටයුතු කරන්නේ කෙසේද යන්න තේරීම පුස්තකාල සංවර්ධකයින් සතු වන අතර, වෙනත් දේ අතර, නිර්වචනය නොකළ හැසිරීම අසාර්ථක ලෙස සැලකිය හැකිය, අවශ්ය වේ අවසන් කිරීමට වැඩසටහන.
libc++ හි ධාවන කාල පරීක්ෂාවන් තනි තනිව සක්රීය කළ හැකි කාණ්ඩවලට බෙදීමට සැලසුම් කර ඇත. යෝජිත චෙක්පත් සමහරක්, මෙහෙයුම්වල සංකීර්ණත්වයට හෝ ABI හි වෙනස්කම්වලට තුඩු නොදෙන, දැනටමත් libc++ ආරක්ෂිත මාදිලිය තුළ ක්රියාත්මක කර ඇත.
මීට අමතරව, කේතය සකස් කිරීම සඳහා මෙවලම් සකස් කිරීමට සැලසුම් කර ඇති අතර, විචල්යයන් හිස් පොයින්ටර් සමඟ බහාලුම් සමඟ ප්රතිස්ථාපනය කිරීමට සහ බහාලුම් සෘජුවම දර්ශකය ප්රතිස්ථාපනය කළ නොහැකි අවස්ථාවන්හිදී විකල්ප හසුරුවන්නන් භාවිතා කිරීමට ඉඩ සලසයි (උදාහරණයක් ලෙස, “if(array_pointer)” construct can "if(span.data) ()" වෙත පරිවර්තනය කළ හැක) ගැලපීම් දේශීය විචල්යවලට පමණක් නොව, පොයින්ටර් වර්ගවල පරාමිතීන්ටද යෙදිය හැක.
මූලාශ්රය: opennet.ru
