loop-breaker
A simple library that transforms JavaScript code to prevent loops from running infinitely.
loop-breaker
has the same goals as, and takes inspiration from,
loop-protect
. However, while
loop-protect
uses regular expressions to transform loops (smaller library
size, less accurate), loop-breaker
uses an AST transform (bigger library,
reliably accurate).
Installation
loop-protect
can be installed via npm
/yarn
:
$ npm install loop-protect
or
$ yarn add loop-protect
Or as a standalone script in the browser:
Usage
; const source = 'const myCode = "hello world";';const result = ; const transformedCode = resultcode;const sourceMap = resultmap;
How it works
Modifies input code to do the following:
- Adds a top-level function
__loopBreaker
which checks whether the currently executing loop should be broken - Injects into
for
,while
, anddo-while
loops a call toloopBreaker()
The loop is considered likely-infinite if the following two conditions hold:
- The loop has executed at least ten thousand times
- The loop has been running for at least one second of wall time
So, with the original input code:
for var i = 0; i < 1000000; i-- console;
Will look like this:
var __loopBreaker = { var count = 0; var startTime; return { startTime || startTime = Date; count += 1; if count > 10000 && Date - startTime > 1000 throw "Loop Broken!"; };};for var i = 0; i < 1000000; i-- ; console;