crossminer / scava

https://eclipse.org/scava/
Eclipse Public License 2.0
18 stars 13 forks source link

NPE when calling Number of breaking changes (RascalMetricProvider) #334

Closed valeriocos closed 5 years ago

valeriocos commented 5 years ago

I'm analysing https://github.com/elastic/elasticsearch (from 01/01/2019 - 01/06/2019) with the following metric providers:

numberMavenDependencies.historic
numberOSGiBundleDependencies.historic
docker.dependencies
docker.smells
api.numberOfChanges
api.numberOfBreakingChanges

A NPE popped out on RascalMetricProvider (Number of breaking changes) (see below).

oss-app_1        | Aug 21, 2019 1:42:22 PM org.restlet.engine.log.LogFilter afterHandle
oss-app_1        | INFO: 2019-08-21 13:42:22    172.19.0.6  -   172.19.0.4  8182    GET /analysis/tasks/status/project/elasticsearch    -   200 23  0   10  http://oss-app:8182 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36    http://localhost:5601/
oss-app_1        | Runtime error in model extractor
oss-app_1        | org.rascalmpl.interpreter.control_exceptions.Throw: |std:///lang/java/m3/Core.rsc|:73,0: Java("NullPointerException","")
oss-app_1        |  at org.rascalmpl.interpreter.control_exceptions.ControlException.reallyFillInStackTrace(ControlException.java:42)
oss-app_1        |  at org.rascalmpl.interpreter.control_exceptions.Throw.fillInStackTrace(Throw.java:138)
oss-app_1        |  at java.lang.Throwable.<init>(Throwable.java:266)
oss-app_1        |  at java.lang.Exception.<init>(Exception.java:66)
oss-app_1        |  at java.lang.RuntimeException.<init>(RuntimeException.java:62)
oss-app_1        |  at org.rascalmpl.interpreter.control_exceptions.ControlException.<init>(ControlException.java:25)
oss-app_1        |  at org.rascalmpl.interpreter.control_exceptions.Throw.<init>(Throw.java:73)
oss-app_1        |  at org.rascalmpl.interpreter.control_exceptions.Throw.<init>(Throw.java:93)
oss-app_1        |  at org.rascalmpl.interpreter.utils.RuntimeExceptionFactory.javaException(RuntimeExceptionFactory.java:162)
oss-app_1        |  at org.rascalmpl.interpreter.utils.RuntimeExceptionFactory.javaException(RuntimeExceptionFactory.java:177)
oss-app_1        |  at org.rascalmpl.interpreter.result.JavaMethod.invoke(JavaMethod.java:263)
oss-app_1        |  at org.rascalmpl.interpreter.result.JavaMethod.call(JavaMethod.java:162)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:531)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Statement$Assignment.interpret(Statement.java:205)
oss-app_1        |  at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:383)
oss-app_1        |  at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:322)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:531)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Expression$Tuple.interpret(Expression.java:2744)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.SetComprehensionWriter.append(SetComprehensionWriter.java:36)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Comprehension.evalComprehension(Comprehension.java:95)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Comprehension$Set.interpret(Comprehension.java:71)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Expression$Comprehension.interpret(Expression.java:679)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Statement$Assignment.interpret(Statement.java:205)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Statement$NonEmptyBlock.interpret(Statement.java:759)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Statement$For.interpret(Statement.java:468)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Statement$NonEmptyBlock.interpret(Statement.java:759)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Statement$Try.evalStatementTry(Statement.java:941)
oss-app_1        |  at org.rascalmpl.semantics.dynamic.Statement$Try.interpret(Statement.java:934)
oss-app_1        |  at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:383)
oss-app_1        |  at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:322)
oss-app_1        |  at org.rascalmpl.interpreter.result.AbstractFunction.call(AbstractFunction.java:206)
oss-app_1        |  at org.eclipse.scava.metricprovider.rascal.RascalManager$Extractor.call(RascalManager.java:105)
oss-app_1        |  at org.eclipse.scava.metricprovider.rascal.RascalMetricProvider.callExtractors(RascalMetricProvider.java:503)
oss-app_1        |  at org.eclipse.scava.metricprovider.rascal.RascalMetricProvider.computeM3(RascalMetricProvider.java:490)
oss-app_1        |  at org.eclipse.scava.metricprovider.rascal.RascalMetricProvider.compute(RascalMetricProvider.java:280)
oss-app_1        |  at org.eclipse.scava.metricprovider.rascal.RascalMetricProvider.measure(RascalMetricProvider.java:213)
oss-app_1        |  at org.eclipse.scava.metricprovider.rascal.RascalMetricProvider.measure(RascalMetricProvider.java:1)
oss-app_1        |  at org.eclipse.scava.platform.osgi.analysis.MetricListExecutor.run(MetricListExecutor.java:103)
oss-app_1        |  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
oss-app_1        |  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
oss-app_1        |  at java.lang.Thread.run(Thread.java:748)
oss-app_1        | Rascal stack trace:
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference.optimizedBooleanConstant(|unknown:///QualifiedNameReference.java|(0,0,<913,0>,<913,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.CastExpression.optimizedBooleanConstant(|unknown:///CastExpression.java|(0,0,<508,0>,<508,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.BinaryExpression.optimizedBooleanConstant(|unknown:///BinaryExpression.java|(0,0,<1745,0>,<1745,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.BinaryExpression.computeConstant(|unknown:///BinaryExpression.java|(0,0,<109,0>,<109,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.BinaryExpression.resolveType(|unknown:///BinaryExpression.java|(0,0,<1900,0>,<1900,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.AND_AND_Expression.resolveType(|unknown:///AND_AND_Expression.java|(0,0,<277,0>,<277,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.Assignment.resolveType(|unknown:///Assignment.java|(0,0,<206,0>,<206,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.Expression.resolve(|unknown:///Expression.java|(0,0,<1020,0>,<1020,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.Block.resolve(|unknown:///Block.java|(0,0,<117,0>,<117,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.IfStatement.resolve(|unknown:///IfStatement.java|(0,0,<272,0>,<272,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.Block.resolve(|unknown:///Block.java|(0,0,<117,0>,<117,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.IfStatement.resolve(|unknown:///IfStatement.java|(0,0,<272,0>,<272,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(|unknown:///AbstractMethodDeclaration.java|(0,0,<641,0>,<641,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.resolveStatements(|unknown:///MethodDeclaration.java|(0,0,<309,0>,<309,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(|unknown:///AbstractMethodDeclaration.java|(0,0,<551,0>,<551,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(|unknown:///TypeDeclaration.java|(0,0,<1188,0>,<1188,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(|unknown:///TypeDeclaration.java|(0,0,<1301,0>,<1301,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(|unknown:///CompilationUnitDeclaration.java|(0,0,<590,0>,<590,0>))
oss-app_1        |  at org.eclipse.jdt.internal.compiler.Compiler.process(|unknown:///Compiler.java|(0,0,<861,0>,<861,0>))
oss-app_1        |  at org.eclipse.jdt.core.dom.CompilationUnitResolver.resolve(|unknown:///CompilationUnitResolver.java|(0,0,<1016,0>,<1016,0>))
oss-app_1        |  at org.eclipse.jdt.core.dom.CompilationUnitResolver.resolve(|unknown:///CompilationUnitResolver.java|(0,0,<639,0>,<639,0>))
oss-app_1        |  at org.eclipse.jdt.core.dom.ASTParser.createASTs(|unknown:///ASTParser.java|(0,0,<993,0>,<993,0>))
oss-app_1        |  at org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler.buildCompilationUnits(|unknown:///EclipseJavaCompiler.java|(0,0,<231,0>,<231,0>))
oss-app_1        |  at org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler.createM3sFromFiles(|unknown:///EclipseJavaCompiler.java|(0,0,<110,0>,<110,0>))
oss-app_1        |  at org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler.createM3sFromFiles(|unknown:///EclipseJavaCompiler.java|(0,0,<103,0>,<103,0>))
oss-app_1        |  at createM3sFromFiles(|std:///lang/java/m3/Core.rsc|(2469,11,<66,133>,<66,144>))
oss-app_1        |  at javaM3(|bundleresource://168.fwk961419791/src/Java.rsc|(3072,1,<95,46>,<95,47>))
oss-app_1        |  at ******scava******(|main://******scava******|)
oss-app_1        | 
oss-app_1        | ERROR [RascalMetricProvider (Number of breaking changes)] (13:42:24): ignoring all models for extractor javaM3
oss-app_1        | INFO  [RascalMetricProvider (Number of breaking changes)] (13:42:24): Calling trans.rascal.api.numberOfBreakingChanges
oss-app_1        | INFO  [Rascal console] (13:42:24): No previous M3. Returning today's.
oss-app_1        | INFO  [Rascal console] (13:42:24): 
oss-app_1        | INFO  [MetricListExecutor (elasticsearch, 20190102)] (13:42:24): Started Metric Executed (numberOfBreakingChanges).
valeriocos commented 5 years ago

Maybe there are no breaking changes @tdegueul ? If this is the case, could you point me to a couple of projects were breaking changes should be detected? thanks

jurgenvinju commented 5 years ago

I just had a quick look out of curiosity (and I woke up with some energy). An unexpected bug is triggered in the Eclipse Java Compiler, possibly because we use it just a bit differently than normally. The bug was reported earlier here: https://bugs.eclipse.org/bugs/show_bug.cgi?id=474080

tdegueul commented 5 years ago

I could reproduce the bug here.

The workaround in 88dbcf4f231765dd2b8ff4ac63dfb31be1d1068d is to assign a dummy m3(|unknown:///) model to the files we couldn't parse, record the error, and let the process continue for the other files. It happens with 3 of the 11k Java files in elastic/elasticsearch.

The platform can "successfully" build M3 models for Elasticsearch now, but the creation of delta models on which we rely to compute API metrics still takes way too much time (> 1 hour). I'm on it.

valeriocos commented 5 years ago

Thank you @tdegueul @jurgenvinju for working on it

tdegueul commented 5 years ago

@valeriocos I expect this to be fixed; please re-open if it isn't!