1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 09:16: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;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
@ -51,6 +52,8 @@ public class ASTInternal {
if (binding instanceof ICInternalBinding) {
return ((ICInternalBinding) binding).getDefinition();
}
CCorePlugin.log("ASTInternal.getDefinitionOfBinding() called for binding of type " + //$NON-NLS-1$
binding.getClass().getName());
assert false;
return null;
}

View file

@ -11,6 +11,8 @@ package org.eclipse.cdt.internal.core.dom.parser;
import java.util.HashSet;
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.IBinding;
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.EvalUtil;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
public final class CompositeValue implements IValue {
private final ICPPEvaluation evaluation;
@ -226,7 +229,12 @@ public final class CompositeValue implements IValue {
@Override
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

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.IASTNode;
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.ICPPASTConstructorInitializer;
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.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.EvalFixed;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalTypeId;
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) {
return ((ICPPEvaluationOwner) initializer).getEvaluation();
} else if (initializer instanceof ICPPASTConstructorInitializer) {
ICPPConstructor constructor = (ICPPConstructor) CPPSemantics.findImplicitlyCalledConstructor(chainInitializer);
IBinding constructor = CPPSemantics.findImplicitlyCalledConstructor(chainInitializer);
if (constructor == null) {
boolean usesBracedInitList = (initializer instanceof ICPPASTInitializerList);
return new EvalTypeId(member.getType(), point, usesBracedInitList,
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;
}

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.IArrayType;
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.IValue;
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.internal.core.dom.parser.ISerializableEvaluation;
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.InstantiationContext;
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) {
InitializerListType initListType = (InitializerListType) type;
return initListType.getEvaluation().getClauses()[elementId].getType(point);
} else if (type instanceof ICompositeType) {
ICompositeType compositeType = (ICompositeType) type;
return compositeType.getFields()[elementId].getType();
} else if (type instanceof ICPPClassType) {
ICPPClassType classType = (ICPPClassType) type;
return ClassTypeHelper.getFields(classType, point)[elementId].getType();
} else if (type instanceof ParameterPackType) {
ParameterPackType parameterPackType = (ParameterPackType) type;
return parameterPackType.getTypes()[elementId];