ΠΠ½ΠΆΠ΅Π½Π΅ΡΠΈΡΠ΅ ΠΎΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° 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
