Mozilla сС ΠΏΡ€Π΅Ρ„Ρ€Π»ΠΈ Π½Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ ΠΌΠΎΡ‚ΠΎΡ€ со Ρ€Π΅Π³ΡƒΠ»Π°Ρ€Π΅Π½ ΠΈΠ·Ρ€Π°Π· со Chromium

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡ‹ΠΉ Π² Firefox JavaScript-Π΄Π²ΠΈΠΆΠΎΠΊ SpiderMonkey прСнСсСн Π½Π° использованиС ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, основанной Π½Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Irregexp ΠΈΠ· JavaScript-Π΄Π²ΠΈΠΆΠΊΠ° V8, примСняСмого Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… Π½Π° основС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π‘hromium. Новая рСализация RegExp Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° Π² выпускС Firefox 78, Π½Π°ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΌ Π½Π° 30 июня, ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ всС Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ элСмСнты ECMAScript, связанныС с рСгулярными выраТСниями.

ΠžΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π΄Π²ΠΈΠΆΠΎΠΊ RegExp Π² SpiderMonkey ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСзависимым ΠΈ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌ для Π·Π°ΠΌΠ΅Π½Ρ‹ Π±Π΅Π· нСобходимости внСсСния Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ. ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° Π² 2014 Π³ΠΎΠ΄Ρƒ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ примСняСмый Π² Firefox RegExp-Π΄Π²ΠΈΠΆΠΎΠΊ YARR Π½Π° Ρ„ΠΎΡ€ΠΊ Π΄Π²ΠΈΠΆΠΊΠ° Irregexp ΠΈΠ· V8. Irregexp завязан Π½Π° API V8, привязан ΠΊ сборщику мусора, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ спСцифичныС для V8 прСдставлСниС строк ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ модСль. Π’ процСссС Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌΡƒ API SpiderMonkey Π² 2014 Π³ΠΎΠ΄Ρƒ Π΄Π²ΠΈΠΆΠΎΠΊ Irregexp частично пСрСписали, Π° ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ измСнСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ„Π»Π°Π³ β€˜\u’, ΠΏΠΎ возмоТности прСнСсСн Π² ΠΎΡ‚Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ Mozilla.

К соТалСнию, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ синхронизированного Ρ„ΠΎΡ€ΠΊΠ° являСтся Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΈ Π΅Π³ΠΎ сопровоТдСниС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… рСсурсов. Π‘ появлСниСм Π² стандартС ECMAScript 2018 Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй, связанных с рСгулярными выраТСниями, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Mozilla Π·Π°Π΄ΡƒΠΌΠ°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ пСрСнос ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈΠ· Irregexp. Π’ качСствС Π²Ρ‹Ρ…ΠΎΠ΄Π° Π±Ρ‹Π»Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° концСпция обвязки, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² SpiderMonkey ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹ΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ Irregexp (измСнСния сводятся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ автоматичСской Π·Π°ΠΌΠ΅Π½Π΅ Π±Π»ΠΎΠΊΠΎΠ² Β«#includeΒ»).

Mozilla сС ΠΏΡ€Π΅Ρ„Ρ€Π»ΠΈ Π½Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ ΠΌΠΎΡ‚ΠΎΡ€ со Ρ€Π΅Π³ΡƒΠ»Π°Ρ€Π΅Π½ ΠΈΠ·Ρ€Π°Π· со Chromium

Обвязка прСдоставляСт для Irregexp Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ спСцифичныС возмоТности V8, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΊΠΎΠ΄Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ исходныС структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π½Π° основС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠΎΠ΄Π° ΠΈ структур SpiderMonkey.

ОбновлСниС RegExp-Π΄Π²ΠΈΠΆΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π² Firefox ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚Π°ΠΊΠΈΡ… возмоТностСй, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ (named captures), экранированиС классов Unicode-символов, Ρ„Π»Π°Π³ dotAll ΠΈ Ρ€Π΅ΠΆΠΈΠΌ Lookbehind:

  • Π˜ΠΌΠ΅Π½ΡƒΠ²Π°Π½ΠΈ Π³Ρ€ΡƒΠΏΠΈ Π²ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π° Π΄Π° ΠΏΠΎΠ²Ρ€Π·Π΅Ρ‚Π΅ Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ Π½ΠΈΠ·Π° ΡˆΡ‚ΠΎ сС совпаѓаат со Ρ€Π΅Π³ΡƒΠ»Π°Ρ€Π΅Π½ ΠΈΠ·Ρ€Π°Π· со ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ имиња намСсто сСриски Π±Ρ€ΠΎΠ΅Π²ΠΈ Π½Π° ΡΠΎΠ²ΠΏΠ°Ρ“Π°ΡšΠ° (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, намСсто β€ž/(\d{4})-(\d{2})-(\d{ 2})/β€œ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ β€ž/( ? \d{4})-(? \d{2})-(? \d{2})/β€œ ΠΈ пристапСтС Π΄ΠΎ Π³ΠΎΠ΄ΠΈΠ½Π°Ρ‚Π° Π½Π΅ ΠΏΡ€Π΅ΠΊΡƒ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚[1], Ρ‚ΡƒΠΊΡƒ ΠΏΡ€Π΅ΠΊΡƒ result.groups.year).
  • БСгство ΠΎΠ΄ часови Π£Π½ΠΈΠΊΠΎΠ΄ Π·Π½Π°Ρ†ΠΈΡ‚Π΅ Π΄ΠΎΠ΄Π°Π²Π°Π°Ρ‚ конструкции \p{...} ΠΈ \P{...}, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, \p{Number} Π³ΠΈ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° ситС ΠΌΠΎΠΆΠ½ΠΈ Π·Π½Π°Ρ†ΠΈ ΡˆΡ‚ΠΎ ΠΏΡ€ΠΈΠΊΠ°ΠΆΡƒΠ²Π°Π°Ρ‚ Π±Ρ€ΠΎΠ΅Π²ΠΈ (Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Ρ˜ΡœΠΈ симболи ΠΊΠ°ΠΊΠΎ β‘ ), \p{Азбучно} - Π±ΡƒΠΊΠ²ΠΈ (Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Ρ˜ΡœΠΈ Ρ…ΠΈΠ΅Ρ€ΠΎΠ³Π»ΠΈΡ„ΠΈ ), \p{ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ°} β€” ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡ΠΊΠΈ симболи ΠΈΡ‚Π½.
  • Π—Π½Π°ΠΌΠ΅ Ρ‚ΠΎΡ‡ΠΊΠ°Π‘ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΡƒΠ²Π° палСњС Π½Π° маската β€ž.β€œ. Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Ρ˜ΡœΠΈ Π·Π½Π°Ρ†ΠΈ Π·Π° Π΄ΠΎΠ²ΠΎΠ΄ Π½Π° линија.
  • Π Π΅ΠΆΠΈΠΌ Π“Π»Π΅Π΄Π°Ρ˜ ΠΏΠΎΠ·Π°Π΄ΠΈ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° ΠΎΠ΄Ρ€Π΅Π΄ΠΈΡ‚Π΅ Π²ΠΎ Ρ€Π΅Π³ΡƒΠ»Π°Ρ€Π΅Π½ ΠΈΠ·Ρ€Π°Π· Π΄Π΅ΠΊΠ° Π΅Π΄Π½Π° шСма ΠΌΡƒ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³Π° (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΎΠ²ΠΏΠ°Ρ“Π°ΡšΠ΅ Π½Π° износ ΠΎΠ΄ Π΄ΠΎΠ»Π°Ρ€ Π±Π΅Π· Π΄Π° Π³ΠΎ Ρ„Π°Ρ‚ΠΈΡ‚Π΅ Π·Π½Π°ΠΊΠΎΡ‚ Π·Π° Π΄ΠΎΠ»Π°Ρ€).

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Π±Ρ‹Π» осущСствлён ΠΏΡ€ΠΈ участии Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² V8, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ со своСй стороны ΠΏΡ€ΠΎΠ²Π΅Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ ΡΠΎΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΡŽ зависимости Irregexp ΠΎΡ‚ V8, ΠΈ вынСсли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ особСнности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π±Π°Π·Π΅ SpiderMonkey, Π² ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Π±Π»ΠΎΠΊΠΈ Β«#ifdefΒ». БотрудничСство оказалось Π²Π·Π°ΠΈΠΌΠΎΠ²Ρ‹Π³ΠΎΠ΄Π½Ρ‹ΠΌ. Π‘ΠΎ своСй стороны Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Mozilla ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π² Irregexp измСнСния, ΡƒΡΡ‚Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСдослСдности с трСбованиями стандарта JavaScript ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ качСство ΠΊΠΎΠ΄Π°. Π’Π°ΠΊΠΆΠ΅ Π² Ρ…ΠΎΠ΄Π΅ fuzzing-тСстирования Firefox Π±Ρ‹Π»ΠΈ выявлСны ΠΈ устранСны Ρ€Π°Π½Π΅Π΅ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ ошибки Π² ΠΊΠΎΠ΄Π΅ Irregexp, приводящиС ΠΊ ΠΊΡ€Π°Ρ…Π°ΠΌ.

Π˜Π·Π²ΠΎΡ€: opennet.ru

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€