1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 09:46:02 +02:00

Bug 508254 - Fix some more indexer exceptions

- Avoid a ClassCastException in CPPConstructor.getMemberEvaluation()
  - Fix an unsafe method call in EvalCompositeAccess.getType()
  - Emit a log message in an error case in ASTInternal.getDefinitionOfBinding()
  - Emit a log message in an error case in CompositeValue.setSubValue()

Change-Id: I5932c8b661e31eff32c2bb138efdb3029894d0ab
This commit is contained in:
Nathan Ridge 2016-12-04 17:38:27 -05:00
parent 2155b119ea
commit 9b3a28f334
4 changed files with 24 additions and 7 deletions

View file

@ -11,6 +11,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser; package org.eclipse.cdt.internal.core.dom.parser;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
@ -51,6 +52,8 @@ public class ASTInternal {
if (binding instanceof ICInternalBinding) { if (binding instanceof ICInternalBinding) {
return ((ICInternalBinding) binding).getDefinition(); return ((ICInternalBinding) binding).getDefinition();
} }
CCorePlugin.log("ASTInternal.getDefinitionOfBinding() called for binding of type " + //$NON-NLS-1$
binding.getClass().getName());
assert false; assert false;
return null; return null;
} }

View file

@ -11,6 +11,8 @@ package org.eclipse.cdt.internal.core.dom.parser;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IArrayType;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.ICompositeType;
@ -29,6 +31,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalInitList; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalInitList;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalUtil; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalUtil;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
public final class CompositeValue implements IValue { public final class CompositeValue implements IValue {
private final ICPPEvaluation evaluation; private final ICPPEvaluation evaluation;
@ -226,7 +229,12 @@ public final class CompositeValue implements IValue {
@Override @Override
public void setSubValue(int position, ICPPEvaluation newValue) { public void setSubValue(int position, ICPPEvaluation newValue) {
values[position] = newValue == null ? EvalFixed.INCOMPLETE : newValue; if (position >= 0 && position < values.length) {
values[position] = newValue == null ? EvalFixed.INCOMPLETE : newValue;
} else {
CCorePlugin.log(IStatus.WARNING, "Out-of-bounds access to composite value: " + position + //$NON-NLS-1$
" (length is " + values.length + ")"); //$NON-NLS-1$//$NON-NLS-2$
}
} }
@Override @Override

View file

@ -17,6 +17,7 @@ import java.util.Map;
import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
@ -27,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalConstructor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalConstructor;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalTypeId; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalTypeId;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecConstructorChain; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecConstructorChain;
@ -46,13 +48,16 @@ public class CPPConstructor extends CPPMethod implements ICPPConstructor {
if (initializer instanceof ICPPEvaluationOwner) { if (initializer instanceof ICPPEvaluationOwner) {
return ((ICPPEvaluationOwner) initializer).getEvaluation(); return ((ICPPEvaluationOwner) initializer).getEvaluation();
} else if (initializer instanceof ICPPASTConstructorInitializer) { } else if (initializer instanceof ICPPASTConstructorInitializer) {
ICPPConstructor constructor = (ICPPConstructor) CPPSemantics.findImplicitlyCalledConstructor(chainInitializer); IBinding constructor = CPPSemantics.findImplicitlyCalledConstructor(chainInitializer);
if (constructor == null) { if (constructor == null) {
boolean usesBracedInitList = (initializer instanceof ICPPASTInitializerList); boolean usesBracedInitList = (initializer instanceof ICPPASTInitializerList);
return new EvalTypeId(member.getType(), point, usesBracedInitList, return new EvalTypeId(member.getType(), point, usesBracedInitList,
EvalConstructor.extractArguments(initializer)); EvalConstructor.extractArguments(initializer));
} else if (constructor instanceof IProblemBinding) {
return EvalFixed.INCOMPLETE;
} }
return new EvalConstructor(member.getType(), constructor, EvalConstructor.extractArguments(initializer), point); return new EvalConstructor(member.getType(), (ICPPConstructor) constructor,
EvalConstructor.extractArguments(initializer), point);
} }
return null; return null;
} }

View file

@ -16,13 +16,14 @@ import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IArrayType;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation; import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.cpp.InstantiationContext; import org.eclipse.cdt.internal.core.dom.parser.cpp.InstantiationContext;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFunctionCall.ParameterPackType; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFunctionCall.ParameterPackType;
@ -85,9 +86,9 @@ public final class EvalCompositeAccess implements ICPPEvaluation {
} else if (type instanceof InitializerListType) { } else if (type instanceof InitializerListType) {
InitializerListType initListType = (InitializerListType) type; InitializerListType initListType = (InitializerListType) type;
return initListType.getEvaluation().getClauses()[elementId].getType(point); return initListType.getEvaluation().getClauses()[elementId].getType(point);
} else if (type instanceof ICompositeType) { } else if (type instanceof ICPPClassType) {
ICompositeType compositeType = (ICompositeType) type; ICPPClassType classType = (ICPPClassType) type;
return compositeType.getFields()[elementId].getType(); return ClassTypeHelper.getFields(classType, point)[elementId].getType();
} else if (type instanceof ParameterPackType) { } else if (type instanceof ParameterPackType) {
ParameterPackType parameterPackType = (ParameterPackType) type; ParameterPackType parameterPackType = (ParameterPackType) type;
return parameterPackType.getTypes()[elementId]; return parameterPackType.getTypes()[elementId];