From 917061f98aeac2660990889436ed844f1dff12ab Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Wed, 26 Apr 2017 01:23:19 -0400 Subject: [PATCH] Bug 512789 - Guard against infinite recursion in TypeTraits.hasTrivialDefaultConstructor() The infinite recursion could happen if an inheritance hierarchy has a cycle in it, or if a class aggregates itself (both of which are invalid). Change-Id: I99598a57982dca51acab5a1297392f04d9008aec --- .../parser/cpp/semantics/CPPVariableReadWriteFlags.java | 2 +- .../core/dom/parser/cpp/semantics/TypeTraits.java | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVariableReadWriteFlags.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVariableReadWriteFlags.java index b7f0f67237c..549e8b726d4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVariableReadWriteFlags.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVariableReadWriteFlags.java @@ -67,7 +67,7 @@ public final class CPPVariableReadWriteFlags extends VariableReadWriteFlags { IType type = CPPVisitor.createType(parent); if (type instanceof ICPPUnknownType || type instanceof ICPPClassType && - !TypeTraits.hasTrivialDefaultConstructor((ICPPClassType) type, parent)) { + !TypeTraits.hasTrivialDefaultConstructor((ICPPClassType) type, parent, CPPSemantics.MAX_INHERITANCE_DEPTH)) { return WRITE; } return super.rwInDeclarator(parent, indirection); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeTraits.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeTraits.java index 269ebeb649f..920564a757c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeTraits.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeTraits.java @@ -346,13 +346,16 @@ public class TypeTraits { * @param point * @return {@code true} if the class has a trivial default constructor */ - public static boolean hasTrivialDefaultConstructor(ICPPClassType classType, IASTNode point) { + public static boolean hasTrivialDefaultConstructor(ICPPClassType classType, IASTNode point, int maxdepth) { + if (maxdepth <= 0) { + return false; + } for (ICPPConstructor ctor : ClassTypeHelper.getConstructors(classType, point)) { if (!ctor.isImplicit() && ctor.getParameters().length == 0) return false; } for (ICPPClassType baseClass : ClassTypeHelper.getAllBases(classType, null)) { - if (!classType.isSameType(baseClass) && !hasTrivialDefaultConstructor(baseClass, point)) + if (!classType.isSameType(baseClass) && !hasTrivialDefaultConstructor(baseClass, point, maxdepth - 1)) return false; } for (ICPPField field : ClassTypeHelper.getDeclaredFields(classType, point)) { @@ -360,7 +363,7 @@ public class TypeTraits { IType type = field.getType(); type = SemanticUtil.getNestedType(type, TDEF | CVTYPE | ARRAY); if (type instanceof ICPPClassType && !classType.isSameType(type) && - !hasTrivialDefaultConstructor((ICPPClassType) type, point)) { + !hasTrivialDefaultConstructor((ICPPClassType) type, point, maxdepth - 1)) { return false; } }