+#!/usr/bin/perl
+
use strict;
use warnings;
use Digest::SHA;
{
return { a => 'inglobal', b => 'inglobalfunc' };
}
+ if($op =~ /^INVALID#/)
+ {
+ return { isinvalid => 1 };
+ }
return { a => 'inglobal', b => 'inglobal', c => 'outglobal' };
}
}
}
+ if($c->{isinvalid})
+ {
+ ++$warned{$ip}{''}{"Invalid opcode"};
+ }
for(qw(a b c))
{
my $type = $c->{$_};
use constant GLOBALFLAG_U => 64; # unused
use constant GLOBALFLAG_P => 128; # possibly parameter passing
use constant GLOBALFLAG_D => 256; # has a def
- my @globalflags = (GLOBALFLAG_Q | GLOBALFLAG_U) x @{$progs->{globals}};
+ my @globalflags = (GLOBALFLAG_Q | GLOBALFLAG_U) x (@{$progs->{globals}} + 2);
for(@{$progs->{functions}})
{
# add missing def
if(!($globalflags[$_->{ofs}+$i] & GLOBALFLAG_D))
{
- print "Missing globaldef for $_->{debugname}[$i] at $_->{ofs}\n";
+ print "Missing globaldef for a component@{[defined $_->{debugname} ? ' of ' . $_->{debugname} : '']} at $_->{ofs}+$i\n";
push @extradefs, {
type => {
saved => 0,
die "Out of range name in globaldef $_"
if $g->{s_name} < 0 || $g->{s_name} >= length $p{strings};
my $name = $p{getstring}->($g->{s_name});
- die "Out of range ofs in globaldef $_ (name: \"$name\")"
+ die "Out of range ofs $g->{ofs} in globaldef $_ (name: \"$name\")"
if $g->{ofs} >= $p{globals};
}
die "Out of range name in fielddef $_"
if $g->{s_name} < 0 || $g->{s_name} >= length $p{strings};
my $name = $p{getstring}->($g->{s_name});
- die "Out of range ofs in globaldef $_ (name: \"$name\")"
+ die "Out of range ofs $g->{ofs} in fielddef $_ (name: \"$name\")"
if $g->{ofs} >= $p{header}{entityfields};
}
elsif($type eq 'inglobalvec')
{
$s->{$_} &= 0xFFFF;
- die "Out of range global offset in statement $ip - cannot continue"
- if $s->{$_} >= @{$p{globals}}-2;
+ if($c->{isreturn})
+ {
+ die "Out of range global offset in statement $ip - cannot continue"
+ if $s->{$_} >= @{$p{globals}};
+ print "Potentially out of range global offset in statement $ip - may crash engines"
+ if $s->{$_} >= @{$p{globals}}-2;
+ }
+ else
+ {
+ die "Out of range global offset in statement $ip - cannot continue"
+ if $s->{$_} >= @{$p{globals}}-2;
+ }
}
elsif($type eq 'outglobal')
{