Run Code  | Code Wall  | Users  | Misc  | Feedback  | About  | Login  | Theme  | Privacy 

About

Rextester - some online tools for anyone who finds them useful. It was started as online .net regex tester. Rextester stands for regular expression tester.

Short faq and troubleshooting.
Discussion forum.

Source code: part I and part II


Regex tester - .net regex tester.
Regex replace - .net regex replacement.
Regex reference - short regex reference.
Diff checker - find difference between two text fragments.
Run code - online compiling and execution for some languages.

C#, Visual basic
.Net framework v. 4.5 is used. Your code will be given max 5 sec of cpu time and limited memory (~150 Mb). Also your code will run in an appdomain with basic execution, reflection, thread control and web privileges only.
The entry point for your code is given Main method in type Program in namespace Rextester. This entry point shouldn't be changed. Types from following assemblies are available:
  • System.dll
  • System.Core.dll
  • System.Data.dll
  • System.Data.DataSetExtensions.dll
  • System.Xml.dll
  • System.Xml.Linq.dll
  • System.Numerics.dll
  • Microsoft.CSharp.dll - when C# is used
  • Microsoft.VisualBasic.dll - when Visual Basic is used
  • System.Net.dll
  • System.Web.dll
  • System.ComponentModel.DataAnnotations.dll
  • System.ComponentModel.Composition.dll
  • System.Drawing.dll
  • Newtonsoft.Json.dll
  • Let us know if you need more.
If you found security breaches and can break something in some way - we would appreciate your feedback on this.
Compiler versions:
Sql Server
Sql Server 2014 Express Edition is used. There is only one database that queries run against. Queries executed on behalf database owner so all sort of actions are allowed including DDL queries. However, all actions run in transaction which is rolled back immediately after execution is over. This way any desired objects may be built, populated with data and worked on within the scope of one request. There is 10 seconds limit for work to be completed. Execution of queries is achieved using ado.net mechanisms, in particular SqlDataReader type. This reader is also monitored for memory and cpu consumption.
'GO' statement just like in transact sql has special meaning: 'GO' will be removed from your code, but statements separated by 'GO' will be executed separately, in different batches. So, for example, if you want to create a function and later use it in select statement you have to separate create statement and select statement by 'GO', otherwise you'll receive an error from parser since in select statement you would be reffering to a function which doesn't yet exist.
For convinience there is simple pre-built schema, shown here.
MySQL
MySQL version 5.7.12 is used (on Windows). There is only one database that queries run against. Queries executed on behalf database owner so all sort of actions are allowed including DDL queries. However, all actions run in transaction which is rolled back immediately after execution is over. This way any desired objects may be built, populated with data and worked on within the scope of one request. There is 10 seconds limit for work to be completed. Unfortunately MySQL doesn't support rollback of DDL statements, so once object is created it stays. Therefore one should check if object exists before creating it and ideally drop it at the end of the script.
PostgreSQL
PostgreSQL setup is simillar to Sql Server.
Oracle
Oracle setup is simillar to MySQL.

Visual C++ (and C)
Your code is compiled to native binary which runs on Windows Server 2012 (maximum compile time is 30 seconds). Your process will be associated with job object that has LimitFlags.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE flag set. After 10 seconds of execution this process will be killed. This used to be the only security measures for a while. However, after discovering dubious services running and questionable .exes at some weird places it was decided to sandbox all usercode through Sandboxie.
Also let us know if you need some other Windows-based compilers.
Compiler version:
Client Side
This option allows you to create full javascript/css/html fiddle that runs in your browser. The result is displayed in a separate iframe. You can use anything that runs on a client side. Errors are examined in your browser's developer console.

Java, Python, C, C++ and others
These languages run on linux. For some languages compiler parameters could be supplied. Here are compiler versions (you can always check by running commands on a server): Your code will be run on behalf special user and group. Also your code will be executed from Python wrapper which sets various limits to the process. It does so by using 'setrlimit' system call. You'll have max 30 sec to compile, max 5 sec of cpu time to run, limited memory (~1500 Mb) and other restrictions will apply (like no writing permissions). Also your process and all its children will be run in a newly created process group which will be terminated after 10 seconds from start if still running.

We don't claim that this is secure. In many senses you'll have the power of special user. On a bright side, this has some useful side-effects. The reason why, at least for now, we leave so many potential security breaches is because it's hard to make it really secure. What are the options?
  • Codepad seems to 'ptrace' everything and disallow many system calls, for example, 'fork()'. That's pretty restrictive.
  • Apparmor - out of everything we tried, this did the job pretty well and it was rather easy to configure. But it doesn't work with OpenVZ virtualization that is used by our server provider.
  • SELinux - stopped reading documentation in the middle of it. Too (unnecessarily?) complex.
  • Native security mechanisms - like chroot and file permissions. Hard to make it secure this way without breaking the service and the system.
  • Chromium sandboxes that exist both for windows and linux. These sandboxes run chrome's page renderers and probably quite secure. Drawbacks are: hard to setup and possibly too limiting (however this needs to be verified)
So, if you can take the system down - then be it, but please report how you did this. Your advice on this topic is always welcome.

Input support
Everything that will be submitted as input will be piped to process via stdin stream. So your code should consume input as if it came from keyboard.

Live collaboration
Write code so that others see this real-time. Every participant can make changes and see changes made by others. We use Firepad and Firebase.

Credit
Special thanks goes to people behind CodeMirror, Edit area, Roslyn, MarkdownDeep, Firepad (and Firebase) and Coderev.

Code wall
Code wall as well as personal code walls - place code on a wall for public display. These entries will be crawled by search engines, so one possible use is to put there scripts that you may need for easy access later. For example, whenever I need a sql script for searching database definitions I simply search for 'sql definition rextester' and there is my script (it seems that code wall is crawled better than personal walls, though). It's important that code snippet have a meaningful title.

Feedback - give us feedback. We have implemented a lot of requests so far.
Login - once logged in you'll be able to track your saved snippets and more.


Stats (since 2013-08-15)
Language     Runs    
C# 25180647
Pascal 7742281
C (gcc) 6091528
Javascript 5578760
Python 3 4594086
Java 4030745
C++ (gcc) 3735555
Sql Server 3676650
R 3630895
Common Lisp 2570330
Node.js 1810641
Oracle 1799630
Php 1445517
Python 1231584
C++ (vc++) 1223894
Bash 1165608
PostgreSQL 1154065
MySQL 1117414
Perl 991043
Haskell 973446
Visual Basic 884426
Tcl 737071
Lua 718398
C++ (clang) 606625
Prolog 602835
Fortran 521668
Assembly 437486
Ruby 418210
Octave 319417
C (clang) 255656
Objective-C 228235
C (vc) 179137
Kotlin 152238
Scheme 148761
Swift 103944
Ada 85055
Scala 83668
F# 72761
Go 53177
Brainf*** 38732
D 36179
Elixir 16391
Erlang 6500
Ocaml 6346
Unknown 4

Api
Restfull api is supported (POST only) at https://rextester.com/rundotnet/api. What needs to be supplied are these values (as http data name=val&name2=val2, content type header must not indicate json):
    LanguageChoice=Language number (see below)
    Program=Code to run
    Input=Input to be supplied to stdin of a process
    CompilerArgs=compiler args as one string (when applicable)
Returned is json string with the following properties:
    Result=Output of a program (in case of Sql Server - html)
    Warnings=Warnings, if any, as one string
    Errors=Errors, if any, as one string
    Stats=Execution stats as one string
    Files=In case of Octave and R - list of png images encoded as base64 strings
Language numbers:
    C# = 1
    VB.NET = 2
    F# = 3
    Java = 4
    Python = 5
    C (gcc) = 6
    C++ (gcc) = 7
    Php = 8
    Pascal = 9
    Objective-C = 10
    Haskell = 11
    Ruby = 12
    Perl = 13
    Lua = 14
    Nasm = 15
    Sql Server = 16
    Javascript = 17
    Lisp = 18
    Prolog = 19
    Go = 20
    Scala = 21
    Scheme = 22
    Node.js = 23
    Python 3 = 24
    Octave = 25
    C (clang) = 26
    C++ (clang) = 27    
    C++ (vc++) = 28
    C (vc) = 29
    D = 30
    R = 31
    Tcl = 32
    MySQL = 33
    PostgreSQL = 34
    Oracle = 35
    Swift = 37
    Bash = 38
    Ada = 39
    Erlang = 40
    Elixir = 41
    Ocaml = 42
    Kotlin = 43
    Brainf*** = 44
    Fortran = 45

Full javascript example:
<!DOCTYPE html>
<html>
<body>

    <head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script>
    $(document).ready(function(){
        $("button").click(function(){

		    var to_compile = {
			    "LanguageChoice": "1",
			    "Program": $("#code").val(),
			    "Input": "",
			    "CompilerArgs" : ""
		    };

		    $.ajax ({
			        url: "https://rextester.com/rundotnet/api",
			        type: "POST",
			        data: to_compile
			    }).done(function(data) {
			        alert(JSON.stringify(data));
			    }).fail(function(data, err) {
			        alert("fail " + JSON.stringify(data) + " " + JSON.stringify(err));
		        });
	    });
    });
    </script>
    </head>

    <textarea id="code">
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text.RegularExpressions;

        namespace Rextester
        {
            public class Program
            {
                public static void Main(string[] args)
                {
                    //Your code goes here
                    Console.WriteLine("Hello, world!");
                }
            }
        }      
    </textarea>
    <button id="run">Run</button>

</body>
</html>
    

Api stats:
Language     Runs    
C# 14695809
Python 3 1714354
Php 1468611
Java 847905
C++ (gcc) 635184
C (gcc) 599404
Javascript 370959
Bash 204287
Python 197635
Pascal 181303
Node.js 161744
Ruby 131637
Lua 110248
C (clang) 61135
Sql Server 42991
Haskell 23216
Brainf*** 18386
Go 16925
Swift 14539
R 14158
Objective-C 12713
C++ (clang) 12358
Perl 12097
Kotlin 9142
C++ (vc++) 7970
Assembly 6863
Common Lisp 6312
Visual Basic 5285
Scheme 4004
MySQL 3815
Prolog 3506
C (vc) 3484
D 3097
Scala 2673
F# 2173
Oracle 1945
Elixir 1896
Fortran 1214
Ada 681
Octave 619
PostgreSQL 586
Tcl 423
Ocaml 413
Erlang 367
Unknown 14