ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ LLVM Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π° срСдства Π·Π° бСзопасно Ρ€Π°Π±ΠΎΡ‚Π° с Π±ΡƒΡ„Π΅Ρ€ΠΈ Π² C++

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° LLVM ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ…Π° Ρ€Π΅Π΄ΠΈΡ†Π° измСнСния, насочСни към повишаванС Π½Π° сигурността Π½Π° ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ Π²Π°ΠΆΠ½ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π½Π° C++ ΠΈ прСдоставянС Π½Π° срСдства Π·Π° избягванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅Π½ΠΈ ΠΎΡ‚ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ извън допустимитС Π³Ρ€Π°Π½ΠΈΡ†ΠΈ Π½Π° Π±ΡƒΡ„Π΅Ρ€ΠΈΡ‚Π΅. Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π΅ ΡΡŠΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡Π΅Π½Π° Π² Π΄Π²Π΅ насоки: прСдоставянС Π½Π° ΠΌΠΎΠ΄Π΅Π» Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, позволяващ бСзопасно Ρ€Π°Π±ΠΎΡ‚Π° с Π±ΡƒΡ„Π΅Ρ€ΠΈ, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ засилванС Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π°Ρ‚Π° Π½Π° стандартната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ libc++.

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° ΠΌΠΎΠ΄Π΅Π» Π·Π° бСзопасно ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Π·Π° C++ ΠΏΡ€Π΅Π΄Π²ΠΈΠΆΠ΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° класовСтС, прСдоставСни ΠΎΡ‚ стандартната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Π±ΡƒΡ„Π΅Ρ€ΠΈ вмСсто ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ†ΠΈΠΈ с Π³ΠΎΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. НапримСр, ΠΏΡ€Π΅Π΄Π»Π°Π³Π° сС Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ класовС ΠΊΠ°Ρ‚ΠΎ std::array, std::vector ΠΈ std::span, Π² ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ бъдС Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π·Π° ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ извън Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π·Π°Π΄Π΅Π»Π΅Π½Π°Ρ‚Π° ΠΏΠ°ΠΌΠ΅Ρ‚, ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π° ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС.

Для Π±ΠΎΡ€ΡŒΠ±Ρ‹ с опасными ΠΏΡ€ΠΈΡ‘ΠΌΠ°ΠΌΠΈ программирования Π² clang прСдлагаСтся Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ прСдупрСТдСния компилятора для всСх арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с указатСлями, ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π½Π° прСдупрСТдСния linter-Π° clang-tidy, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΈ использовании Ρ„Π»Π°Π³Π° Β«cppcoreguidelines-pro-bounds-pointer-arithmeticΒ», ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ появится Π² выпускС LLVM 16. Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π² clang Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π»Π°Π³, Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π’ libc++ сС ΠΏΠ»Π°Π½ΠΈΡ€Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ Π·Π° усилСна Π·Π°Ρ‰ΠΈΡ‚Π°, ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС Ρ‰Π΅ сС засичат някои ситуации, Π²ΠΎΠ΄Π΅Ρ‰ΠΈ Π΄ΠΎ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. НапримСр, Π² класовСтС std::span ΠΈ std::vector Ρ‰Π΅ сС слСди Π΄ΠΎΡΡ‚ΡŠΠΏΡŠΡ‚ извън Π·Π°Π΄Π΅Π»Π΅Π½Π°Ρ‚Π° област Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Ρ‰Π΅ Π·Π°Π²ΡŠΡ€ΡˆΠΈ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ смятат, Ρ‡Π΅ добавянСто Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ измСнСния Ρ‰Π΅ Π·Π°ΠΏΠ°Π·ΠΈ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ Π½Π° libc++ с C++ стандартитС, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Π±ΠΎΡ€ΡŠΡ‚ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° случаитС Π½Π° Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π»Π΅ΠΆΠΈ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€Π°Ρ‚ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎΡ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ ΠΊΠ°Ρ‚ΠΎ срив, изискващ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΡ‚Π΅, ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС Π² libc++, ΠΏΠ»Π°Π½ΠΈΡ€Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈ Π½Π° ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎΠΎΡ‚Π΄Π΅Π»Π½ΠΎ. Някои ΠΎΡ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ водят Π΄ΠΎ услоТняванС Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ ΠΈΠ»ΠΈ промяна Π² ABI, Π²Π΅Ρ‡Π΅ са Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° бСзопасния Ρ€Π΅ΠΆΠΈΠΌ Π½Π° libc++ (safe mode).

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ планируСтся ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ инструмСнтарий для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с Π³ΠΎΠ»Ρ‹ΠΌΠΈ указатСлями Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π² ситуациях, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, конструкция Β«if(array_pointer)Β» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π° Π² Β«if(span.data()Β»). ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Π½ΠΎ ΠΈ ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Ρ‚ΠΈΠΏΠΎΠ² с указатСлями.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster