На Π±Π°Π·Π°Ρ‚Π° Π½Π° 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', ΠΌΠΎΠΆΠ΅ Π΄Π° сС внСдрява постСпСнно, Ρ„Π°ΠΉΠ» ΠΏΠΎ Ρ„Π°ΠΉΠ», Π±Π΅Π· Π΄Π° сС ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° цСлия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. ДобавянСто Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π° Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° сС свСТда Π΄ΠΎ ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ„Π°ΠΉΠ» с ΠΊΠΎΠ΄, отстраняванС Π½Π° прСдупрСТдСнията Π½Π° компилиращия ΠΈ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° тСстовС Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‚Π΅Π·ΠΈ Π΅Ρ‚Π°ΠΏΠΈ сС повтарят Π·Π° слСдващия Ρ„Π°ΠΉΠ». ΠšΠΎΠ΄ΡŠΡ‚ с Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈΡ‚Π΅ Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ остава ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌ с ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ C-ΠΊΠΎΠ΄ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ '-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