From 961cf2f6611fe4cf47fa3a49b0ed7e79dd6473bb Mon Sep 17 00:00:00 2001 From: carolhanna01 Date: Tue, 31 Oct 2023 12:40:39 +0000 Subject: [PATCH] Adding workarounds for null dereference bugs --- src/clegoues/genprog4java/java/JavaStatement.java | 12 ++++++++++++ .../genprog4java/mut/edits/java/MethodReplacer.java | 8 +++++++- .../mut/edits/java/ObjectInitializer.java | 2 +- .../mut/edits/java/RangeCheckOperation.java | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/clegoues/genprog4java/java/JavaStatement.java b/src/clegoues/genprog4java/java/JavaStatement.java index b045b9b0..abf7a723 100644 --- a/src/clegoues/genprog4java/java/JavaStatement.java +++ b/src/clegoues/genprog4java/java/JavaStatement.java @@ -334,6 +334,9 @@ public Map> getExtendableConditionalExpressions() { if(extendableExpressions == null) { extendableExpressions = new HashMap>(); final MethodDeclaration md = (MethodDeclaration) ASTUtils.getEnclosingMethod(this.getASTNode()); + if (md == null) { + return extendableExpressions; + } final String methodName = md.getName().getIdentifier(); final List replacements = JavaSemanticInfo.getConditionalExtensionExpressions(methodName, md); @@ -389,6 +392,9 @@ public Map> getReplacableMethodParameters() { methodParamReplacements = new HashMap>(); final MethodDeclaration md = (MethodDeclaration) ASTUtils.getEnclosingMethod(this.getASTNode()); + if (md == null) { + return methodParamReplacements; + } final String methodName = md.getName().getIdentifier(); final Set namesInScopeHere = JavaSemanticInfo.inScopeAt(this); @@ -492,6 +498,9 @@ public Map>> getExtendableParameterMethods() { extendableParameterMethods = new HashMap>>(); final MethodDeclaration md = (MethodDeclaration) ASTUtils.getEnclosingMethod(this.getASTNode()); + if (md == null) { + return extendableParameterMethods; + } final String methodName = md.getName().getIdentifier(); final Set namesInScopeHere = JavaSemanticInfo.inScopeAt(this); @@ -599,6 +608,9 @@ public List getIndexedCollectionObjects() { public boolean visit(MethodInvocation node) { Expression methodCall = node.getExpression(); SimpleName methodName = node.getName(); + if(methodCall == null || methodName == null) { + return true; + } switch(methodName.getIdentifier()) { case "removeRange": case "subList": diff --git a/src/clegoues/genprog4java/mut/edits/java/MethodReplacer.java b/src/clegoues/genprog4java/mut/edits/java/MethodReplacer.java index cef833c6..b3cde288 100644 --- a/src/clegoues/genprog4java/mut/edits/java/MethodReplacer.java +++ b/src/clegoues/genprog4java/mut/edits/java/MethodReplacer.java @@ -6,6 +6,7 @@ import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.MethodInvocation; +import org.eclipse.jdt.core.dom.SuperMethodInvocation; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; @@ -34,7 +35,12 @@ public void edit(final ASTRewrite rewriter) { SimpleName newMethodName = rewriter.getAST().newSimpleName(replaceWith.getName()); newNode.setName(newMethodName); - List paramNodes = ((MethodInvocation) toReplace).arguments(); + List paramNodes; + if (toReplace instanceof SuperMethodInvocation) { + paramNodes = ((SuperMethodInvocation) toReplace).arguments(); + } else { + paramNodes = ((MethodInvocation) toReplace).arguments(); + } for(ASTNode param : paramNodes) { ASTNode newParam = rewriter.createCopyTarget(param); newNode.arguments().add(newParam); diff --git a/src/clegoues/genprog4java/mut/edits/java/ObjectInitializer.java b/src/clegoues/genprog4java/mut/edits/java/ObjectInitializer.java index 7495e32b..2c98741e 100644 --- a/src/clegoues/genprog4java/mut/edits/java/ObjectInitializer.java +++ b/src/clegoues/genprog4java/mut/edits/java/ObjectInitializer.java @@ -65,7 +65,7 @@ public boolean visit(MethodInvocation node) { SimpleName asExp = (SimpleName) arg; ITypeBinding binding = asExp.resolveTypeBinding(); - if(binding.isClass()) { + if(binding != null && binding.isClass()) { SimpleName newVarName = myAST.newSimpleName(((SimpleName) arg).getIdentifier()); Assignment newAssignment = myAST.newAssignment(); newAssignment.setLeftHandSide(newVarName); diff --git a/src/clegoues/genprog4java/mut/edits/java/RangeCheckOperation.java b/src/clegoues/genprog4java/mut/edits/java/RangeCheckOperation.java index b6e7ddf1..1a9d46fc 100644 --- a/src/clegoues/genprog4java/mut/edits/java/RangeCheckOperation.java +++ b/src/clegoues/genprog4java/mut/edits/java/RangeCheckOperation.java @@ -83,7 +83,7 @@ public void edit(final ASTRewrite rewriter) { upperBoundCheck.setOperator(Operator.LESS); SimpleName uqualifier = rewriter.getAST().newSimpleName( - ((ArrayAccess) array).getArray().toString()); + ((ArrayAccess) array).getArray().toString().split("\\[")[0]); SimpleName uname = rewriter.getAST().newSimpleName( "length"); upperBoundCheck.setRightOperand(rewriter.getAST()