Skip to content

Repository files navigation

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:

<scriptsrc="/js/loopBreaker.min.js"></script>

Usage

importloopBreakerfrom'loop-breaker';constsource='const myCode = "hello world";';constresult=loopBreaker(source,{sourceFileName: 'mySource.js',// Optional. Defaults to loopBreaker.js});consttransformedCode=result.code;constsourceMap=result.map;

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, and do-while loops a call to loopBreaker()

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(vari=0;i<1000000;i--){console.log(i);}

Will look like this:

var__loopBreaker=(function(){varcount=0;varstartTime;returnfunction(){startTime||(startTime=Date.now());count+=1;if(count>10000&&(Date.now()-startTime>1000)){thrownewError("Loop Broken!");}};}());for(vari=0;i<1000000;i--){__loopBreaker();console.log(i);}

About

Transforms JavaScript code to ensure that loops do not run indefinitely

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages