隐藏glibc输出和segfault(系统调用)

时间:2013-04-04 14:59:54

标签: perl bash

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

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

我希望能够隐藏segfaultglibc上的输出。

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

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

1 个答案:

答案 0 :(得分:1)

首先,system执行sh,但您使用csh语法。

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

应该是

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

但执行shell只会干扰您的测试。所以让我们完全避开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。