eclipse-cdt / cdt

Eclipse CDT™ C/C++ Development Tools
http://eclipse.org/cdt
Eclipse Public License 2.0
299 stars 197 forks source link

java.lang.AssertionError: Cannot serialize @1367225449 #747

Open oxisto opened 5 months ago

oxisto commented 5 months ago

Describe the bug

We are using Eclipse CDT to parse C++ code in our static analysis tool. Unfortunately, we get a weird crash when we try to include system headers on macOS. Including a simple header such as <string> is enough to make CDT crash.

We are using the getASTTranslationUnit function of the GPPLanguage dialect with only the ILanguage.OPTION_PARSE_INACTIVE_CODE option.

Caused by: java.lang.AssertionError: Cannot serialize @1367225449 (org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.FunctionSetType)
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SignatureBuilder.marshalType(SignatureBuilder.java:91) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed.marshal(EvalFixed.java:158) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SignatureBuilder.marshalTemplateArgument(SignatureBuilder.java:127) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredClassInstance.marshal(CPPDeferredClassInstance.java:237) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SignatureBuilder.marshalBinding(SignatureBuilder.java:55) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalID.marshal(EvalID.java:201) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SignatureBuilder.marshalEvaluation(SignatureBuilder.java:101) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalUnary.marshal(EvalUnary.java:387) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SignatureBuilder.marshalEvaluation(SignatureBuilder.java:101) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalBinary.marshal(EvalBinary.java:449) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPEvaluation.getSignature(CPPEvaluation.java:55) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.DependentValue.getSignature(DependentValue.java:49) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.core.dom.ast.ASTTypeUtil.appendArgument(ASTTypeUtil.java:252) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.core.dom.ast.ASTTypeUtil.appendArgumentList(ASTTypeUtil.java:229) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.core.dom.ast.ASTTypeUtil.getArgumentListString(ASTTypeUtil.java:219) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateDefinition.getInstance(CPPTemplateDefinition.java:107) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.getInstance(CPPTemplates.java:467) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.deferredInstance(CPPTemplates.java:498) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.instantiate(CPPTemplates.java:275) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.instantiate(CPPTemplates.java:259) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.resolveDeferredClassInstance(CPPTemplates.java:3258) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.resolveUnknownBindingOrType(CPPTemplates.java:3163) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.instantiateType(CPPTemplates.java:1631) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.resolveUnknownMember(CPPTemplates.java:3189) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.resolveUnknownBindingOrType(CPPTemplates.java:3169) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.instantiateType(CPPTemplates.java:1631) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.createAliasTemplateInstance(CPPTemplates.java:876) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.instantiateAliasTemplate(CPPTemplates.java:323) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates.createBinding(CPPTemplates.java:787) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTemplateId.createIntermediateBinding(CPPASTTemplateId.java:126) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase.resolvePreBinding(CPPASTNameBase.java:98) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor.getBaseType(CPPVisitor.java:2828) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor.createType(CPPVisitor.java:2793) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor.createType(CPPVisitor.java:1968) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.isSameTemplateParameter(CPPSemantics.java:5025) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.isSameTemplateParameterList(CPPSemantics.java:5012) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.isSameFunction(CPPSemantics.java:4986) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.resolveFunctionDeclaration(CPPSemantics.java:3346) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.resolveFunction(CPPSemantics.java:3092) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.resolveAmbiguities(CPPSemantics.java:2801) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.resolveAmbiguities(CPPSemantics.java:2445) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPScope.getBinding(CPPScope.java:133) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope.getBinding(CPPClassScope.java:295) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPScope.getBinding(CPPScope.java:413) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor.createBinding(CPPVisitor.java:886) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor.createBinding(CPPVisitor.java:355) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName.createIntermediateBinding(CPPASTName.java:67) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase.resolvePreBinding(CPPASTNameBase.java:98) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPScope.addCandidate(CPPScope.java:314) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPScope.getBindingsInAST(CPPScope.java:278) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPScope.getBindings(CPPScope.java:192) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope.getBindings(CPPClassScope.java:321) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.AbstractCPPClassSpecializationScope.getBindings(AbstractCPPClassSpecializationScope.java:126) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.getBindingsFromScope(CPPSemantics.java:1788) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.lookup(CPPSemantics.java:1505) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.resolveBinding(CPPSemantics.java:380) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor.createBinding(CPPVisitor.java:326) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName.createIntermediateBinding(CPPASTName.java:67) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase.resolvePreBinding(CPPASTNameBase.java:98) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTQualifiedName.resolvePreBinding(CPPASTQualifiedName.java:105) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.ASTAmbiguousNode.doResolveAmbiguity(ASTAmbiguousNode.java:130) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.ASTAmbiguousNode.resolveAmbiguity(ASTAmbiguousNode.java:87) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguityResolver.visit(CPPASTAmbiguityResolver.java:87) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.ASTAmbiguousNode.accept(ASTAmbiguousNode.java:70) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTSimpleDeclaration.accept(CPPASTSimpleDeclaration.java:116) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTExplicitTemplateInstantiation.accept(CPPASTExplicitTemplateInstantiation.java:93) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNamespaceDefinition.accept(CPPASTNamespaceDefinition.java:144) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNamespaceDefinition.accept(CPPASTNamespaceDefinition.java:144) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.ASTTranslationUnit.accept(ASTTranslationUnit.java:289) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTranslationUnit.resolveAmbiguities(CPPASTTranslationUnit.java:245) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser.resolveAmbiguities(AbstractGNUSourceCodeParser.java:707) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser.parse(AbstractGNUSourceCodeParser.java:690) ~[core-8.4.0.202402110645.jar:?]
    at org.eclipse.cdt.core.dom.parser.AbstractCLikeLanguage.getASTTranslationUnit(AbstractCLikeLanguage.java:171) ~[core-8.4.0.202402110645.jar:?]
    at de.fraunhofer.aisec.cpg.frontends.cxx.CXXLanguageFrontend.parse(CXXLanguageFrontend.kt:233) ~[main/:?]
    at de.fraunhofer.aisec.cpg.TranslationManager.parse(TranslationManager.kt:367) ~[cpg-core.jar:?]
    at de.fraunhofer.aisec.cpg.TranslationManager.parseParallel$lambda$5(TranslationManager.kt:272) ~[cpg-core.jar:?]
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ~[?:?]
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760) ~[?:?]
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?]
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.helpAsyncBlocker(ForkJoinPool.java:1253) ~[?:?]
    at java.base/java.util.concurrent.ForkJoinPool.helpAsyncBlocker(ForkJoinPool.java:2237) ~[?:?]
    at java.base/java.util.concurrent.CompletableFuture.waitingGet(CompletableFuture.java:1887) ~[?:?]
    at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2072) ~[?:?]
    ... 11 more

To Reproduce

Parse a file with the contents #include <string> and the include directory set to "/Library/Developer/CommandLineTools/SDKs/MacOSX14.4.sdk/usr/include/c++/v1/"

Expected behavior

No crash

Version Information (please complete the following information):

i-garrison commented 5 months ago

Can imagine this could happen in c++17 or newer mode where CDT parser cannot resolve a call from collected function set. What is your c++ version in this case?

oxisto commented 5 months ago

Can imagine this could happen in c++17 or newer mode where CDT parser cannot resolve a call from collected function set. What is your c++ version in this case?

Thanks for the quick response... Good question. Personally, we are just using the default settings here, so I am not quite sure which c++ standard we are aiming for (it would actually be interesting for us if we could set this explicitly).

Here are some snippets of how we are using the CDT API (in Kotlin):

val scannerInfo = ScannerInfo(symbols, includePaths.toTypedArray())
val opts = ILanguage.OPTION_PARSE_INACTIVE_CODE
// Set parser language, based on file extension
            this.dialect =
                if (file.extension == "c") {
                    GCCLanguage.getDefault()
                } else {
                    GPPLanguage.getDefault()
                }
val translationUnit =
                this.dialect?.getASTTranslationUnit(
                    content,
                    scannerInfo,
                    includeFileContentProvider,
                    null,
                    opts,
                    log
                ) as ASTTranslationUnit
oxisto commented 5 months ago

It seems to parse, if I explicitly set the compiler to clang instead of GCC, so this could be some incompatibility of macOS std headers with GCC? Not sure if you want to investigate further, at least my problem is solved with a workaround.