From 63502d72833aa89b14d9a3e4a7ce050d9b336f57 Mon Sep 17 00:00:00 2001 From: mike lowis Date: Mon, 10 May 2021 20:44:26 -0400 Subject: [PATCH] added some error checking to array indexing --- cerise/backend/c99/codegen.c | 26 ++++++++++++++++++++++++-- cerise/backend/test/codegen.c | 4 ++-- cerise/backend/x86_64/codegen.c | 4 ++-- cerise/inc/cerise.h | 2 +- cerise/oberon0/OSG.Mod | 6 ++++++ cerise/src/grammar.c | 15 ++++++++++----- 6 files changed, 45 insertions(+), 12 deletions(-) diff --git a/cerise/backend/c99/codegen.c b/cerise/backend/c99/codegen.c index 9c3636f..56553f9 100644 --- a/cerise/backend/c99/codegen.c +++ b/cerise/backend/c99/codegen.c @@ -214,12 +214,28 @@ void codegen_binop(Parser* p, int op, Item* a, Item* b) void codegen_store(Parser* p, Item* a, Item* b) { + item_dump(a); + item_dump(b); if (a->mode == ITEM_MVAR && b->reg == 0) { +// if (a->offset) +// { +// printf(" (%s*)\n", +// TypeNames[a->type->form] +// +// ); +// } printf(" %s_%s = %lld;\n", p->name, a->imm.s, b->imm.i); } else if (a->mode == ITEM_MVAR) { +// if (a->offset) +// { +// printf(" (%s*)\n", +// TypeNames[a->type->form] +// +// ); +// } printf(" %s_%s = _T%d;\n", p->name, a->imm.s, b->reg); } else @@ -287,7 +303,7 @@ void codegen_return(Parser* p, Item* item) } } -void codegen_rangecheck(Parser* p, long length, Item* index) +void codegen_index(Parser* p, Item* array, Item* index) { // codegen_binop(p, '*', index, base); if (index->mode == ITEM_CONST) @@ -296,9 +312,15 @@ void codegen_rangecheck(Parser* p, long length, Item* index) { error(p, "array indexes must be of integral type"); } - else if (index->imm.i >= length) + else if (index->imm.i >= array->type->size) { error(p, "array index out of bounds"); } + else if (index->imm.i < 0) + { + error(p, "negative array index"); + } + + array->offset = index->imm.i; } } diff --git a/cerise/backend/test/codegen.c b/cerise/backend/test/codegen.c index 78e13a8..3502455 100644 --- a/cerise/backend/test/codegen.c +++ b/cerise/backend/test/codegen.c @@ -121,7 +121,7 @@ void codegen_return(Parser* p, Item* item) (void)p, (void)item; } -void codegen_rangecheck(Parser* p, long length, Item* index) +void codegen_index(Parser* p, Item* array, Item* index) { - (void)p, (void)length, (void)index; + (void)p, (void)array, (void)index; } diff --git a/cerise/backend/x86_64/codegen.c b/cerise/backend/x86_64/codegen.c index fb3ea6a..651f515 100644 --- a/cerise/backend/x86_64/codegen.c +++ b/cerise/backend/x86_64/codegen.c @@ -349,7 +349,7 @@ void codegen_return(Parser* p, Item* item) (void)p, (void)item; } -void codegen_rangecheck(Parser* p, long length, Item* index) +void codegen_index(Parser* p, Item* array, Item* index) { - (void)p, (void)length, (void)index; + (void)p, (void)array, (void)index; } diff --git a/cerise/inc/cerise.h b/cerise/inc/cerise.h index ec2181d..26c1a92 100644 --- a/cerise/inc/cerise.h +++ b/cerise/inc/cerise.h @@ -224,7 +224,7 @@ void codegen_prepcall(Parser* p, Item* item); void codegen_call(Parser* p, Item* item, Item* args); void codegen_setarg(Parser* p, Item* item, bool firstarg); void codegen_return(Parser* p, Item* item); -void codegen_rangecheck(Parser* p, long length, Item* index); +void codegen_index(Parser* p, Item* array, Item* index); /* diff --git a/cerise/oberon0/OSG.Mod b/cerise/oberon0/OSG.Mod index c8a226c..1925f38 100644 --- a/cerise/oberon0/OSG.Mod +++ b/cerise/oberon0/OSG.Mod @@ -289,12 +289,15 @@ MODULE OSG; (* NW 19.12.94 / 20.10.07 / OSGX 9.5.2017*) IF (y.a < 0) OR (y.a >= x.type.len) THEN OSS.Mark("bad index") END ; + IF x.mode = Par THEN Put2(Ldw, RH, x.r, x.a); x.mode := RegI; x.a := 0 END ; + x.a := x.a + y.a * x.type.base.size + ELSE s := x.type.base.size; IF y.mode # Reg THEN @@ -513,12 +516,15 @@ MODULE OSG; (* NW 19.12.94 / 20.10.07 / OSGX 9.5.2017*) GetSB; Put2(Stw, y.r, SB, x.a) END + ELSIF x.mode = Par THEN Put2(Ldw, RH, SP, x.a); Put2(Stw, y.r, RH, x.b) + ELSIF x.mode = RegI THEN Put2(Stw, y.r, x.r, x.a); DEC(RH) + ELSE OSS.Mark("illegal assignment") END ; diff --git a/cerise/src/grammar.c b/cerise/src/grammar.c index c90a895..347be35 100644 --- a/cerise/src/grammar.c +++ b/cerise/src/grammar.c @@ -114,13 +114,18 @@ RULE(designator) case '[': { - expect(p, '['); - Type* type = item->type; Item index = {0}; + expect(p, '['); expression(p, &index); - codegen_rangecheck(p, item->type->size, &index); - //codegen_binop(p, '*', &index, &base); - item->type = item->type->base; + if (item->type->form == FORM_ARRAY) + { + codegen_index(p, item, &index); + item->type = item->type->base; + } + else + { + error(p, "attempting to index non-array value"); + } expect(p, ']'); break; } -- 2.49.0