Search code examples
c#javascriptregexvisual-studio-2012winjs

How to prevent loops in JavaScript that crash the browser or Apps?


I am creating a live editor in Windows 8.1 App using JavaScript. Almost done with that, but the problem is whenever I run such bad loops or functions then it automatically hangs or exits.

I test it with a loop such as:( It just a example-user may write its loop in its own way..)

for(i=0;i<=50000;i++)
{
   for(j=0;j<5000;j++){
     $('body').append('hey I am a bug<br>');
   }
}

I know that this is a worst condition for any app or browser to handle that kind of loop. So here I want that if user uses such a loop then how I handle it, to produce their output?

Or if its not possible to protect my app for that kind of loop, if it is dangerous to my app so I alert the user that:

Running this snippet may crash the app!

I have an idea to check the code by using regular expressions if code have something like for(i=0;i<=5000;i++) then the above alert will show, how to do a Regex for that?

Also able to include C# as back-end .


Solution

  • I've got 2 solutions:

    1.

    My first solution would be defining a variable startSeconds=new Date().getSeconds();.

    Then, using regex, I'm inserting this piece of code inside the nested loop.

    ;if(startSecond < new Date().getSeconds())break;
    

    So, what it does is each time the loop runs, it does two things:

    Checks if startSecond is less than current seconds new Date().getSeconds();.

    For example, startSecond may be 22. new Date().getSeconds() may return 24.Now, the if condition succeeds so it breaks the loop.

    Mostly, a non dangerous loop should run for about 2 to 3 seconds

    Small loops like for(var i=0;i<30;i++){} will run fully, but big loops will run for 3 to 4 seconds, which is perfectly ok.

    My solution uses your own example of 50000*5000, but it doesn't crash!

    Live demo:http://jsfiddle.net/nHqUj/4

    2.

    My second solution would be defining two variables start, max.

    Max should be the maximum number of loops that you are willing to run. Example 1000.

    Then, using regex, I'm inserting this piece of code inside the nested loop.

    ;start+=1;if(start>max)break;
    

    So, what it does is each time the loop runs, it does two things:

    1. Increments the value of start by 1.

    2. Checks whether start is greater than the max. If yes, it breaks the loop.

    This solution also uses your own example of 50000*5000, but it doesn't crash!

    Updated demo:http://jsfiddle.net/nHqUj/3

    Regex I'm using:(?:(for|while|do)\s*\([^\{\}]*\))\s*\{([^\{\}]+)\}