- pipe my $ordr, my $owtr or die "pipe(\$ordr, \$owtr): $!";
- pipe my $vrdr, my $vwtr or die "pipe(\$vrdr, \$vwtr): $!";
- my $pid = fork;
- if (!defined $pid) {
- die "fork(): $!";
- } elsif ($pid == 0) {
- setpgrp 0, 0 or die "setpgrp(0, 0): $!";
- close $ordr or die "close(\$ordr): $!";
- open STDOUT, '>&=', $owtr or die "open(STDOUT, '>&=', \$owtr): $!";
- close $vrdr or die "close(\$vrdr): $!";
- fcntl $vwtr, F_SETFD, 0 or die "fcntl(\$vwtr, F_SETFD, 0): $!";
- my @args = (
- $vg,
- '--tool=memcheck',
- '--leak-check=full',
- '--leak-resolution=high',
- '--num-callers=' . $callers,
- '--error-limit=yes',
- '--log-fd=' . fileno($vwtr)
- );
- unless ($args{no_supp}) {
- for (Test::Valgrind::Suppressions::supp_path(), $args{supp}) {
- push @args, '--suppressions=' . $_ if $_;
- }
- }
- if (defined $args{extra} and ref $args{extra} eq 'ARRAY') {
- push @args, @{$args{extra}};
- }
- push @args, $^X;
- push @args, '-I' . $_ for @INC;
- push @args, '-MTest::Valgrind=run,1', $file;
- print STDOUT "valgrind @args\n";
- local $ENV{PERL_DESTRUCT_LEVEL} = 3;
- local $ENV{PERL_DL_NONLAZY} = 1;
- exec { $args[0] } @args;
- die "exec @args: $!";
+ }
+ unless (defined($file) or defined($file = $pm)) {
+ require Test::Builder;
+ Test::Builder->new->diag('Couldn\'t find a valid source file');
+ return;
+ }
+
+ my $taint_mode;
+ {
+ open my $fh, '<', $file or last;
+ my $first = <$fh>;
+ close $fh;
+ if ($first and my ($args) = $first =~ /^\s*#\s*!\s*perl\s*(.*)/) {
+ $taint_mode = 1 if $args =~ /(?:^|\s)-T(?:$|\s)/;