Skip to content

Analyzer crashes when analyzing a package with a different meta version #46183

Description

@simolus3

When the analyzer is analyzing a package using a different version of meta than the one it was compiled with, it may crash:

Unhandled exception:
RangeError (index): Invalid value: Not in inclusive range 0..12: 13
#0      List.[] (dart:core-patch/array.dart:268:52)
#1      BestPracticesVerifier._targetKindsFor (package:analyzer/src/error/best_practices_verifier.dart:1601:38)
#2      BestPracticesVerifier.visitAnnotation (package:analyzer/src/error/best_practices_verifier.dart:253:17)
#3      AnnotationImpl.accept (package:analyzer/src/dart/ast/ast.dart:302:50)
#4      NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:7517:20)
#5      AnnotatedNodeImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:145:17)
#6      ClassDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1537:11)
#7      RecursiveAstVisitor.visitClassDeclaration (package:analyzer/dart/ast/visitor.dart:711:10)
#8      BestPracticesVerifier.visitClassDeclaration (package:analyzer/src/error/best_practices_verifier.dart:323:13)
#9      ClassDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:1514:50)
#10     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:7517:20)
#11     CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2112:21)
#12     RecursiveAstVisitor.visitCompilationUnit (package:analyzer/dart/ast/visitor.dart:735:10)
#13     CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:2105:50)
#14     LibraryAnalyzer._computeHints (package:analyzer/src/dart/analysis/library_analyzer.dart:276:10)
#15     LibraryAnalyzer.analyzeSync.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:158:9)
#16     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:397:8)
#17     LibraryAnalyzer.analyzeSync (package:analyzer/src/dart/analysis/library_analyzer.dart:157:13)
#18     LibraryAnalyzer.analyze (package:analyzer/src/dart/analysis/library_analyzer.dart:104:12)
#19     AnalysisDriver._computeAnalysisResult.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1315:63)
#20     PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:32:15)
#21     AnalysisDriver._computeAnalysisResult (package:analyzer/src/dart/analysis/driver.dart:1286:20)
#22     AnalysisDriver._computeErrors (package:analyzer/src/dart/analysis/driver.dart:1369:26)
#23     AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:987:20)
#24     AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2006:24)
<asynchronous suspension>

#0      AnalysisDriver._computeAnalysisResult.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1344:9)
#1      PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:32:15)
#2      AnalysisDriver._computeAnalysisResult (package:analyzer/src/dart/analysis/driver.dart:1286:20)
#3      AnalysisDriver._computeErrors (package:analyzer/src/dart/analysis/driver.dart:1369:26)
#4      AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:987:20)
#5      AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2006:24)
<asynchronous suspension>

It looks like the culprit is this logic here:

for (var kindObject in value.getField('kinds')!.toSetValue()!) {
var index = kindObject.getField('index')!.toIntValue()!;
kinds.add(TargetKind.values[index]);
}

kindObject.getField('index')!.toIntValue()! refers to the index of the value in the actual meta package used by the code analyzed. However, TargetKind.values may be a different meta version (the one used when the SDK was built). Due to this mismatch, the analyzer may resolve to a wrong TargetKind. If a new meta update adds a new TargetKind with a higher index than what's available in the meta version used to compile the SDK, the analyzer crashes.

To reproduce:

cd /tmp
curl https://storage.googleapis.com/pub-packages/packages/moor-4.3.2.tar.gz --output moor.tar.gz
mkdir moor
cd moor
tar --extract --gzip --file ../moor.tar.gz
dart pub upgrade
dartanalyzer lib

I'll contribute a fix myself, just wanted to report this first.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1A high priority bug; for example, a single project is unusable or has many test failureslegacy-area-analyzerUse area-devexp instead.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions