На Π±Π°Π·Π°Ρ‚Π° Π½Π° Clang Π·Π° Π΅Π·ΠΈΠΊΠ° C Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ Ρ€Π΅ΠΆΠΈΠΌ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π±ΡƒΡ„Π΅Ρ€ΠΈΡ‚Π΅

Π˜Π½ΠΆΠ΅Π½Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΡ‚ компанията Apple обявиха готовността си Π·Π° тСстванС Π½Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Β«-fbounds-safetyΒ» Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° Clang, ΠΊΠΎΠΉΡ‚ΠΎ прСдоставя Π³Π°Ρ€Π°Π½Ρ†ΠΈΠΈ Π·Π° бСзопасна Ρ€Π°Π±ΠΎΡ‚Π° с Π±ΡƒΡ„Π΅Ρ€ΠΈΡ‚Π΅ Π² ΠΊΠΎΠ΄Π° Π½Π° Π΅Π·ΠΈΠΊ C. Π Π΅ΠΆΠΈΠΌΡŠΡ‚ Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² ΡΡŠΡΡ‚Π°Π²Π° Π½Π° Ρ„ΠΎΡ€ΠΊΠ° LLVM, ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ ΠΎΡ‚ Apple Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Swift. Π’ Π±ΡŠΠ΄Π΅Ρ‰Π΅ Π΅ ΠΏΠ»Π°Π½ΠΈΡ€Π°Π½ΠΎ постСпСнно ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° функционалността Β«-fbounds-safetyΒ» Π² основната ΠΊΠΎΠ΄ΠΎΠ²Π° Π±Π°Π·Π° LLVM/Clang.

ΠžΡ‚Π±Π΅Π»ΡΠ·Π²Π° сС, Ρ‡Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΡŠΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° Π·Π°Ρ‰ΠΈΡ‚Π° Π²Π΅Ρ‡Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ сС ΠΏΡ€ΠΈΠ»Π°Π³Π° Π² ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° Apple, ΠΊΠ°Ρ‚ΠΎ ядрото XNU, Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€ΠΈΡ‚Π΅, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° със Π·Π²ΡƒΠΊ ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΈΡ‚Π΅ Π½Π° изобраТСния. Π’ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Β«-fbounds-safetyΒ» намалява производитСлността Π½Π° прилоТСнията срСдно с 5% (ΠΎΡ‚ -1% Π΄ΠΎ 29%), ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° ΠΊΠΎΠ΄Π° с 9.1% (ΠΎΡ‚ -1.4% Π΄ΠΎ 38%) ΠΈ забавя компилацията с 11%.

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Β«-fbounds-safetyΒ» Π·Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ ΠΎΡ‚ Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, ΡΠ²ΡŠΡ€Π·Π°Π½Π° с указатСля, изисква добавянС Π² ΠΊΠΎΠ΄Π° Π½Π° спСциални Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° заглавния Ρ„Π°ΠΉΠ» Β«ptrcheck.hΒ». Π‘ΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎΡ‚ΠΎ Π·Π°Ρ‰ΠΈΡ‚Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎΡ‚ΠΎ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π·Π° спазванС Π½Π° допустимитС Π³Ρ€Π°Π½ΠΈΡ†ΠΈ, добавяни Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° Ρ€ΡŠΡ‡Π½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ извСстни Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΈ.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π² ΠΊΠΎΠ΄Π° Π½Π° Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (wide pointer), ΠΏΡ€ΠΈ ΠΊΠΎΠΈΡ‚ΠΎ освСн адрСса сС ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‚ информация Π·Π° Π³ΠΎΡ€Π½Π°Ρ‚Π° ΠΈ Π΄ΠΎΠ»Π½Π°Ρ‚Π° Π³Ρ€Π°Π½ΠΈΡ†Π° Π½Π° Π±ΡƒΡ„Π΅Ρ€Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Β«-fbounds-safetyΒ» Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Π²Π° ABI (Application Binary Interface), Π½Π΅ промСня Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° СкспортиранитС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ Π½Π΅ изисква ΠΏΡ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° цСлия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ навСднъТ. Π’ Ρ€Π΅ΠΆΠΈΠΌΠ° Β«-fbounds-safetyΒ» Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ само Π² области, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ сС прСсичат с ABI, Π° Π·Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ влияят Π½Π° ABI, сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ с ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ Π½Π° Π±Π°Π·Π° Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ с информация Π·Π° Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅.

АнотациитС трябва Π΄Π° сС прикрСпят към ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π² ΠΏΠΎΠ»Π΅Ρ‚Π°Ρ‚Π° Π½Π° структуритС ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅, сочСщи към масив ΠΎΡ‚ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ към Π³Π»ΠΎΠ±Π°Π»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. Π—Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π² Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈΡ‚Π΅ Π½Π΅ трябва Π΄Π° сС добавят, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ сС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚ ΠΊΠ°Ρ‚ΠΎ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π²Π΅Ρ‡Π΅ Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ информация Π·Π° допустимитС Π³Ρ€Π°Π½ΠΈΡ†ΠΈ. Подсказки Π·Π° конструкциитС Π² ΠΊΠΎΠ΄Π°, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ добавянС Π½Π° Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, сС ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ‚ ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° ΠΏΡ€ΠΈ стартиранС с Ρ„Π»Π°Π³Π° Β«-fbounds-safetyΒ».

ΠœΠΎΠ΄Π΅Π»ΡŠΡ‚ Π·Π° Π·Π°Ρ‰ΠΈΡ‚Π°, основан Π½Π° β€ž-fbounds-safetyβ€œ, ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π²Π½Π΅Π΄Ρ€Π΅Π½ ΠΏΠΎΠ΅Ρ‚Π°ΠΏΠ½ΠΎ, Ρ„Π°ΠΉΠ» ΠΏΠΎ Ρ„Π°ΠΉΠ», Π±Π΅Π· Π΄Π° сС ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° цСлия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. ДобавянСто Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π° Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° сС свСТда Π΄ΠΎ ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ„Π°ΠΉΠ» с ΠΊΠΎΠ΄, отстраняванС Π½Π° прСдупрСТдСнията Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° ΠΈ ΠΏΡ€ΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° тСстовС Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‚Π΅Π·ΠΈ Π΅Ρ‚Π°ΠΏΠΈ сС повтарят Π·Π° слСдващия Ρ„Π°ΠΉΠ». ΠšΠΎΠ΄ΡŠΡ‚ с Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈΡ‚Π΅ Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ остава ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌ с обикновСния Π‘ΠΈ ΠΊΠΎΠ΄ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ β€ž-fbounds-safetyβ€œ (ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ с Π΄Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ Π±Π΅Π· Ρ„Π»Π°Π³Π° β€ž-fbounds-safetyβ€œ просто няма Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅).

По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈΠ΅ Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏ извън допустимитС Π³Ρ€Π°Π½ΠΈΡ†ΠΈ, сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ си. Аварийното ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ ΡΡŠΡ‰ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΡΡ‚ΡŠΠΏΠΈ ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Π½Π΅ΠΊΠΎΡ€Π΅ΠΊΡ‚Π½ΠΈ Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, Π·Π°Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° β€ž-fbounds-safetyβ€œ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ тСстванС Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° β€žint *pβ€œ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° анотация β€ž__counted_by(n)β€œ, която Π²ΠΊΠ°Ρ€Π²Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° допустимитС Π³Ρ€Π°Π½ΠΈΡ†ΠΈ, дСйстваща ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС. Ако сС ΠΎΠΏΠΈΡ‚Π°Ρ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠΎΠ΄Π° Π² Ρ€Π΅ΠΆΠΈΠΌ β€ž-fbounds-safetyβ€œ Π±Π΅Π· ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Ρ‚Π°Π·ΠΈ анотация, ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ ΠΈΠ·Π²Π΅Π΄Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° ΠΎΡ‚ΡΡŠΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ Π½Π° информация Π·Π° Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° масива ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΈΠ·Ρ€Π°Π·Π° β€žp[i] = 0β€œ. #include void init_buf(int *__counted_by(n) p, int n) { for (int i = 0; i < n; ++i) p[i] = 0; // Π² Ρ€Π΅ΠΆΠΈΠΌ β€ž-fbounds-safetyβ€œ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ сам Ρ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° Π½Π° ΠΊΠΎΠ΄Π° β€žif (i = n) trap();β€œ }

Π—Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΡ‚Π΅ сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: void foo(int i){ char *buf = (char *)malloc(10); // Π·Π° указатСля buf Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ свСдСния Π·Π° Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ buf[i] = 0xff; // Ρ‰Π΅ бъдС Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° β€žif (buf + i = buf + 10) trap();β€œ }

По Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ ΠΏΡ€ΠΎΠ²Π΅ΠΆΠ΄Π° оптимизация ΠΈ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π° добавянСто Π½Π° излишСн ΠΊΠΎΠ΄, Π°ΠΊΠΎ Π² ΠΊΠΎΠ΄Π° Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. НапримСр: for (size_t i = 0; i < count; ++i) { buf[i] = i; // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° "if (i = count) trap()" няма Π΄Π° бъдС Π΄ΠΎΠ±Π°Π²Π΅Π½Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎ-Π³ΠΎΡ€Π΅ Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° условиС β€ži < count" ΠΈ i Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ‚ 0. }

Основни Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ:

  • β€ž__counted_by(N)β€œ β€” опрСдСля Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π±ΡƒΡ„Π΅Ρ€Π° Π² Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° цСлСвия Ρ‚ΠΈΠΏ.
  • β€ž__sized_by(N)β€œ β€” опрСдСля Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π±ΡƒΡ„Π΅Ρ€Π° Π² Π±Π°ΠΉΡ‚ΠΎΠ²Π΅.
  • Β» __ended_by(P)Β» β€” Π·Π°Π΄Π°Π²Π° Π³ΠΎΡ€Π½Π°Ρ‚Π° Π³Ρ€Π°Π½ΠΈΡ†Π° Π½Π° Π±ΡƒΡ„Π΅Ρ€Π°.
  • Β«__null_terminatedΒ» β€” Π²Π·ΠΈΠΌΠ° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ нулСвия символ ΠΊΠ°Ρ‚ΠΎ ΠΊΡ€Π°ΠΉ Π½Π° Π±ΡƒΡ„Π΅Ρ€Π°.
  • Β«__singleΒ» β€” ΡΠ²ΡŠΡ€Π·Π²Π° указатСля с Π΅Π΄ΠΈΠ½ ΠΎΠ±Π΅ΠΊΡ‚. Използва сС ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π·Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ влияят Π½Π° ABI, освСн Π°ΠΊΠΎ Π½Π΅ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½Π° явно анотация.
  • Β«__bidi_indexableΒ» β€” Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» с информация Π·Π° Π³ΠΎΡ€Π½Π° ΠΈ Π΄ΠΎΠ»Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π°. Използва сС ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π·Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ влияят Π½Π° ABI.
  • Β«__indexableΒ» β€” Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» с информация Π·Π° Π³ΠΎΡ€Π½Π°Ρ‚Π° Π³Ρ€Π°Π½ΠΈΡ†Π°.
  • Β«__unsafe_indexableΒ» β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ (Π·Π° прСносимост с нСзаслуТСн ΠΊΠΎΠ΄, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΎΡ‚ външСн ΠΊΠΎΠ΄).

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

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