¿Por qué Online Judge falla durante los concursos de programación competitivos?

Geek, como usted conoce bien, de las plataformas de codificación que incluyen codificaciones competitivas como GeeksforGeeks, CodeChef, Codeforces, atCoder, SPOJ, HackerRank, HackerEarth y muchas más donde se supone que debe codificar directamente escribiendo directamente en sus respectivos editores o adjuntando un archivo de editor local como un editor sublime.

Why-Does-Online-Judge-Crashes-During-Competitive-Programming-Contests

¿Alguna vez se ha preguntado cómo se accede a los casos de prueba allí o, en términos más simples, cómo se compila y ejecuta nuestro código para verificar los casos de prueba? En estas plataformas donde la programación competitiva está alineada , el juez en línea actúa como columna vertebral para las presentaciones de códigos.

Descargo de responsabilidad importante: Consulte esta imagen para obtener una mejor comprensión antes de continuar. 

De la imagen de arriba, se puede percibir claramente que un adjudicador en línea recopila y ejecuta su código, muestra algún rendimiento o decisión. ¿Es tan básico? No, toda esta interacción es muy confusa. Hay algunos inconvenientes asociados con él que son los siguientes:

  1. Finalización del límite de tiempo: su código necesitaba salir en un momento determinado. ¿Podemos establecer un límite de tiempo al ejecutar un hilo en nuestro sistema operativo de forma predeterminada?
  2. Finalización del límite de memoria: su programa no ocuparía toda la memoria de su CPU. ¿Cómo podemos cambiar eso también, de alguna manera más fácil?
  3. Error de desbordamiento de pila: después de rastrear su programa, el sistema comprenderá si el programa se ejecutó correctamente o no. ¿Cómo podemos obtener esa información?

Bien, todo lo anterior es casi la complicación del sistema para verificar un programa. Aunque hay algunos problemas de seguridad. Como los usuarios pueden enviar cualquier tipo de código en el juez web, es bastante obvio que algunos pueden enviar algún código malicioso. ¿Qué tan malicioso?

  • Algunos códigos pueden ejecutar diferentes procesos.
  • Algún código puede investigar su directorio de documentos y obtener un poco de información.
  • Algunos códigos pueden ejecutar comandos administrativos.
  • Algunos códigos pueden devorar el ancho de banda del servidor.

Y hay numerosos hechos que un código puede hacer. Y evidentemente no necesita permitir que este sistema haga eso. Entonces, ¿cómo podemos poner en práctica estas pautas de permisos también? Entonces, geek, ahora debes preguntarte cómo una web decide manejar los escenarios anteriores, propondremos formas que son las siguientes a continuación:

Maneras:

Hay dos formas de enfoques de sandboxing de código mediante los cuales la web decide manejar los diferentes escenarios anteriores. 

  1. Manera coja
  2. Largo camino histórico

De todos modos, la técnica para restringir permisos y hardware para la protección del sistema se conoce como Code Sand-Boxing.

Manera 1: Manera coja

Incluso he visto algunos proyectos de decisión en línea en los que el desarrollador intentó descubrir las capacidades maliciosas en un código antes de ejecutarlo. Por ejemplo, si su código está en C++, la decisión primero analizará si puede haber alguna línea de código en la que se use la frase «sistema». Esta respuesta no funciona por una razón diferente, ya que muchos lenguajes de programación no funcionan de la misma manera. Puede generar una función dinámicamente y comunicarse con ella en varios lenguajes de programación, por lo que el filtrado no afectará el código de uno. Otra cosa, ¿qué sucede en caso de que desee imprimir «sistema» como salida? Esta respuesta dirá que el código es malicioso, pero no lo es.

Vía 2: Larga Vía Histórica

En este enfoque, la máxima decisión neta funciona. Y esta respuesta es relevante para el sistema totalmente basado en Linux.

El error de desbordamiento de pila/tiempo de ejecución se puede verificar a través del costo de recuperación de un programa. Si está lejos de 0, entonces puede decir que este sistema se ejecutó correctamente, de lo contrario, se bloqueó.

Las limitaciones de limitación de tiempo y problemas de límite de memoria se pueden proporcionar utilizando varias bibliotecas completas basadas en Unix. Algunos lenguajes de programación permiten esta forma de bandera de limitaciones de forma predeterminada, por ejemplo, Java. El límite de memoria y los límites de restricción de tiempo pueden proporcionarse mediante el uso de numerosas bibliotecas totalmente basadas en Unix. Algunos lenguajes de programación ayudan a que este tipo de límites se marquen de forma predeterminada, por ejemplo, Java.

El permiso de directorio es simple en Linux, simplemente crea un consumidor y permite que ese consumidor tenga algunos directorios además de algunos permisos de lectura/escritura. A continuación, ejecute una aplicación que use ese consumidor, se resolverá el problema de la lista de documentos. Además, ese código no puede ejecutar algunos comandos administrativos.

Limitar las habilidades de la comunidad también es posible mediante el uso de algunas bibliotecas, como Trickle. En esta solución, uno quiere configurar diversas bibliotecas y escribir diversos códigos simplemente para remediar un agujero de seguridad.

La manera contemporánea es la siguiente:

Todos los problemas anteriores se resuelven si usa Docker o Box basado principalmente en VM (Máquina virtual). Puedes crear una casilla si quieres tener una memoria preliminar, con permiso comunitario preestablecido, Restricción de tiempo para la casilla. Todas las molestias se pueden solucionar con la ayuda del uso de la máquina virtual. Los desarrolladores simplemente pueden estar al tanto de las cosas alternativas. En esta solución, toda la máquina de juzgar también puede parecer más lenta que las técnicas alternativas, pero absolutamente a gran escala es mucho más rápida y mucho más segura, purificadora que cualquier otra solución. Puede echar un vistazo a este GitHub Repo para reconocer cómo se puede usar la ventana acoplable para juzgar.

Toda esta forma de juzgar es una de las partes más importantes de un juez en línea. Para hacer cumplir la máquina de juzgar, uno quiere comprender cómo funciona el sistema operativo, además de cómo funciona el lenguaje de programación. Espero que haya recibido al menos algunos conocimientos durante todo el proceso.

Publicación traducida automáticamente

Artículo escrito por danihemanth y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *