0

我正在为一个学生项目编写一个类似 bash 的 shell。我需要对perl 行命令进行自动测试

my $cmd = "(echo \"foo\" | ./shell >& /dev/null)";
system($cmd);
if ($? == 35584) {
    print "SIGSEGV";
}
elsif ($? == 34304) {
    print "GLIB C";
}
else {
    print "GOOD";
}

我希望能够在segfaultor上隐藏输出glibc

@Marc B 好的,但是我的 shell 在输出 0 上读取,所以我必须有“echo”:s

@drquicksilver * 检测到 glibc./shell: free(): 无效指针: 0x0000000000608291 * * OR 分段错误

4

1 回答 1

1

首先,systemexecutes sh,但您使用的是csh语法。

my $cmd = "(echo \"foo\" | ./shell >& /dev/null)";

应该

my $cmd = "(echo \"foo\" | ./shell >/dev/null 2>&1)";

但是执行 shell 只会干扰你的测试。所以让我们完全避免使用外壳。

use Config   qw( %Config );
use IPC::Run qw( run );

sub sig_name {
   my ($sig_num) = @_;
   my %sig_names;
   @sig_names{ reverse split ' ', $Config{sig_num} } =
      reverse split ' ', $Config{sig_name};
   return $sig_names{$sig_num}
      ? "SIG$sig_names{$sig_num} (".($sig_num).")"
      : $sig_num;
}

run [ './shell' ], \"foo\n", '>','/dev/null', '2>&1';

if (my $sig_num = $? & 0x7F) {
   print "Killed by signal ".sig_name($sig_num)."\n";
} elsif (my $exit_code = $? >> 8) {
   print "Exited with error code $exit_code\n";
} else {
   print "GOOD\n";
}

你所说的“GLIB C”实际上是 SIGABRT。

于 2013-04-04T17:34:53.507 回答