• Италия

  • Восточная Индия: штат Орисса и Варанаси, январь 2007



  • Это вообщем-то просто прикол.
    Я видел в интернете онлайн компиляторы. Даже о них немного писал.
    Ну, что же? Вещь очень интересная и в чём-то даже полезная.
    Например когда нужно быстро протестировать некоторый код, а под рукой нет машины с компилятором.
    Может начальство или преподаватели злые, запретили ставить свои компиляторы и даже админских прав не дают. Или это интернет кафэ.
    А может быть машина слишком слабая, например нетбук, планшетник или даже телефон.
    Конечно, при желании, на любую машину, можно воткнуть хоть какой-то компилятор. А если надо быстро и прямо сейчас?
    Онлайн компилятор, будет в самый раз. Полноценной девелоперской машины он конечно не заменит, но с него этого и не требуеться.
    да и немного поигравшись с подобным сервисом, я решил, что он удобен даже на девелоперской машине, на которой все эти компиляторы есть. Покрайней мере, лично мне, оказалось куда проще, тестить некоторые программки, в онлайн компиляторе, чем в полноценной среде разработки.

    Но в купе со всем прочим, я столкнулся с ещё одной проблемой. Онлайн компиляторы урезаны. Удалены некоторые заголовочные файлы, а программы выполняются в песочнице.
    По сути это правильно. Так ведь безопастнее.
    Это же ведь огромная дырища в безопастности. Кто угодно может придти, скомпилировать на машине свой код, а потом его выполнить.
    Жесть полная! Естественно надо это ограничивать.

    Тут могут быть два варианта, либо давать всем, но сажать в песочницу, либо только избранным, но с более широкими правами.

    А я же, чисто для себя, сделал свой домашний онлайн компилятор. Код ниже, не являеться чем-то эксклюзивным. Над ним ещё работать и работать.
    Но первая задача, которую я поставил, скриптом была решена.
    Это позволить вводить стандартные програмки на языке C++, компилировать их, и показывать результаты работы программы.

    Сразу говорю ограничения, которые могут быть позже сняты.
    Доступ к скрипту, исключительно по localhost. Механизм авторизации сделан, но для теста, я его урезал.

    Язык программы только C++. Другие языки, хоть и могу, но не делал.
    Кодировка программы и среды не учитываеться. Вывод программы может быть исключительно латиницей. Я кодировки вообще не трогал.
    Ввод программы... А нету его, не предусмотрен он!
    Время работы не ограничено, но тут уже всё зависит от настроек php. Но если прога входит в бесконечный цикл, то будет полный абзац!
    Абзац будет, если программа чего-то запрашивает или создаёт виндовые окна. Элементарный MessageBox выводиться невесть куда, но не на рабочий стол.

    Ну и собственно код php-скрипта:


    <?php

    // заголовок документа
    print( "<html>\r\n<head>\r\n" );
    printf( "<title>%s</title>\r\n", "compiler" );
    print( "</head>\r\n<body>\r\n<div>\r\n" );

    $ip_address = $_SERVER['REMOTE_ADDR' ];
    if( $ip_address != "127.0.0.1" )
    {
    printf( "<p>blocked ip: %s</p>\r\n", $ip_address );
    }
    else
    {

    printf( "<h2>%s</h2>\r\n", "source code" );

    // форма
    print( "<form method=\"POST\" >\r\n" );

    // поле ввода кода
    printf( "<div><textarea name=\"src\" >%s</textarea></div>\r\n",
    htmlspecialchars( isset( $_POST['src']) ? $_POST['src'] : '' )
    );

    // кнопка начала
    print( "<div><input type=\"submit\" value=\"start\" /></div>\r\n" );
    print( "</form>\r\n" );

    // код был получен
    if( isset( $_POST['src']) )
    {

    // генерирует имя временного файла
    $src_file = tempnam( "../temp", "src_" );

    // генерирует имя исполняемого файла
    $exe_file = "..\\temp\\" . basename( tempnam( "", "app_" ), ".tmp" ) . ".exe";

    // сохраняет код в файл
    file_put_contents( $src_file, $_POST['src'] );

    // компилирует
    putenv( "path=" . getenv( "path" ) . ";c:\\mingw\\bin" );
    exec( "g++.exe -x c++ -o " . $exe_file . " " . $src_file . " 2>&1", $compile_log, $errorlevel );

    printf( "<h2>%s</h2>\r\n", ( $errorlevel == 0 ) ? "compiler" : "error" );

    // вывод возвращённого текста
    print( "<div>\r\n" );
    foreach( $compile_log as $cl_line )
    {
    print( htmlspecialchars( $cl_line ) . "<br />\r\n" );
    }
    print( "</div>\r\n" );

    if( $errorlevel == 0 )
    {
    // результат
    printf( "<h2>%s</h2>\r\n", "result" );

    exec( $exe_file, $exec_log );

    // вывод возвращённого текста
    print( "<div>\r\n" );
    foreach( $exec_log as $e_line )
    {
    print( htmlspecialchars( $e_line ) . "<br />\r\n" );
    }
    print( "</div>\r\n" );
    }

    // удаляет временные файлы
    unlink( $src_file );
    unlink( $exe_file );
    }
    }

    // завершение документа
    print( "</div>\r\n</body>\r\n</html>\r\n" );
    ?>

    Если у вас есть идеи или дополнения, то буду рад их узнать. Например я пока не придумал, как убивать процесс. Понятно что командой "taskkill", но как её запустить в нужное время?




































































  • Италия

  • Восточная Индия: штат Орисса и Варанаси, январь 2007