Π€ΠΈΠ»ΠΈΠΏ ΠΠΈΠ·Π»ΠΎ (Filip Pizlo) ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΡΡΠ° SPLASHβ24 ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ Π½Π° C/C++ Fil-C, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π·Π°ΡΠΈΡΠ° ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΏΡΠΈΡΠΈΠ½Π΅Π½ΠΈ ΠΎΡ Π³ΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΠ°ΠΌΠ΅ΡΡΠ°. ΠΡΠΎΠ΅ΠΊΡΡΡ Π΅ Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠ»Π½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ Π²Π΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡ ΠΊΠΎΠ΄ Π½Π° C ΠΈ C++ β Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡΡ ΠΊΠΎΠ΄. ΠΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ Π΅ ΠΏΠΎΡΡΡΠΎΠ΅Π½ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° LLVM ΠΈ ΡΠ΅ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·Π° Apache 2.0. Runtime ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·Π° BSD. ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Π½Π°ΡΠΊΠΎΡΠΎ Π°Π½ΠΎΠ½ΡΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ TrapC, ΠΊΠΎΠΉΡΠΎ Π΅ Π² Π΅ΡΠ°ΠΏ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½Π΅, ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ Fil-C Π²Π΅ΡΠ΅ Π΅ Π³ΠΎΡΠΎΠ² Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΊΠΎΠ΄.
ΠΡΠΎΠ΅ΠΊΡΡΡ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π° C (libc) ΠΈ C++ (libc++), Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅ Musl ΠΈ LLVM libc++. Π‘ΡΠ΅Π΄ Π΄ΡΡΠ³ΠΎΡΠΎ, Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΊΠ°ΡΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΈΠ³Π½Π°Π»ΠΈ, ΠΌΠ°ΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° (mmap), longjmp/setjmp ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π² C++. Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Fil-C ΠΌΠΎΠ³Π°Ρ Π±Π΅Π· ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈ bzip2, zip, pcre ΠΈ ncurses. Π‘ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° OpenSSH, OpenSSL, CPython, SQLite, Lua, Curl, Lynx, jpeg6b, zsh, xzutils ΠΈ simdutf.
ΠΠ°ΡΠΈΡΠ°ΡΠ° ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° 128-Π±ΠΈΡΠΎΠ²ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ MonoCaps Ρ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΠΈ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ°Π½ΠΈΡΠΈΡΠ΅ Π½Π° Π±ΡΡΠ΅ΡΠΈΡΠ΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΡΠ΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ±ΠΎΡΡΠΈΠΊΠ° Π½Π° Π±ΠΎΠΊΠ»ΡΠΊ FUGC, ΠΊΠΎΠΉΡΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°. Π ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΠ°ΠΌΠ΅ΡΡΠ°, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎ ΡΠ΅ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΅ΠΊΡΠΏΠ»ΠΎΠ°ΡΠ°ΡΠΈΡΡΠ° Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ.
ΠΠ°ΡΠ²Π΅Π½ΠΎ Π΅, ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΡΠ° ΠΎΡ MonoCaps ΠΈ FUGC ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ΡΠΎ ΠΈ Π±Π»ΠΎΠΊΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ ΠΈΠ·Π²ΡΠ½ Π³ΡΠ°Π½ΠΈΡΠΈΡΠ΅ Π½Π° Π±ΡΡΠ΅ΡΠ° Π² ΡΡΠ΅ΠΊΠ° ΠΈ ΠΊΡΠΏΠ°, Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π²Π΅ΡΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ, ΡΡΡΡΠΎΡΠ½ΠΈΡ Π½Π° ΡΡΡΡΠ΅Π·Π°Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π½Π΅ΠΊΠΎΡΠ΅ΠΊΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΈΠΏΠΎΠ²Π΅ (Type Confusion) Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° ΠΏΡΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΈΠΏΠΎΠ²Π΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΈ Π½Π΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ (linking) ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π° va_lists. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Fil-C Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π³ΡΠ°Π½ΠΈΡΠΈΡΠ΅ ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ Π² Π±ΡΡΠ΅ΡΠΈΡΠ΅, ΠΏΡΠ΅Π΄Π°Π²Π°Π½ΠΈ ΠΏΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ.
Π¦Π΅Π½Π°ΡΠ° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Fil-C Π·Π° Π·Π°ΡΠΈΡΠ° Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΎΡ ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ Π΅Π·ΠΈΠΊΠΎΠ²ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ, Π΅ Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°. Π ΠΏΠ΅ΡΠΈΠΎΠ΄Π° Π½Π° Π½Π°ΡΡΠΎΡΡΠΎΡΠΎ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅, ΡΡΠ±ΡΠ°Π½ΠΈ Π² Fil-C, ΡΠ° Ρ ΠΎΠΊΠΎΠ»ΠΎ 1.5-5 ΠΏΡΡΠΈ ΠΏΠΎ-Π±Π°Π²Π½ΠΈ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΠΈ, Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ Ρ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠΈ. ΠΠ»Π°Π½ΠΈΡΠ° ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°, ΡΠ΅ ΡΠ»Π΅Π΄ Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΈ ΡΠ°Π±ΠΎΡΠ°, Π² ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ»ΡΡΠ°ΠΈ ΠΊΠΎΠ΄ΡΡ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Ρ 1.2 ΠΏΡΡΠΈ ΠΏΠΎ-Π±Π°Π²Π½ΠΎ, Π° Π² Π½Π°ΠΉ-Π»ΠΎΡΠΈΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ Π·Π°Π±Π°Π²ΡΠ½Π΅ΡΠΎ Π½ΡΠΌΠ° Π΄Π° Π½Π°Π΄Π²ΠΈΡΠΈ 1.5 ΠΏΡΡΠΈ. ΠΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° Linux Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΈ X86_64. ΠΡΠ΅Π΄ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ Π° macOS ΠΈ FreeBSD, Π½ΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΎ Π΄Π° Π½Π΅ ΡΠ΅ ΡΠ°Π·ΠΏΠΈΠ»ΡΠ²Π° ΡΡΠΈΠ»ΠΈΡΡΠ° ΠΈ ΠΏΡΡΠ²ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½ ΠΏΠΎΡΡ Π½Π° libc Π·Π° Π΅Π΄Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°.
ΠΡΡΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° Fil-C Π΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ½ΠΈΡΡ ΠΎΡΠΊΠ°Π· ΠΎΡ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Π½Π° Π½ΠΈΠ²ΠΎ ABI Π·Π° ΠΊΠΎΠ΄ Π½Π° C/C++, ΠΊΠΎΠ΅ΡΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ±ΡΠ°Π½ΠΈΡ Π² Fil-C ΠΊΠΎΠ΄ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ ΠΎΠ±Π΅ΠΊΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΡΠ±ΡΠ°Π½ΠΈ ΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠΈ. ΠΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π½Π°ΡΠΈΠ½ΡΡ Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π² Fil-C ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ ΠΎΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠΈ ΠΈ Π»ΠΈΠ½ΠΊΠ΅ΡΠΈ. Π’Π°ΠΊΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΠΎΠ±ΡΡΠ½ΡΠ²Π° Ρ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΏΡΠΈ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Ρ Π½Π΅Π·Π°ΡΠΈΡΠ΅Π½ ΠΊΠΎΠ΄ ΡΠ΅ Π³ΡΠ±ΠΈ ΡΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π½Π°ΡΠ° ΠΎΡ Fil-C Π·Π°ΡΠΈΡΠ° ΠΈ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΠΈΠ»ΡΠ·ΠΈΡ Π·Π° Π·Π°ΡΠΈΡΠ΅Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ABI ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π±ΠΈΡ Π° ΠΈΠΌΠ°Π»ΠΈ ΠΏΠΎΠ΄ΡΠΈΠΊ Π΄Π° ΡΡΠΈΠ·Π΄Π°Π²Π°Ρ Π² Fil-C ΡΠ°ΠΌΠΎ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π±Π΅Π· Π΄Π° ΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Ρ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ Ρ ΠΏΠΎΡΡΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡΡ MonoCap, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² Fil-C, ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π° Π½Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° 16-Π±Π°ΠΉΡΠΎΠ²ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, Π² ΠΊΠΎΠΈΡΠΎ ΠΎΡΠ²Π΅Π½ Π°Π΄ΡΠ΅ΡΠ° Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ°, ΡΠ΅ ΡΠΊΠ°Π·Π²Π° ΠΈ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈΡ ΠΊΡΠΌ ΠΎΠ±Π΅ΠΊΡ, Π²ΠΊΠ»ΡΡΠ²Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ (capability), ΠΊΠ°ΡΠΎ Π³ΠΎΡΠ½ΠΈ ΠΈ Π΄ΠΎΠ»Π½ΠΈ Π³ΡΠ°Π½ΠΈΡΠΈ Π½Π° Π±ΡΡΠ΅ΡΠ°, Π°ΡΠΎΡΠΈΠΈΡΠ°Π½ Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈ ΠΌΠ°ΡΠΈΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½ΠΈ Π² Π²ΡΠ΅ΠΊΠΈ Π±Π»ΠΎΠΊ ΠΏΠ°ΠΌΠ΅Ρ (1 Π±Π°ΠΉΡ Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΠΈΠΏΠ° (unset, int, ptr, free) Π·Π° Π²ΡΠ΅ΠΊΠΈ 16-Π±Π°ΠΉΡΠΎΠ² Π±Π»ΠΎΠΊ ΠΏΠ°ΠΌΠ΅Ρ). ΠΡΠΈ Π²ΡΡΠΊΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΡΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π³ΡΠ°Π½ΠΈΡΠΈ ΠΈ ΡΠΈΠΏ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΏΠ°ΠΌΠ΅Ρ Ρ ΡΠΈΠΏ βptrβ Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π°Ρ Π΄Π°Π½Π½ΠΈ Ρ ΡΠΈΠΏ βintβ ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ).
ΠΡΠΈΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ Π·Π°Π΄Π΅Π»ΡΠ½Π΅ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ ΠΎΡ ΡΠ±ΠΎΡΡΠΈΠΊΠ° Π½Π° Π±ΠΎΠΊΠ»ΡΠΊ FUGC (Filβs Unbelievable Garbage Collector), ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΏΡΠ΅Π²Π΅ΠΆΠ΄Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½ΠΈΡ Π±ΡΡΠ΅Ρ Π·Π°ΠΏΠΈΡΠΈ Π·Π° ΡΠΈΠΏΠΎΠ²Π΅ Π² ΡΡΠΎΠΉΠ½ΠΎΡΡ "free" ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΊΡΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ΠΈΡΠ΅ ΠΎΠ±Π΅ΠΊΡΠΈ Π½Π° ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΎΠ±Π΅ΠΊΡ, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ, ΡΠ΅ ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π²Π΅ΡΠ΅ Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½Π°. ΠΡΡΠΊΠΎ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½ΠΎ ΠΎΠ±ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΊΡΠΌ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½ΠΈ Ρ ΡΠΈΠΏ "free" ΠΈΠ»ΠΈ ΡΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π», ΡΠ²ΡΡΠ·Π°Π½ Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ΠΈΡ ΠΎΠ±Π΅ΠΊΡ, Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠΌΠ°Π³Π° Π·Π° Π·Π°ΡΠΈΡΠ° ΡΡΠ΅ΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΈΠΏΠ° use-after-free. Π‘Π±ΠΎΡΡΠΈΠΊΡΡ Π½Π° Π±ΠΎΠΊΠ»ΡΠΊ ΡΠ°Π±ΠΎΡΠΈ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΈ Π½Π΅ ΡΠΏΠΈΡΠ° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄ΡΡΠ³ΠΈ Π½ΠΈΡΠΊΠΈ.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ MonoCaps ΠΈ FUGC ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΎΠ±ΠΈΡΠ°ΠΉΠ½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΈ Π΄Π° ΡΠ΅ ΠΎΡΡΠ°Π²ΠΈ Π½Π΅ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½Π° ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ° malloc ΠΈ free, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠΉΠΊΠΈ Π² ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°Π½Π° Π·Π°ΡΠΈΡΠ°. ΠΠΎΠ΄ΡΡ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ΄ΡΡΠΆΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΠΊΠ°ΡΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΡΠΈΠΏΠΎΠ²Π΅, Π½Π΅Π²Π΅ΡΠ½ΠΈ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΡΡΡΡΠ΅Π·Π°ΡΠ΅Π»Π½ΠΈ ΡΡΡΡΠΎΡΠ½ΠΈΡ ΠΈ Π½Π΅ΡΠ²ΠΎΠ΅Π²ΡΠ΅ΠΌΠ΅Π½Π΅Π½ ΠΏΠΎΠ²ΠΈΠΊ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° free(), Π½ΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π°, Fil-C Π·Π°ΠΏΠΎΠΌΠ½Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ Π³ΡΠ°Π½ΠΈΡΠΈ ΠΈ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΡΠ²Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ, Π°ΠΊΠΎ Π±ΡΠ΄Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° ΠΎΠΏΠΈΡ Π·Π° Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π» Π΄ΠΎ ΠΎΠ±Π»Π°ΡΡ ΠΈΠ·Π²ΡΠ½ Π·Π°ΠΏΠΎΠΌΠ½Π΅Π½ΠΈΡΠ΅ Π³ΡΠ°Π½ΠΈΡΠΈ, Π°Π΄ΡΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ Π±Π»ΠΎΠΊ ΠΏΠ°ΠΌΠ΅Ρ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Ρ ΡΠΈΠΏ "int" ΠΊΠ°ΡΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ.
ΠΠ²ΡΠΎΡΡΡ Π½Π° Fil-C, Π€ΠΈΠ»ΠΈΠΏ ΠΠΈΠ·Π»ΠΎ, Π·Π°Π΅ΠΌΠ° Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° Epic Games ΠΏΠΎΡΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡ, ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈ Π΅Π·ΠΈΡΠΈ. Π€ΠΈΠ»ΠΈΠΏ ΠΈΠΌΠ° Π±ΠΎΠ³Π°Ρ ΠΎΠΏΠΈΡ Π² ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π²ΡΡΡ Ρ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈ Π΅Π·ΠΈΡΠΈ, ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠΈ ΠΈ ΡΠ±ΠΎΡΡΠΈΠΊΠΈ Π½Π° Π±ΠΎΠΊΠ»ΡΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² IBM ΡΠΎΠΉ ΡΠ°Π·Π²ΠΈΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈΡ Π΅Π·ΠΈΠΊ X10, Π² Microsoft ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ ΡΠ±ΠΎΡΡΠΈΠΊΠΈ Π½Π° Π±ΠΎΠΊΠ»ΡΠΊ Stopless, Clover ΠΈ Chicken, Π² Apple Π΅ ΡΠ°Π±ΠΎΡΠΈΠ» ΠΏΠΎ JIT-ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈΡΠ΅ Π½Π° Π±ΡΠ°ΡΠ·ΡΡΠ½ΠΈΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π» WebKit, Π° Π² Epic Games ΡΡΠΊΠΎΠ²ΠΎΠ΄ΠΈ Π΅ΠΊΠΈΠΏΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ, ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈΡ Π΅Π·ΠΈΠΊ Verse ΠΈ ΡΠ²ΡΡΠ·Π°Π½Π°ΡΠ° Ρ Π½Π΅Π³ΠΎ Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°. Π€ΠΈΠ»ΠΈΠΏ ΡΡΡΠΎ Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΊΠ»ΡΡΠΎΠ²ΠΈΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ Jikes RVM, Ovm ΠΈ Fiji VM.

ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
