subrutinas funciones perl subroutine

subrutinas - funciones en perl



¿Cómo puedo eliminar subrutinas indefinidas? (2)

Quiero escanear una base de código para identificar todas las instancias de subrutinas indefinidas que no se pueden alcanzar actualmente.

Como ejemplo:

use strict; use warnings; my $flag = 0; if ( $flag ) { undefined_sub(); }

Observaciones

  • Cuando $flag evalúa como verdadero, se emite la siguiente advertencia:

    Undefined subroutine &main::undefined_sub called at - line 6

    No deseo confiar en las advertencias emitidas en tiempo de ejecución para identificar las subrutinas indefinidas

  • Los strict y warnings pragmas no ayudan aquí. use strict ''subs'' no tiene efecto.

  • Incluso el siguiente fragmento de código es silencioso

    $ perl -Mstrict -we ''exit 0; undefined_sub()''


Lo que estás pidiendo es, al menos en cierto sentido, imposible. Considere el siguiente fragmento de código:

( rand()<0.5 ? *foo : *bar } = sub { say "Hello World!" }; foo();

Hay un 50% de posibilidades de que esto funcione correctamente y un 50% de probabilidad de que genere un error de "subrutina no definida". La decisión se toma en tiempo de ejecución, por lo que no es posible decir antes de qué será. Esto es, por supuesto, un caso artificial para demostrar un punto, pero la generación de subrutinas en tiempo de ejecución (o tiempo de compilación) no es poco común en el código real. Por ejemplo, mira cómo Moose agrega funciones que crean métodos. El análisis de código fuente estático nunca podrá analizar completamente dicho código.

B::Lint es probablemente tan bueno como algo que puede obtener antes del tiempo de ejecución.


Tal vez la política Subroutines :: ProhibitCallsToUndeclaredSubs de Perl :: Critic puede ayudar

Esta Política verifica que cada llamada de subrutina no calificada tenga una declaración de subrutina coincidente en el archivo actual, o que aparezca explícitamente en la lista de importación para uno de los módulos incluidos.

Esta "política" es una parte de Perl :: Critic :: StricterSubs , que debe ser instalada. Hay algunas políticas más allí. Esto se considera una violación de gravedad 4, por lo que puede hacer

perlcritic -4 script.pl

y analizar la salida para neither declared nor explicitly imported , o uso

perlcritic -4 --single-policy ProhibitCallsToUndeclaredSubs script.pl

Algunos usos legítimos todavía están marcados, ya que requiere que todos los subs se importen explícitamente.

Este es un analizador estático, que creo que debería adaptarse a su propósito.