Skip to content

Issue with non escaping characters #60710

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Luxorum opened this issue May 12, 2025 · 1 comment
Open

Issue with non escaping characters #60710

Luxorum opened this issue May 12, 2025 · 1 comment
Labels
area-dart-model For issues related to conformance to the language spec in the parser, compilers or the CLI analyzer.

Comments

@Luxorum
Copy link

Luxorum commented May 12, 2025

The Dart analysis server crashes (exit code 255) instead of reporting a syntax error when encountering an unescaped apostrophe in a string literal immediately followed by the tokens Do (capital D, lower-case o) and or. This appears to be a lexing/parsing bug: after the unescaped apostrophe the analyzer mis-tokenizes Do and or as keywords, then fails deep inside DependencyWalker.

Here is the code that reproduces this issue, it can be also reproduced through dart.dev website:


void main() {
final a = 1;

final text = switch (a){
1=> 'You're planning to Do something or',
}
}


Dart SDK: 3.6.1

Error stack trace:

Internal error: Null check operator used on a null value
#0 LegacyAnalysisServer.sendServerErrorNotification (package:analysis_server/src/legacy_analysis_server.dart:714:31)
#1 ErrorNotifier.logException (package:analysis_server/src/server/error_notifier.dart:45:12)
#2 MulticastInstrumentationService.logException (package:analyzer/instrumentation/multicast_service.dart:28:15)
#3 Driver._captureExceptions.errorFunction (package:analysis_server/src/server/driver.dart:528:15)
#4 _Zone._processUncaughtError (dart:async/zone.dart:1097:14)
#5 _CustomZone.handleUncaughtError (dart:async/zone.dart:1301:5)
#6 Future._propagateToListeners (dart:async/future_impl.dart:816:16)
#7 Future._completeError (dart:async/future_impl.dart:715:5)

Unhandled exception:
Null check operator used on a null value
#0 Parser._attemptPrecedenceLevelRecovery (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6162:55)
#1 Parser._parsePrecedenceExpressionLoop (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6146:11)
#2 Parser.parsePrecedenceExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5917:12)
#3 Parser.parseExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5833:15)
#4 Parser.parseSwitchExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:10402:17)
#5 Parser.parsePrimary (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6647:16)
#6 Parser.parseUnaryExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6450:12)
#7 Parser.parsePrecedenceExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5893:13)
#8 Parser.parseExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5833:15)
#9 Parser.parseArgumentsRest (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7804:15)
#10 Parser.parseArguments (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7779:12)
#11 Parser.parseArgumentsOpt (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7760:14)
#12 Parser.parseSend (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7699:13)
#13 Parser.parseSendOrFunctionLiteral (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7206:12)
#14 Parser.parsePrimary (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6559:14)
#15 Parser.parseUnaryExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6450:12)
#16 Parser.parsePrecedenceExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5893:13)
#17 Parser.parseExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5833:15)
#18 Parser.parseLiteralListSuffix (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6944:19)
#19 Parser.parsePrimary (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6672:14)
#20 Parser.parseUnaryExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6450:12)
#21 Parser.parsePrecedenceExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5893:13)
#22 Parser.parseExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5833:15)
#23 Parser.parseArgumentsRest (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7804:15)
#24 Parser.parseArguments (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7779:12)
#25 Parser.parseArgumentsOpt (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7760:14)
#26 Parser.parseSend (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7699:13)
#27 Parser.parseSendOrFunctionLiteral (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7206:12)
#28 Parser.parsePrimary (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6559:14)
#29 Parser.parseUnaryExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6450:12)
#30 Parser.parsePrecedenceExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5893:13)
#31 Parser.parseExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5833:15)
#32 Parser.parseReturnStatement (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5735:13)
#33 Parser.parseStatementX (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5611:14)
#34 Parser.parseStatement (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5584:20)
#35 Parser.parseFunctionBody (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5489:15)
#36 Parser.parseAsyncOptBody (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5314:13)
#37 Parser.parseFunctionExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5243:13)
#38 Parser.parseParenthesizedExpressionFunctionLiteralOrRecordLiteral (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6697:16)
#39 Parser.parsePrimary (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6667:14)
#40 Parser.parseUnaryExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6450:12)
#41 Parser.parsePrecedenceExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5893:13)
#42 Parser.parseExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5833:15)
#43 Parser.parseArgumentsRest (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7804:15)
#44 Parser.parseArguments (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7779:12)
#45 Parser.parseArgumentsOpt (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7760:14)
#46 Parser.parseSend (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7699:13)
#47 Parser.parseSendOrFunctionLiteral (package:_fe_analyzer_shared/src/parser/parser_impl.dart:7206:12)
#48 Parser.parsePrimary (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6559:14)
#49 Parser.parseUnaryExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:6450:12)
#50 Parser.parsePrecedenceExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5893:13)
#51 Parser.parseExpression (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5833:15)
#52 Parser.parseReturnStatement (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5735:13)
#53 Parser.parseStatementX (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5611:14)
#54 Parser.parseStatement (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5584:20)
#55 Parser.parseFunctionBody (package:_fe_analyzer_shared/src/parser/parser_impl.dart:5489:15)
#56 Parser.parseMethod (package:_fe_analyzer_shared/src/parser/parser_impl.dart:4982:15)
#57 Parser.parseClassOrMixinOrExtensionOrEnumMemberImpl (package:_fe_analyzer_shared/src/parser/parser_impl.dart:4766:15)
#58 Parser.parseClassOrMixinOrExtensionBody (package:_fe_analyzer_shared/src/parser/parser_impl.dart:4383:15)
#59 Parser.parseClass (package:_fe_analyzer_shared/src/parser/parser_impl.dart:2724:13)
#60 Parser.parseClassOrNamedMixinApplication (package:_fe_analyzer_shared/src/parser/parser_impl.dart:2682:14)
#61 Parser._handleModifiersForClassDeclaration (package:_fe_analyzer_shared/src/parser/parser_impl.dart:832:12)
#62 Parser.parseTopLevelKeywordDeclaration (package:_fe_analyzer_shared/src/parser/parser_impl.dart:670:14)
#63 Parser.parseTopLevelDeclarationImpl (package:_fe_analyzer_shared/src/parser/parser_impl.dart:543:14)
#64 Parser.parseUnit (package:_fe_analyzer_shared/src/parser/parser_impl.dart:421:15)
#65 Parser.parseCompilationUnit2 (package:analyzer/src/generated/parser.dart:97:32)
#66 Parser.parseCompilationUnit (package:analyzer/src/generated/parser.dart:93:12)
#67 FileState.parseCode. (package:analyzer/src/dart/analysis/file_state.dart:681:25)
#68 OperationPerformanceImpl.run (package:analyzer/src/util/performance/operation_performance.dart:155:23)
#69 FileState.parseCode (package:analyzer/src/dart/analysis/file_state.dart:660:24)
#70 FileState.getParsed (package:analyzer/src/dart/analysis/file_state.dart:617:16)
#71 FileState._getUnlinkedUnit (package:analyzer/src/dart/analysis/file_state.dart:886:16)
#72 FileState.refresh. (package:analyzer/src/dart/analysis/file_state.dart:734:29)
#73 OperationPerformanceImpl.run (package:analyzer/src/util/performance/operation_performance.dart:155:23)
#74 FileState.refresh (package:analyzer/src/dart/analysis/file_state.dart:733:17)
#75 FileSystemState._newFile. (package:analyzer/src/dart/analysis/file_state.dart:1669:12)
#76 OperationPerformanceImpl.run (package:analyzer/src/util/performance/operation_performance.dart:155:23)
#77 FileSystemState._newFile (package:analyzer/src/dart/analysis/file_state.dart:1668:17)
#78 FileSystemState.getFileForUri (package:analyzer/src/dart/analysis/file_state.dart:1513:14)
#79 FileState._buildDirectiveUri (package:analyzer/src/dart/analysis/file_state.dart:817:34)
#80 FileState._buildConfigurableDirectiveUris (package:analyzer/src/dart/analysis/file_state.dart:782:22)
#81 FileKind.libraryExports. (package:analyzer/src/dart/analysis/file_state.dart:236:23)
#82 MappedListIterable.elementAt (dart:_internal/iterable.dart:435:31)
#83 ListIterator.moveNext (dart:_internal/iterable.dart:364:26)
#84 new _List._ofEfficientLengthIterable (dart:core-patch/array.dart:163:27)
#85 new _List.of (dart:core-patch/array.dart:128:20)
#86 new List.of (dart:core-patch/array_patch.dart:39:50)
#87 ListIterable.toList (dart:_internal/iterable.dart:224:7)
#88 IterableExtension.toFixedList (package:analyzer/src/utilities/extensions/collection.dart:22:12)
#89 FileKind.libraryExports (package:analyzer/src/dart/analysis/file_state.dart:275:8)
#90 _LibraryNode.computeDependencies. (package:analyzer/src/dart/analysis/library_graph.dart:195:25)
#91 MappedListIterable.elementAt (dart:_internal/iterable.dart:435:31)
#92 ListIterator.moveNext (dart:_internal/iterable.dart:364:26)
#93 IterableIterableExtension.flattenedToList (package:collection/src/iterable_extensions.dart:903:32)
#94 _LibraryNode.computeDependencies (package:analyzer/src/dart/analysis/library_graph.dart:200:10)
#95 Node.getDependencies (package:_fe_analyzer_shared/src/util/dependency_walker.dart:150:40)
#96 DependencyWalker.walk.strongConnect (package:_fe_analyzer_shared/src/util/dependency_walker.dart:55:40)
#97 DependencyWalker.walk.strongConnect (package:_fe_analyzer_shared/src/util/dependency_walker.dart:68:11)
#98 DependencyWalker.walk.strongConnect (package:_fe_analyzer_shared/src/util/dependency_walker.dart:68:11)
#99 DependencyWalker.walk.strongConnect (package:_fe_analyzer_shared/src/util/dependency_walker.dart:68:11)
#100 DependencyWalker.walk.strongConnect (package:_fe_analyzer_shared/src/util/dependency_walker.dart:68:11)
#101 DependencyWalker.walk.strongConnect (package:_fe_analyzer_shared/src/util/dependency_walker.dart:68:11)
#102 DependencyWalker.walk.strongConnect (package:_fe_analyzer_shared/src/util/dependency_walker.dart:68:11)
#103 DependencyWalker.walk.strongConnect (package:_fe_analyzer_shared/src/util/dependency_walker.dart:68:11)
#104 DependencyWalker.walk.strongConnect (package:_fe_analyzer_shared/src/util/dependency_walker.dart:68:11)
#105 DependencyWalker.walk.strongConnect (package:_fe_analyzer_shared/src/util/dependency_walker.dart:68:11)
#106 DependencyWalker.walk (package:_fe_analyzer_shared/src/util/dependency_walker.dart:121:5)
#107 computeLibraryCycle (package:analyzer/src/dart/analysis/library_graph.dart:20:17)
#108 LibraryFileKind.libraryCycle (package:analyzer/src/dart/analysis/file_state.dart:1953:7)
#109 LibraryContext.load.. (package:analyzer/src/dart/analysis/library_context.dart:277:32)
#110 OperationPerformanceImpl.run (package:analyzer/src/util/performance/operation_performance.dart:155:23)
#111 LibraryContext.load. (package:analyzer/src/dart/analysis/library_context.dart:274:38)
#112 PerformanceLog.runAsync (package:analyzer/src/dart/analysis/performance_logger.dart:50:21)
#113 LibraryContext.load (package:analyzer/src/dart/analysis/library_context.dart:273:18)
#114 AnalysisDriver._produceErrors (package:analyzer/src/dart/analysis/driver.dart:1967:26)
#115 AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1252:13)
#116 AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2446:24)

@Luxorum Luxorum added the area-devexp For issues related to the analysis server, IDE support, linter, `dart fix`, and diagnostic messages. label May 12, 2025
@bwilkerson bwilkerson added area-dart-model For issues related to conformance to the language spec in the parser, compilers or the CLI analyzer. and removed area-devexp For issues related to the analysis server, IDE support, linter, `dart fix`, and diagnostic messages. labels May 12, 2025
@lrhn
Copy link
Member

lrhn commented May 12, 2025

Isn't a parsing bug as such. The string literal ended after 'You' and re planning to Do something or '... is not valid Dart code.

It's not great error recovery. If it could have recongized that the ' was intended as a string character, not the closing quote, it could possibly have error recovered better.
Error recovery is always hard, you can't trust the parsing of the things you are trying to look at to recover, and you don't know how far back to go.
And sometimes you get var string = 'the plus sign, '+', is a positive sign!';. No error, no recovery, still not what author (probably) intended.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-dart-model For issues related to conformance to the language spec in the parser, compilers or the CLI analyzer.
Projects
None yet
Development

No branches or pull requests

3 participants