Perl 的明显行为是根据受污染的条件对分支修剪后剩余的分支中的常量进行污染。这有记录吗?
这输出1
:
bash$ T="" perl -Tle '
use constant T=>$ENV{T};
use Scalar::Util qw/tainted/;
exit if T;
print tainted(0)'
看起来常量0
被污染了,因为退出后的所有内容(在原始问题中是返回)都在一个分支中,该分支在基于污染条件发生分支修剪后仍然存在。这恰好是 Perl 污点模式的一个非常漂亮的特性,但我在任何地方都找不到它的文档。未设置时$ENV{T}
或条件是动态访问时$ENV{T}
,常量不会受到污染。
顺便说一句,我目前对相关隐含的实际软件开发问题的最佳答案是,我如何在开发时关闭一段 taint-mode perl 源代码而不污染我的常量,是,将常量设置为常量而不是受污染的环境变量,如下所示:
use constant DEBUG_MODE => ( $ENV{DEV_DEBUG} ? 1 : 0 );