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})/» ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ «/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/» ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π³ΠΎΠ΄Ρƒ Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· result[1], Π° Ρ‡Π΅Ρ€Π΅Π· result.groups.year).
  • Π­ΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ классов Unicode-символов добавляСт конструкции \p{…} ΠΈ \P{…}, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, \p{Number} опрСдСляСт всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ†ΠΈΡ„Ρ€ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ символы Π²ΠΈΠ΄Π° ①), \p{Alphabetic} — Π±ΡƒΠΊΠ²Ρ‹ (Π² Ρ‚ΠΎΠΌ числС ΠΈΠ΅Ρ€ΠΎΠ³Π»ΠΈΡ„Ρ‹), \p{Math} — матСматичСскиС символы ΠΈ Ρ‚.ΠΏ.
  • Π€Π»Π°Π³ dotAll ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΡŽ маски «.» Π² Ρ‚ΠΎΠΌ числС для символов ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки.
  • Π Π΅ΠΆΠΈΠΌ Lookbehind позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² рСгулярном Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ шаблон ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сумму Π² Π΄ΠΎΠ»Π»Π°Ρ€Π°Ρ… Π±Π΅Π· Π·Π°Ρ…Π²Π°Ρ‚Π° Π·Π½Π°ΠΊΠ° Π΄ΠΎΠ»Π»Π°Ρ€Π°).

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

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