From 96d028ce004f5b4581997fd1d1a0ccfa87d67ea3 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Fri, 11 Oct 2024 12:22:21 -0700 Subject: Fix a null-check bug --- .../src/main/java/com/seaofnodes/simple/Parser.java | 6 +++--- .../test/java/com/seaofnodes/simple/Chapter13Test.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) (limited to 'chapter15') diff --git a/chapter15/src/main/java/com/seaofnodes/simple/Parser.java b/chapter15/src/main/java/com/seaofnodes/simple/Parser.java index 012a010e..728aaca7 100644 --- a/chapter15/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter15/src/main/java/com/seaofnodes/simple/Parser.java @@ -807,7 +807,7 @@ public class Parser { val = zsMask(val,f._type); Node st = new StoreNode(name, f._alias, f._type, memAlias(f._alias), expr, off, val, false); // Arrays include control, as a proxy for a safety range check. - // Structs dont need this; they only need a NPE check which is + // Structs don't need this; they only need a NPE check which is // done via the type system. if( base.isAry() ) st.setDef(0,ctrl()); memAlias(f._alias, st.peephole()); @@ -815,9 +815,9 @@ public class Parser { } } - Node load = new LoadNode(name, f._alias, f._type, memAlias(f._alias), expr, off); + Node load = new LoadNode(name, f._alias, f._type.glb(), memAlias(f._alias), expr, off); // Arrays include control, as a proxy for a safety range check - // Structs dont need this; they only need a NPE check which is + // Structs don't need this; they only need a NPE check which is // done via the type system. if( base.isAry() ) load.setDef(0,ctrl()); return parsePostfix(load.peephole()); diff --git a/chapter15/src/test/java/com/seaofnodes/simple/Chapter13Test.java b/chapter15/src/test/java/com/seaofnodes/simple/Chapter13Test.java index e8b71820..416aba31 100644 --- a/chapter15/src/test/java/com/seaofnodes/simple/Chapter13Test.java +++ b/chapter15/src/test/java/com/seaofnodes/simple/Chapter13Test.java @@ -163,4 +163,22 @@ return new S1.s=new S2; StopNode stop = parser.parse().iterate(); assertEquals("return S2;", stop.toString()); } + + @Test + public void testcheckNull() { + Parser parser = new Parser( +""" +struct I {int i;} +struct P {I pi;} +P p1 = new P; +P p2 = new P; +p2.pi = new I; +p2.pi.i = 2; +if (arg) p1 = new P; +return p1.pi.i + 1; +"""); + try { parser.parse(false).iterate(); fail(); } + catch( Exception e ) { assertEquals("Might be null accessing 'i'",e.getMessage()); } + } + } -- cgit v1.2.3