2015-03-30 1 views
4

Le comportement apparent de Perl est d'altérer les constantes dans les branches restant après l'élagage des branches en fonction d'une condition corrompue. Est-ce documenté?Affaiblissement des constantes dans les branches non élaguées

Ce sorties 1:

bash$ T="" perl -Tle ' 

use constant T=>$ENV{T}; 
use Scalar::Util qw/tainted/; 
exit if T; 
print tainted(0)' 

Il semble que le 0 constant est contaminé parce que tout après la sortie (dans le problème d'origine, il était un retour) est dans une branche qui reste après la taille de la branche est produite à base sur un état contaminé. Cela se révèle être une fonctionnalité très intéressante du mode d'altération de Perl, mais je ne trouve nulle part de documentation à ce sujet. Lorsque $ENV{T} n'est pas défini ou lorsque la condition est sur un accès dynamique à $ENV{T}, les constantes ne sont pas affectées. Par ailleurs, la meilleure réponse que je connaisse à ce moment au problème implicite de développement de logiciel associé à laquelle cette question se pose, est Comment désactiver une section de source perl de mode d'altération au moment du développement sans altérer mes constantes, est, définissez votre constante à une constante au lieu d'une variable d'environnement contaminé, comme ceci:

use constant DEBUG_MODE => ($ENV{DEV_DEBUG} ? 1 : 0); 
+0

Cela peut être fixé après 5,22 https://rt.perl.org/Public/Bug/Display.html?id=122669 –

Répondre

0

la meilleure réponse que je sais à ce moment au problème de développement de logiciels réels associés implicite dont cette question se pose , de comment puis-je désactiver une section de la source perl de mode de taint au moment du développement sans souiller mes constantes, est, définissez votre constante à une constante au lieu d'une variable d'environnement contaminé, comme ceci:

use constant DEBUG_MODE => ($ENV{DEV_DEBUG} ? 1 : 0);