mirror of
https://github.com/pragma-/pbot.git
synced 2024-11-18 18:09:49 +01:00
ef3b8f0fbc
Server-side C base now strips print_last_statement() and rebuilds/re-runs code if there was any bad gdb output related to it (i.e. "No such symbol" or "A syntax error in expression").
58 lines
1.3 KiB
Perl
Executable File
58 lines
1.3 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
use warnings;
|
|
use strict;
|
|
|
|
package _c_base;
|
|
use parent '_default';
|
|
|
|
sub preprocess {
|
|
my $self = shift;
|
|
$self->SUPER::preprocess;
|
|
|
|
if ($self->{cmdline} =~ m/--(?:version|analyze)/) {
|
|
$self->{output} =~ s/Ubuntu //;
|
|
$self->{output} =~ s/-\d+ubuntu\d+//;
|
|
$self->{done} = 1;
|
|
}
|
|
}
|
|
|
|
sub postprocess {
|
|
my $self = shift;
|
|
$self->SUPER::postprocess;
|
|
|
|
# no errors compiling, but if output contains something, it must be diagnostic messages
|
|
if(length $self->{output}) {
|
|
$self->{output} =~ s/^\s+//;
|
|
$self->{output} =~ s/\s+$//;
|
|
$self->{output} = "[$self->{output}]\n";
|
|
}
|
|
|
|
print "Executing gdb\n";
|
|
my ($retval, $result) = $self->execute(60, "bash -c \"date -s \@$self->{date}; ulimit -t 5; compiler_watchdog.pl > .output\"");
|
|
|
|
$result = "";
|
|
open(FILE, '.output');
|
|
while(<FILE>) {
|
|
$result .= $_;
|
|
last if length $result >= 1024 * 20;
|
|
}
|
|
close(FILE);
|
|
|
|
$result =~ s/\s+$//;
|
|
|
|
if (not length $result) {
|
|
$self->{no_output} = 1;
|
|
} elsif ($self->{code} =~ m/print_last_statement\(.*\);$/m
|
|
&& ($result =~ m/A syntax error in expression/ || $result =~ m/No symbol.*in current context/)) {
|
|
# strip print_last_statement and rebuild/re-run
|
|
$self->{code} =~ s/print_last_statement\((.*)\);/$1;/mg;
|
|
$self->preprocess;
|
|
$self->postprocess;
|
|
} else {
|
|
$self->{output} .= $result;
|
|
}
|
|
}
|
|
|
|
1;
|