A Day of Bugfixing

Catastrophic Regexes

Today I learned that improperly defined regular expressions can behave similarly to an infinite loop. It's not infinite - but runtime takes so long, and the program is unresponse that entire time - that it feels like it might as well be an infinite loop.

It has something to do with how regexes traverse a string. With a long enough string, the possibility space for determining whether it matches a regex can increase exponentially, leading to a very long search time.

Or something - I'm not sure that the description I gave is useful. I pesonally thought the issue was an infinite loop, and had gone through practically all of my loops before figuring out the issue (trying to use a /\${(.|\s)*})/gm regex to detect template literals).

The general rule of thumb here is to avoid using both . and * (wildcard character, wildcard length) in the same expression of a regex, and to avoid complex logical ORs.

More information here: https://javascript.info/regexp-catastrophic-backtracking

eval-ing JS template literals with \${} in code tags

The template system that wanderer uses borrows JS template literals to do most of the heavy lifting; at its core, templates call eval() on the HTML template with the configuration as inserted values

However, this meant that writing \${} in a code example would cause serious problems, because the program would attempt to use it as a template literal, usually throwing exceptions since example code wasn't meant to run.

The main solution I found to this was to escape all my $ symbols (by writing them as \\$ in the source file). It's not a terribly pretty solution, but will do in a pinch. The template parser unescapes them after all the rest of the processing is done.

true != "true"

This was an oversight on my part. Regardless of whether I'm using TOML or JSON or YAML, they would've all caused me to trip up about this.