mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 00:58:29 +00:00
Sanitize arguments of super/redirecting constructor invocations.
We have a spike of crashes internally. Change-Id: If7c280692ac0acdd2e4a4acd6096a4669746069c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/291120 Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
parent
edccf64f54
commit
84c0f2c880
|
@ -87,7 +87,7 @@ import 'package:analyzer/src/utilities/uri_cache.dart';
|
||||||
/// TODO(scheglov) Clean up the list of implicitly analyzed files.
|
/// TODO(scheglov) Clean up the list of implicitly analyzed files.
|
||||||
class AnalysisDriver implements AnalysisDriverGeneric {
|
class AnalysisDriver implements AnalysisDriverGeneric {
|
||||||
/// The version of data format, should be incremented on every format change.
|
/// The version of data format, should be incremented on every format change.
|
||||||
static const int DATA_VERSION = 264;
|
static const int DATA_VERSION = 265;
|
||||||
|
|
||||||
/// The number of exception contexts allowed to write. Once this field is
|
/// The number of exception contexts allowed to write. Once this field is
|
||||||
/// zero, we stop writing any new exception contexts in this process.
|
/// zero, we stop writing any new exception contexts in this process.
|
||||||
|
|
|
@ -39,6 +39,10 @@ class _Visitor extends GeneralizingElementVisitor<void> {
|
||||||
final expression = initializer.expression;
|
final expression = initializer.expression;
|
||||||
final replacement = replaceNotSerializableNode(expression);
|
final replacement = replaceNotSerializableNode(expression);
|
||||||
initializer.expression = replacement;
|
initializer.expression = replacement;
|
||||||
|
} else if (initializer is RedirectingConstructorInvocationImpl) {
|
||||||
|
_sanitizeArguments(initializer.argumentList.arguments);
|
||||||
|
} else if (initializer is SuperConstructorInvocationImpl) {
|
||||||
|
_sanitizeArguments(initializer.argumentList.arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,13 +56,7 @@ class _Visitor extends GeneralizingElementVisitor<void> {
|
||||||
for (final annotation in element.metadata) {
|
for (final annotation in element.metadata) {
|
||||||
final ast = (annotation as ElementAnnotationImpl).annotationAst;
|
final ast = (annotation as ElementAnnotationImpl).annotationAst;
|
||||||
_detachNode(ast);
|
_detachNode(ast);
|
||||||
// Sanitize arguments.
|
_sanitizeArguments(ast.arguments?.arguments);
|
||||||
final arguments = ast.arguments?.arguments;
|
|
||||||
if (arguments != null) {
|
|
||||||
for (var i = 0; i < arguments.length; i++) {
|
|
||||||
arguments[i] = replaceNotSerializableNode(arguments[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
super.visitElement(element);
|
super.visitElement(element);
|
||||||
}
|
}
|
||||||
|
@ -108,4 +106,12 @@ class _Visitor extends GeneralizingElementVisitor<void> {
|
||||||
node.endToken.next = null;
|
node.endToken.next = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _sanitizeArguments(List<ExpressionImpl>? arguments) {
|
||||||
|
if (arguments != null) {
|
||||||
|
for (var i = 0; i < arguments.length; i++) {
|
||||||
|
arguments[i] = replaceNotSerializableNode(arguments[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12911,7 +12911,7 @@ library
|
||||||
''');
|
''');
|
||||||
}
|
}
|
||||||
|
|
||||||
test_const_invalid_functionExpression_inConstructorInitializer() async {
|
test_const_invalid_functionExpression_constructorFieldInitializer() async {
|
||||||
var library = await buildLibrary('''
|
var library = await buildLibrary('''
|
||||||
class A {
|
class A {
|
||||||
final Object? foo;
|
final Object? foo;
|
||||||
|
@ -12968,6 +12968,91 @@ library
|
||||||
''');
|
''');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test_const_invalid_functionExpression_redirectingConstructorInvocation() async {
|
||||||
|
var library = await buildLibrary('''
|
||||||
|
class A {
|
||||||
|
const A(Object a, Object b);
|
||||||
|
const A.named() : this(0, () => 0);
|
||||||
|
}
|
||||||
|
''');
|
||||||
|
checkElementText(library, r'''
|
||||||
|
library
|
||||||
|
definingUnit
|
||||||
|
classes
|
||||||
|
class A @6
|
||||||
|
constructors
|
||||||
|
const @18
|
||||||
|
parameters
|
||||||
|
requiredPositional a @27
|
||||||
|
type: Object
|
||||||
|
requiredPositional b @37
|
||||||
|
type: Object
|
||||||
|
const named @51
|
||||||
|
periodOffset: 50
|
||||||
|
nameEnd: 56
|
||||||
|
constantInitializers
|
||||||
|
RedirectingConstructorInvocation
|
||||||
|
thisKeyword: this @61
|
||||||
|
argumentList: ArgumentList
|
||||||
|
leftParenthesis: ( @65
|
||||||
|
arguments
|
||||||
|
IntegerLiteral
|
||||||
|
literal: 0 @66
|
||||||
|
staticType: int
|
||||||
|
SimpleIdentifier
|
||||||
|
token: _notSerializableExpression @-1
|
||||||
|
staticElement: <null>
|
||||||
|
staticType: null
|
||||||
|
rightParenthesis: ) @76
|
||||||
|
staticElement: self::@class::A::@constructor::new
|
||||||
|
redirectedConstructor: self::@class::A::@constructor::new
|
||||||
|
''');
|
||||||
|
}
|
||||||
|
|
||||||
|
test_const_invalid_functionExpression_superConstructorInvocation() async {
|
||||||
|
var library = await buildLibrary('''
|
||||||
|
class A {
|
||||||
|
const A(Object a, Object b);
|
||||||
|
}
|
||||||
|
class B extends A {
|
||||||
|
const B() : super(0, () => 0);
|
||||||
|
}
|
||||||
|
''');
|
||||||
|
checkElementText(library, r'''
|
||||||
|
library
|
||||||
|
definingUnit
|
||||||
|
classes
|
||||||
|
class A @6
|
||||||
|
constructors
|
||||||
|
const @18
|
||||||
|
parameters
|
||||||
|
requiredPositional a @27
|
||||||
|
type: Object
|
||||||
|
requiredPositional b @37
|
||||||
|
type: Object
|
||||||
|
class B @49
|
||||||
|
supertype: A
|
||||||
|
constructors
|
||||||
|
const @71
|
||||||
|
constantInitializers
|
||||||
|
SuperConstructorInvocation
|
||||||
|
superKeyword: super @77
|
||||||
|
argumentList: ArgumentList
|
||||||
|
leftParenthesis: ( @82
|
||||||
|
arguments
|
||||||
|
IntegerLiteral
|
||||||
|
literal: 0 @83
|
||||||
|
staticType: int
|
||||||
|
SimpleIdentifier
|
||||||
|
token: _notSerializableExpression @-1
|
||||||
|
staticElement: <null>
|
||||||
|
staticType: null
|
||||||
|
rightParenthesis: ) @93
|
||||||
|
staticElement: self::@class::A::@constructor::new
|
||||||
|
superConstructor: self::@class::A::@constructor::new
|
||||||
|
''');
|
||||||
|
}
|
||||||
|
|
||||||
@FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
|
@FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
|
||||||
test_const_invalid_intLiteral() async {
|
test_const_invalid_intLiteral() async {
|
||||||
var library = await buildLibrary(r'''
|
var library = await buildLibrary(r'''
|
||||||
|
|
Loading…
Reference in a new issue