Restrict global and function references to memory size

This commit is contained in:
Ian Gulliver
2021-11-20 18:12:17 -10:00
parent bdb6b17187
commit bd84a5b969
6 changed files with 35 additions and 11 deletions

View File

@@ -12,10 +12,10 @@ func randOperand(t vm.OperandNumericType) *vm.Operand {
switch op.Type {
case vm.GlobalMemoryIndex:
op.Value = RandBiasedUint64()
op.Value = RandBiasedUint64n(vm.GlobalMemorySize)
case vm.FunctionMemoryIndex:
op.Value = RandBiasedUint64()
op.Value = RandBiasedUint64n(vm.FunctionMemorySize)
case vm.Literal:
switch t {

View File

@@ -9,6 +9,16 @@ func RandBiasedUint64() uint64 {
return (rand.Uint64() | 0x8000000000000000) >> rand.Intn(65)
}
// Like RandBiasedUint64() but always returns < n
func RandBiasedUint64n(n uint64) uint64 {
for {
ret := RandBiasedUint64()
if ret < n {
return ret
}
}
}
// Generate a random int64 with an even distribution of the tuple
// {sign, bits.Len64(math.Abs())}
func RandBiasedInt64() uint64 {

View File

@@ -3,7 +3,17 @@ package test
import "testing"
import "github.com/firestuff/subcoding/gen"
import "github.com/firestuff/subcoding/asm"
func TestRandProgram(t *testing.T) {
gen.RandProgram()
for i := 0; i < 100; i++ {
prog := gen.RandProgram()
src, err := asm.Disassemble(prog)
if err != nil {
t.Fatal(err)
}
t.Log(src)
}
}

View File

@@ -29,8 +29,8 @@ func TestRandBiasedUint64(t *testing.T) {
}
}
if max - min > max / 10 {
t.Fatalf("Variance greater than allowed: %d > %d (max=%d min=%d)", max - min, max / 10, max, min)
if max-min > max/10 {
t.Fatalf("Variance greater than allowed: %d > %d (max=%d min=%d)", max-min, max/10, max, min)
}
}
@@ -48,9 +48,9 @@ func TestRandBiasedInt64(t *testing.T) {
case val == 0:
buckets[63]++
case val < 0:
buckets[63 + bits.Len64(uint64(val * -1))]++
buckets[63+bits.Len64(uint64(val*-1))]++
case val > 0:
buckets[63 - bits.Len64(uint64(val))]++
buckets[63-bits.Len64(uint64(val))]++
}
}
@@ -67,7 +67,7 @@ func TestRandBiasedInt64(t *testing.T) {
}
}
if max - min > max / 10 {
t.Fatalf("Variance greater than allowed: %d > %d (max=%d min=%d)", max - min, max / 10, max, min)
if max-min > max/10 {
t.Fatalf("Variance greater than allowed: %d > %d (max=%d min=%d)", max-min, max/10, max, min)
}
}

View File

@@ -1,5 +1,7 @@
package vm
const FunctionMemorySize = 16
type stackFrame struct {
previousFunctionIndex int64
previousInstructionIndex int64
@@ -10,6 +12,6 @@ func newStackFrame(state *State) *stackFrame {
return &stackFrame{
previousFunctionIndex: state.functionIndex,
previousInstructionIndex: state.instructionIndex,
functionMemory: NewMemory(16),
functionMemory: NewMemory(FunctionMemorySize),
}
}

View File

@@ -2,6 +2,8 @@ package vm
import "fmt"
const GlobalMemorySize = 16
type State struct {
running bool
err error
@@ -18,7 +20,7 @@ type State struct {
func NewState(prog *Program) (*State, error) {
return &State{
program: prog,
globalMemory: NewMemory(16),
globalMemory: NewMemory(GlobalMemorySize),
}, nil
}