diff options
| author | Cliff Click <cliffc@acm.org> | 2024-10-11 12:22:21 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2024-10-12 11:39:00 -0700 |
| commit | 96d028ce004f5b4581997fd1d1a0ccfa87d67ea3 (patch) | |
| tree | e2a33abe9c4c0e3ada4d733bbc109f705ea31da8 /chapter15/src | |
| parent | 4dd51b1b14dfffb9f0ee184413f45285cc867fda (diff) | |
| download | Simple-96d028ce004f5b4581997fd1d1a0ccfa87d67ea3.tar.gz Simple-96d028ce004f5b4581997fd1d1a0ccfa87d67ea3.zip | |
Fix a null-check bug
Diffstat (limited to 'chapter15/src')
| -rw-r--r-- | chapter15/src/main/java/com/seaofnodes/simple/Parser.java | 6 | ||||
| -rw-r--r-- | chapter15/src/test/java/com/seaofnodes/simple/Chapter13Test.java | 18 |
2 files changed, 21 insertions, 3 deletions
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()); } + } + } |
