Ten years in the wrong regex lane

Today I want to share the story of a couple of regular expressions — a tiny inaccuracy in them ended up costing the world more than 50 million hours of CPU time on iOS devices.

Disclaimer: this post is packed with technical details and might be a tough read if you don’t know how to code.

How content blockers work in Safari

First, let me explain how ad blockers in Safari actually work. The fact is, AdGuard on iOS relies on Safari’s built-in mechanism called Safari Content Blockers.

These days, there’s also support for an alternative approach — declarativeNetRequest (DNR), partially compatible with Chrome and Firefox. Interestingly enough, in Safari’s case, DNR rules are silently translated into Safari Content Blocker rules under the hood.

The very first version of AdGuard for iOS was released in October 2015, and right away we ran into a nasty problem. Historically, ad blockers have always used their own filtering rule syntax. It’s powerful and specifically designed for web filtering. Apple, however, introduced their own take on it, which was quite different from what the community was used to.

To jump ahead a little: when Chrome introduced declarativeNetRequest, they also went their own way. At least when it came to URL matching, their syntax was much closer to what we were familiar with.

Here’s an example of how a standard AdGuard rule gets converted into syntax supported by Safari:

Converting an AdGuard rule into a Safari-accepted rule

Notice what happens to the URL pattern. In AdGuard filters, we use a special wildcard-like syntax tailored specifically to URLs. The reason is simple: traditional regular expressions are too slow for this job.

Regular expressions

Safari Content Blockers, on the other hand, rely on regular expressions — although in a very stripped-down form, so that they can still be compiled into a structure that speeds up matching.

If you’re curious about the internals: Safari builds a DFA bytecode out of regex patterns, which is then executed by a custom interpreter: DFABytecodeInterpreter.cpp.

Regexps are more versatile than the standard ad blocker syntax. Unfortunately, that flexibility isn’t really relevant for web content filtering. What we get instead is very slow rule compilation that eats up resources, plus strict limits on how many rules filters can contain. We’ve written before about Safari’s issues, and most of them are still around.

Pattern conversion v1.0

So, back in 2015, we had to figure out how to convert AdGuard’s URL patterns into regexps that Safari would accept.

We faced two major tasks at the time.

First, we needed to cut down the total number of rules in the final set. Back then, Safari had a hard limit of 50,000 rules. (We described how we tackled this in our post about ad blocking in Safari).

By the way, the current limit has been raised to 150,000. However, due to process memory limits, you can only use around 60–80K in practice. We reported this to Apple a couple of times (Apple Feedback Assistant reports: FB19728743, FB13282146), but to no avail.

The second task was to ensure the regexps we generated were efficient enough to run fast and lightweight enough for iOS to compile them. In those days, we sometimes saw the system kill the com.apple.Safari.ContentBlockerLoader process because it consumed too many resources.

After a lot of manual testing, we settled on what seemed like the optimal conversion rules:

  • The symbol || (“start of URL”) became ^[htpsw]+://([a-z0-9-]\.)?
  • The symbol ^ (“separator”) became [/:&?]

We felt confident we’d done our homework, so we stopped worrying about it and left things as they were — for nearly ten years.

We were wrong

It all started with another bug report. The issue was that our standard conversion method slightly changed the semantics of the special || symbol. On iOS, it ended up matching only a single subdomain level, while in every other version of AdGuard it matched across all levels.

The simple fix was to use the regular expression originally suggested by the WebKit developers back in 2015 — the one we had dismissed as “non-optimal” at the time. But we were so sure of our choice back then that we didn’t even bother to recheck until recently.

The changes we should have made were dead simple:

  • Replace || with ^[^:]+://+([^:/]+\.)?
  • Replace ^ in most cases with [/:]

But was there really that much of a difference? Turns out — oh yes, there was.

Oh boy, how wrong we were

After swapping in the new regexps, we ran a couple of quick tests and the results blew us away. Rule loading speed in Safari didn’t just improve a little — it skyrocketed.

To put it in numbers: compiling the Tracking Protection filter in Safari became 5.5 times faster, and compiling the Base filter became 2.8 times faster.

And to make it more tangible, just take a look at the video below:

When you add up the number of AdGuard users over the past decade, and how many times the app had to recompile filters, the wasted CPU time comes out to at least 50 million extra hours on iOS devices.

I honestly feel ashamed about this mistake — especially knowing that the correct solution was staring us in the face the whole time. In hindsight, it’s clear that these new regexps were obviously going to compile and run faster than what we had chosen.

So what exactly was our mistake back then? I think it all comes down to a flawed testing methodology. We tried to judge “by eye,” instead of:

  1. Defining a clear set of criteria: memory usage, speed, and actual content blocker performance in the browser.
  2. Most importantly: learning how to measure those things precisely. Not by eyeballing Activity Monitor or top, but by using a proper profiler.

The good news is, this problem is now fixed. And I really hope we’ve learned the lessons we needed to, so we won’t repeat mistakes like this in the future.

Líbil se vám tento příspěvek?
AdGuard VPN AdGuard DNS AdGuard Mail AdGuard Wallet
AdGuard VPN AdGuard DNS AdGuard Mail AdGuard Wallet
Hlavní obrazovka AdGuard pro Windows
Obrazovka Ochrana v aplikaci AdGuard pro Windows, zobrazující funkce a nastavení ochrany
Obrazovka Statistik aplikace AdGuard pro Windows zobrazující statistiky blokovaných reklam a sledovacích prvků
Obrazovka Správa aplikací AdGuard pro Windows, zobrazující možnosti správy ochrany pro aplikace nainstalované na zařízení
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard: blokovač reklam pro Windows

AdGuard pro Windows je víc než jen blokátor reklam. Je to víceúčelový nástroj, který blokuje reklamy, řídí přístup k nebezpečným webům, zrychluje načítání stránek a chrání děti před nevhodným obsahem
Stažením programu přijímáte podmínky Licenční smlouvy
Microsoft Store
Stažením programu přijímáte podmínky Licenční smlouvy
AdGuard pro Windows v8.0, 14-denní zkušební verze
Hlavní obrazovka AdGuard pro Mac
Obrazovka režimu utajení aplikace AdGuard pro Mac
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard: blokovač reklam pro Mac

AdGuard pro Mac je jedinečný blokátor reklam navržený s ohledem na macOS. Kromě ochrany před obtěžujícími reklamami v prohlížečích a aplikacích vás chrání před sledováním, phishingem a podvody
Stažením programu přijímáte podmínky Licenční smlouvy
Čtěte dál
AdGuard pro macOS v2.19, 14-denní zkušební verze
Hlavní obrazovka AdGuard pro Android
Obrazovka Ochrana před sledováním AdGuard pro Android
Obrazovka Správa aplikací AdGuard pro Android, zobrazující možnosti správy ochrany pro aplikace nainstalované na zařízení
Obrazovka Statistiky aplikace AdGuard pro Android zobrazující statistiky blokovaných reklam a sledovačů
Hlavní obrazovka soukromého prohlížeče AdGuard pro Android
QR kód pro stažení AdGuardu pro Android
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard: blokovač reklam pro Android

Blokuje reklamy a sledovací prvky ve všech prohlížečích, hrách a dalších aplikacích. Chrání vaše soukromí a umožňuje vám kontrolovat, jak vaše aplikace používají internet. Instalováno pomocí APK
Stažením programu přijímáte podmínky Licenční smlouvy
Čtěte dál
Naskenovat a stáhnout
Použijte libovolnou čtečku QR kódů dostupnou ve vašem zařízení
AdGuard pro Android v4.14, 14-denní zkušební verze
Hlavní obrazovka AdGuard pro iOS
Obrazovka Ochrana aplikace AdGuard pro iOS, zobrazující funkce ochrany a nastavení
Obrazovka Statistik aplikace AdGuard pro iOS, zobrazující statistiky blokovaných reklam a sledovacích prvků
QR kód pro stažení AdGuard pro iOS
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard: blokovač reklam pro iOS

Nejlepší blokátor reklam pro iOS na iPhone a iPad. AdGuard odstraňuje všechny druhy reklam a sledovacích prvků v Safari a chrání vaše soukromí ve všech aplikacích na úrovni DNS
Stažením programu přijímáte podmínky Licenční smlouvy
Čtěte dál
Naskenovat a stáhnout
Použijte libovolnou čtečku QR kódů dostupnou ve vašem zařízení
AdGuard pro iOS v4.5
Hlavní obrazovka AdGuard Content Blocker
Obrazovka filtrů AdGuard Content Blocker
Obrazovka nastavení AdGuard Content Blocker
20 464 20464 uživatelských recenzí
Vynikající!

Blokátor obsahu AdGuard

Blokátor obsahu AdGuard eliminuje všechny druhy reklam v mobilních prohlížečích, které podporují technologii blokování obsahu — jmenovitě Samsung Internet a Yandex. Browser. Je více omezen než AdGuard pro Android, ale je zdarma, snadno se instaluje a stále poskytuje vysokou kvalitu blokování reklam
Stažením programu přijímáte podmínky Licenční smlouvy
Čtěte dál
Blokátor obsahu AdGuard v2.8
Hlavní obrazovka Rozšíření prohlížeče AdGuard
Obrazovka Ochrana před sledováním Rozšíření prohlížeče AdGuard
20 464 20464 uživatelských recenzí
Vynikající!

Rozšíření prohlížeče AdGuard

AdGuard je nejrychlejší a nejlehčí rozšíření pro blokování reklam, které účinně blokuje všechny typy reklam na všech webových stránkách! Vyberte si AdGuard pro prohlížeč, který používáte a získejte rychlé a bezpečné prohlížení bez reklam.
Instalovat
Stažením programu přijímáte podmínky Licenční smlouvy
Instalovat
Stažením programu přijímáte podmínky Licenční smlouvy
Instalovat
Stažením programu přijímáte podmínky Licenční smlouvy
Instalovat
Stažením programu přijímáte podmínky Licenční smlouvy
Instalovat
Stažením programu přijímáte podmínky Licenční smlouvy
Čtěte dál
Instalovat
Stažením programu přijímáte podmínky Licenční smlouvy
Čtěte dál
Rozšíření prohlížeče AdGuard v5.5
Hlavní obrazovka AdGuard Assistant
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard asistent

Doplněk prohlížeče pro desktopové aplikace AdGuard. Umožňuje blokovat vlastní položky na webových stránkách, přidávat webové stránky do seznamu povolených a odesílat hlášení přímo z prohlížeče
AdGuard asistent v1.4
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard Home

AdGuard Home je síťové řešení pro blokování reklam a slídičů. Nainstalujte jej jednou na svůj router a pokryjete všechna zařízení ve své domácí síti — není třeba žádný další klientský software. To je obzvláště důležité pro různá zařízení IoT, která často představují hrozbu pro vaše soukromí
AdGuard Home v0.107
Hlavní obrazovka AdGuard Pro pro iOS
Obrazovka ochrana AdGuard Pro pro iOS, zobrazující funkce ochrany a nastavení
Obrazovka statistiky AdGuard Pro pro iOS, zobrazující statistiky pro Zablokováno reklamy a slídiče
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard Pro pro iOS

AdGuard Pro pro iOS obsahuje všechny pokročilé funkce blokování reklam s povolenou ochranou. Nabízí stejné nástroje jako placená verze AdGuard pro iOS. Vyniká blokováním reklam v Safari a umožňuje upravit DNS nastavení, abyste si mohli ochranu přizpůsobit na zakázku. Blokuje reklamy v prohlížečích a aplikacích, chrání vaše děti před nevhodným obsahem a udržuje vaše osobní data bezpečná
Stažením programu přijímáte podmínky Licenční smlouvy
Čtěte dál
AdGuard Pro pro iOS v4.5
Hlavní obrazovka AdGuard Mini pro Mac
Obrazovka ochrany Safari AdGuard Mini pro Mac
Obrazovka Vytvořit pravidlo AdGuard Mini pro Mac
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard Mini pro Mac — blokátor reklam pro Safari

AdGuard Mini pro Mac je výkonný blokátor reklam v Safari. Tato malá aplikace odstraňuje reklamy, blokuje slídiče a zrychluje načítání stránek. Pomáhá vám procházet web v Safari bez rušivých vlivů a zachovávat soukromí vašich dat
Instalovat
Stažením programu přijímáte podmínky Licenční smlouvy
Čtěte dál
AdGuard Mini pro Mac v2.3
Hlavní obrazovka AdGuardu pro Android TV se zapnutou ochranou
Obrazovka blokování reklam aplikace AdGuard pro Android TV, zobrazující její funkce a nastavení
Obrazovka nastavení aplikace AdGuard pro Android TV
Obrazovka správy aplikací AdGuardu pro Android TV, zobrazující aplikace, ve kterých jsou blokovány reklamy a sledovací prvky
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard pro Android TV

AdGuard pro Android TV je jediná aplikace, která blokuje reklamy, chrání vaše soukromí a funguje jako firewall pro chytrou TV. Získejte varování před webovými hrozbami, používejte zabezpečený DNS a využívejte šifrovaný provoz. Uvolněte se a ponořte se do svých oblíbených pořadů se špičkovým zabezpečením a žádnými reklamami!
AdGuard pro Android TV v4.14, 14-denní zkušební verze
Maskot AdGuardu, Agnar, držící linuxového tučňáka
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard pro Linux

AdGuard pro Linux je první systémový blokátor reklamy pro Linux na světě. Blokujte reklamy a slídiče na úrovni zařízení, vyberte si z předinstalovaných filtrů nebo si přidejte vlastní — to vše prostřednictvím rozhraní příkazového řádku
AdGuard pro Linux v1.4
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard Temp Mail

Bezplatný generátor dočasných e-mailových adres, který vás udržuje v anonymitě a chrání vaše soukromí. Žádný spam ve vaší hlavní doručené poště!
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard VPN

75 umístění po celém světě

Přístup k jakémukoliv obsahu

Silné šifrování

Žádné záznamy aktivit

Nejrychlejší připojení

Podpora 24/7

Vyzkoušet zdarma
Stažením programu přijímáte podmínky Licenční smlouvy
Čtěte dál
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard DNS

AdGuard DNS je alternativní řešení pro blokování reklam, ochranu soukromí a rodičovskou kontrolu. Jednoduché nastavení a bezplatné používání poskytuje potřebné minimum ochrany proti online reklamám, slídičům a phishingu bez ohledu na to, jakou platformu a zařízení používáte.
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard Mail

Chraňte svou identitu, vyhněte se spamu a zabezpečte svou e-mailovou schránku pomocí našich aliasů a dočasných e-mailových adres. Využijte naši bezplatnou službu přeposílání e-mailů a aplikace pro všechny operační systémy
20 464 20464 uživatelských recenzí
Vynikající!

AdGuard Wallet

Bezpečná a soukromá kryptopeněženka, která vám dává plnou kontrolu nad vaším majetkem. Spravujte více peněženek a objevte tisíce kryptoměn, které můžete ukládat, posílat a vyměňovat
Stahování AdGuardu Chcete-li nainstalovat AdGuard, klikněte na soubor označený šipkou Vyberte „Otevřít“ a klikněte na tlačítko „OK“, poté počkejte, než se soubor stáhne. V otevřeném okně přetáhněte ikonu AdGuardu do složky „Aplikace“. Děkujeme, že jste si zvolili AdGuard! Vyberte „Otevřít“ a klikněte na tlačítko „OK“, poté počkejte, než se soubor stáhne. V otevřeném okně klikněte na tlačítko „Instalovat“. Děkujeme, že jste si zvolili AdGuard!
Nainstalujte si AdGuard i pro mobilní zařízení