¿Hay alguna vez una buena razón para usar eval ()?


Me parece que eval() es tratado con el mismo desdén que goto. Y por eval, me refiero a una función para ejecutar una cadena como código, como se ve en PHP, Python, JavaScript, etc. ¿Existe alguna vez una situación en la que se justifique el uso de eval() (excepto perl)? Y si no, ¿por qué tantos lenguajes lo implementan?

 23
Author: Bhargav Rao, 2009-12-01

11 answers

Sí - cuando no hay otra manera de realizar la tarea dada con un nivel razonable de claridad y dentro de un número razonable de líneas de código.

Esto elimina el 99% de los casos en los que se usa eval, en todos los lenguajes y contextos.

 25
Author: yfeldblum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 15:32:15

Eval es a menudo la solución más conveniente en situaciones en las que se genera código dinámicamente. Incluso en lenguajes que no soportan oficialmente eval, como Java, soportan la reflexión y modificación de clases en tiempo de ejecución que son similares. (Ver libros como Stu Halloway Desarrollo de componentes para la Plataforma Java )

 9
Author: MattMcKnight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 16:17:30

Un uso razonable es si tiene un lenguaje interpretado que ha construido sobre otro lenguaje, pero aún desea proporcionar algún tipo de "escotilla de escape" para permitir a las personas volver a las funciones que proporciona el lenguaje subyacente. Un ejemplo es implementar Prolog en Lisp y luego definir un predicado que permita el uso directo de funciones Lisp a través de EVAL.

 4
Author: Pillsy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 15:40:32

Para hacks rápidos, no hay problema porque es una práctica salida rápida.

En código de producción, considéralo un último recurso-e incluso entonces, prueba otra cosa-porque eval es difícil de controlar y, por lo tanto, peligroso. Para cualquier cosa no trivial, implementar un sublenguaje.

 3
Author: Greg Bacon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 15:28:23

Lo utilicé una vez mientras pentesteaba un sitio: escribimos un pequeño script php que descifra y ejecuta cargas útiles firmadas criptográficamente desde fuentes de datos HTTP no registradas sobre la marcha. Este es el mejor uso que he visto de eval() hasta ahora.

(En otras palabras: no, nunca he visto un buen uso para eval)

 3
Author: L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 15:35:00

Pensamiento improvisado: eval es bueno para implementar el compilador de expresiones de un hombre pobre, o cosas por el estilo. También es un sustituto aburrido y oxidado de las macros higiénicas.

 2
Author: Jonathan Feinberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 15:23:04

Tal vez use sh y perl demasiado, pero nunca he visto a nadie tratar eval con el desdén que goto recibe.

Así que mi respuesta es: 'eval es adecuado cuando estás escribiendo perl 5 y sh'. El bloque eval es el principal try/catch mecanismo en Perl y es difícil escribir código seguro sin él.

 2
Author: William Pursell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 16:20:18

Escribir un ejemplo de libro de texto fresco sobre lo fácil que es implementar una "calculadora" en el lenguaje X? =)

 1
Author: Max Galkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 15:22:40

Para depurar/probar una idea antes de implementarla de la manera correcta.

Por ejemplo, estás haciendo una calculadora de juguete, y quieres trabajar en la gui primero, así que solo usa eval para hacer el trabajo "back-end" en segundo plano. Más tarde, vuelve al back-end, scratch eval, y escribe un analizador de expresiones adecuado.

 0
Author: hasen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 17:35:33

Al crear / probar segmentos de código eval es PERFECTO!

Simplemente construya una página web básica de andamiaje con áreas de texto y un botón de evaluación. Coloque el código en un área de texto y luego presione el botón eval. Es más rápido que cambiar entre el editor de texto y el navegador

Eval

edit code
press eval button

Método de conmutación

edit code
press save          extra step
switch to browser   extra step
press reload

Al hacer muchas pruebas y ajustes en el código, los pasos adicionales menores realmente pueden sumarse. Además, es posible que se olvide de guardar la creación de confusión cuando prueba.

 0
Author: user3015682,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-10 19:04:56

Eval se utiliza cuando se necesita 'generar' y ejecutar código. Y por generar me refiero a incluir desde una fuente externa (un archivo, un sitio web, un 'agente'), así como crear sobre la marcha dentro del programa.

Y la razón por la que desea generar código, aparte de los ejemplos obvios de módulos externos y sitios de evaluación, suele ser hacer referencia dinámicamente a los nombres de objetos y propiedades en el código.

El primer ejemplo, por cierto, ya ocurre cuando se carga una página HTML y tiene una etiqueta de script, o en los atributos de controlador de eventos de etiquetas HTML so así que desde el principio un desarrollador web está aprovechando EVAL, incluso si es el navegador que hace la llamada.

Lo que indirectamente me lleva a esa segunda razón accessing acceder a los nombres de los objetos.. En algunos lenguajes como Java, la capacidad de introspección reduce o elimina la necesidad de utilizar la evaluación de java. Resulta que dado que los objetos en Javascript son completamente dinámicos, un acceso a propiedades en Javascript es comparable a la introspección en otros idiomas, donde se puede acceder y hacer referencia a los nombres creados sobre la marcha. Además, Javascript tiene las funciones' call 'y' apply ' para llamar dinámicamente a funciones con sus parámetros.

Por último, en relación con la ejecución de código, se puede usar eval para aumentar el rendimiento instead en lugar de un acceso condicional o de propiedad de varios niveles que determina qué código ejecutar o qué objeto usar, se puede crear un fragmento de código mínimo que podría tener que ejecutarse cientos de miles de veces, evaluarlo a una función, y luego simplemente llamar a esa función. Esto podría funcionar con multimétodos, por ejemplo, una vez que se determinen los argumentos particulares en uso. Por supuesto, sin embargo, esto es un poco y lejos entre la razón ya que javascript trata las funciones como objetos de primera clase.

 0
Author: Gerard ONeill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-19 20:21:38