Skip to content

Commit 706fa83

Browse files
jensjohaCommit Bot
authored and
Commit Bot
committed
[CFE] Expression suite fuzzing with no-nnbd too
Previously the expression suite was testing in non-nnbd mode. It was recently converted to testing in nnbd mode. In doing so, fuzzing found some bugs. This CL lets fuzzing work in both modes, potentially catching more bugs. Change-Id: I69760078ffe8ed7a5a33216a09378da3e4dd1903 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/238340 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Jens Johansen <[email protected]>
1 parent 88846ca commit 706fa83

File tree

1 file changed

+144
-42
lines changed

1 file changed

+144
-42
lines changed

pkg/front_end/test/fasta/expression_suite.dart

Lines changed: 144 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ import '../utils/kernel_chain.dart' show runDiff, openWrite;
7373

7474
class Context extends ChainContext {
7575
final CompilerContext compilerContext;
76+
final CompilerContext compilerContextNoNNBD;
7677
final List<DiagnosticMessage> errors;
7778

7879
@override
@@ -82,7 +83,8 @@ class Context extends ChainContext {
8283
final Set<Uri> fuzzedLibraries = {};
8384
int fuzzCompiles = 0;
8485

85-
Context(this.compilerContext, this.errors, bool updateExpectations, this.fuzz)
86+
Context(this.compilerContext, this.compilerContextNoNNBD, this.errors,
87+
bool updateExpectations, this.fuzz)
8688
: steps = <Step>[
8789
const ReadTest(),
8890
const CompileExpression(),
@@ -362,8 +364,12 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
362364

363365
// Compile [test.expression], update [test.errors] with results.
364366
// As a side effect - verify that generated procedure can be serialized.
365-
Future<void> compileExpression(TestCase test, IncrementalCompiler compiler,
366-
IncrementalCompilerResult compilerResult, Context context) async {
367+
Future<void> compileExpression(
368+
TestCase test,
369+
IncrementalCompiler compiler,
370+
IncrementalCompiler? compilerNoNNBD,
371+
IncrementalCompilerResult compilerResult,
372+
Context context) async {
367373
Map<String, DartType>? definitions = createDefinitionsWithTypes(
368374
compilerResult.classHierarchy?.knownLibraries,
369375
test.definitionTypes,
@@ -408,29 +414,36 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
408414
}
409415

410416
if (context.fuzz) {
411-
await fuzz(compiler, compilerResult, context);
417+
await fuzz(compiler, compilerNoNNBD!, compilerResult, context);
412418
}
413419
}
414420

415-
Future<void> fuzz(IncrementalCompiler compiler,
416-
IncrementalCompilerResult compilerResult, Context context) async {
421+
Future<void> fuzz(
422+
IncrementalCompiler compiler,
423+
IncrementalCompiler compilerNoNNBD,
424+
IncrementalCompilerResult compilerResult,
425+
Context context) async {
417426
for (Library lib in compilerResult.classHierarchy!.knownLibraries) {
418427
if (!context.fuzzedLibraries.add(lib.importUri)) continue;
419428

420429
for (Member m in lib.members) {
421-
await fuzzMember(m, compiler, lib.importUri, context);
430+
await fuzzMember(m, compiler, compilerNoNNBD, lib.importUri, context);
422431
}
423432

424433
for (Class c in lib.classes) {
425434
for (Member m in c.members) {
426-
await fuzzMember(m, compiler, lib.importUri, context);
435+
await fuzzMember(m, compiler, compilerNoNNBD, lib.importUri, context);
427436
}
428437
}
429438
}
430439
}
431440

432-
Future<void> fuzzMember(Member m, IncrementalCompiler compiler,
433-
Uri libraryUri, Context context) async {
441+
Future<void> fuzzMember(
442+
Member m,
443+
IncrementalCompiler compiler,
444+
IncrementalCompiler compilerNoNNBD,
445+
Uri libraryUri,
446+
Context context) async {
434447
String expression = m.name.text;
435448
if (m is Field || (m is Procedure && m.isGetter)) {
436449
// fields and getters are fine as-is
@@ -447,8 +460,7 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
447460
expression = "${parent.name}()";
448461
}
449462
} else {
450-
print("Ignoring $m (${m.runtimeType})");
451-
return;
463+
throw "Didn't know ${m.runtimeType}";
452464
}
453465

454466
String? className;
@@ -457,23 +469,36 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
457469
className = parent.name;
458470
}
459471

460-
await fuzzTryCompile(compiler, "$expression", libraryUri, className,
461-
!m.isInstanceMember, context);
462-
if (className != null && !m.isInstanceMember) {
463-
await fuzzTryCompile(compiler, "$className.$expression", libraryUri, null,
464-
!m.isInstanceMember, context);
465-
}
466-
await fuzzTryCompile(compiler, "$expression.toString()", libraryUri,
472+
await fuzzTryCompile(compiler, compilerNoNNBD, "$expression", libraryUri,
467473
className, !m.isInstanceMember, context);
468474
if (className != null && !m.isInstanceMember) {
469-
await fuzzTryCompile(compiler, "$className.$expression.toString()",
475+
await fuzzTryCompile(compiler, compilerNoNNBD, "$className.$expression",
470476
libraryUri, null, !m.isInstanceMember, context);
471477
}
472-
await fuzzTryCompile(compiler, "$expression.toString() == '42'", libraryUri,
473-
className, !m.isInstanceMember, context);
478+
await fuzzTryCompile(compiler, compilerNoNNBD, "$expression.toString()",
479+
libraryUri, className, !m.isInstanceMember, context);
474480
if (className != null && !m.isInstanceMember) {
475481
await fuzzTryCompile(
476482
compiler,
483+
compilerNoNNBD,
484+
"$className.$expression.toString()",
485+
libraryUri,
486+
null,
487+
!m.isInstanceMember,
488+
context);
489+
}
490+
await fuzzTryCompile(
491+
compiler,
492+
compilerNoNNBD,
493+
"$expression.toString() == '42'",
494+
libraryUri,
495+
className,
496+
!m.isInstanceMember,
497+
context);
498+
if (className != null && !m.isInstanceMember) {
499+
await fuzzTryCompile(
500+
compiler,
501+
compilerNoNNBD,
477502
"$className.$expression.toString() == '42'",
478503
libraryUri,
479504
null,
@@ -482,6 +507,7 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
482507
}
483508
await fuzzTryCompile(
484509
compiler,
510+
compilerNoNNBD,
485511
"() { var x = $expression.toString(); x == '42'; }()",
486512
libraryUri,
487513
className,
@@ -490,6 +516,7 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
490516
if (className != null && !m.isInstanceMember) {
491517
await fuzzTryCompile(
492518
compiler,
519+
compilerNoNNBD,
493520
"() { var x = $className.$expression.toString(); x == '42'; }()",
494521
libraryUri,
495522
null,
@@ -498,25 +525,50 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
498525
}
499526
}
500527

501-
Future<void> fuzzTryCompile(IncrementalCompiler compiler, String expression,
502-
Uri libraryUri, String? className, bool isStatic, Context context) async {
528+
Future<void> fuzzTryCompile(
529+
IncrementalCompiler compiler,
530+
IncrementalCompiler compilerNoNNBD,
531+
String expression,
532+
Uri libraryUri,
533+
String? className,
534+
bool isStatic,
535+
Context context) async {
503536
context.fuzzCompiles++;
504537
print("Fuzz compile #${context.fuzzCompiles} "
505538
"('$expression' in $libraryUri $className)");
506-
Procedure? compiledProcedure = await compiler.compileExpression(
507-
expression,
508-
{},
509-
[],
510-
"debugExpr",
511-
libraryUri,
512-
className: className,
513-
isStatic: isStatic,
514-
);
515-
context.takeErrors();
516-
if (compiledProcedure != null) {
517-
// Confirm we can serialize generated procedure.
518-
List<int> list = serializeProcedure(compiledProcedure);
519-
assert(list.length > 0);
539+
{
540+
Procedure? compiledProcedure = await compiler.compileExpression(
541+
expression,
542+
{},
543+
[],
544+
"debugExpr",
545+
libraryUri,
546+
className: className,
547+
isStatic: isStatic,
548+
);
549+
context.takeErrors();
550+
if (compiledProcedure != null) {
551+
// Confirm we can serialize generated procedure.
552+
List<int> list = serializeProcedure(compiledProcedure);
553+
assert(list.length > 0);
554+
}
555+
}
556+
{
557+
Procedure? compiledProcedure = await compilerNoNNBD.compileExpression(
558+
expression,
559+
{},
560+
[],
561+
"debugExpr",
562+
libraryUri,
563+
className: className,
564+
isStatic: isStatic,
565+
);
566+
context.takeErrors();
567+
if (compiledProcedure != null) {
568+
// Confirm we can serialize generated procedure.
569+
List<int> list = serializeProcedure(compiledProcedure);
570+
assert(list.length > 0);
571+
}
520572
}
521573
}
522574

@@ -543,11 +595,27 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
543595
"${errors.map((e) => e.plainTextFormatted.first).toList()}");
544596
}
545597
Uri dillFileUri = toTestUri("${test.description.shortName}.dill");
598+
Uri dillFileNoNNBDUri =
599+
toTestUri("${test.description.shortName}.no.nnbd.dill");
546600
Uint8List dillData = await serializeComponent(component);
547601
context.fileSystem.entityForUri(dillFileUri).writeAsBytesSync(dillData);
548602
Set<Uri> beforeFuzzedLibraries = context.fuzzedLibraries.toSet();
549-
await compileExpression(
550-
test, sourceCompiler, sourceCompilerResult, context);
603+
IncrementalCompiler? sourceCompilerNoNNBD;
604+
if (context.fuzz) {
605+
sourceCompilerNoNNBD =
606+
new IncrementalCompiler(context.compilerContextNoNNBD);
607+
IncrementalCompilerResult sourceCompilerNoNNBDResult =
608+
await sourceCompilerNoNNBD
609+
.computeDelta(entryPoints: [test.entryPoint]);
610+
Component componentNoNNBD = sourceCompilerNoNNBDResult.component;
611+
Uint8List dillDataNoNNBD = await serializeComponent(componentNoNNBD);
612+
context.fileSystem
613+
.entityForUri(dillFileNoNNBDUri)
614+
.writeAsBytesSync(dillDataNoNNBD);
615+
context.takeErrors();
616+
}
617+
await compileExpression(test, sourceCompiler, sourceCompilerNoNNBD,
618+
sourceCompilerResult, context);
551619

552620
IncrementalCompiler dillCompiler =
553621
new IncrementalCompiler(context.compilerContext, dillFileUri);
@@ -560,9 +628,23 @@ class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
560628
// Since it compiled successfully from source, the bootstrap-from-Dill
561629
// should also succeed without errors.
562630
assert(errors.isEmpty);
631+
632+
IncrementalCompiler? dillCompilerNoNNBD;
633+
if (context.fuzz) {
634+
dillCompilerNoNNBD = new IncrementalCompiler(
635+
context.compilerContextNoNNBD, dillFileNoNNBDUri);
636+
IncrementalCompilerResult dillCompilerNoNNBDResult =
637+
await dillCompilerNoNNBD
638+
.computeDelta(entryPoints: [test.entryPoint]);
639+
Component componentNoNNBD = dillCompilerNoNNBDResult.component;
640+
componentNoNNBD.computeCanonicalNames();
641+
context.takeErrors();
642+
}
643+
563644
context.fuzzedLibraries.clear();
564645
context.fuzzedLibraries.addAll(beforeFuzzedLibraries);
565-
await compileExpression(test, dillCompiler, dillCompilerResult, context);
646+
await compileExpression(
647+
test, dillCompiler, dillCompilerNoNNBD, dillCompilerResult, context);
566648
}
567649
return new Result.pass(tests);
568650
}
@@ -614,17 +696,37 @@ Future<Context> createContext(
614696
final ProcessedOptions options =
615697
new ProcessedOptions(options: optionBuilder, inputs: [entryPoint]);
616698

699+
final CompilerOptions optionBuilderNoNNBD = new CompilerOptions()
700+
..target = new VmTarget(new TargetFlags())
701+
..verbose = true
702+
..omitPlatform = true
703+
..fileSystem = fs
704+
..sdkSummary = sdkSummary
705+
..onDiagnostic = (DiagnosticMessage message) {
706+
printDiagnosticMessage(message, print);
707+
errors.add(message);
708+
}
709+
..environmentDefines = const {}
710+
..explicitExperimentalFlags = {ExperimentalFlag.nonNullable: false}
711+
..allowedExperimentalFlagsForTesting = const AllowedExperimentalFlags();
712+
713+
final ProcessedOptions optionsNoNNBD =
714+
new ProcessedOptions(options: optionBuilderNoNNBD, inputs: [entryPoint]);
715+
617716
final bool updateExpectations = environment["updateExpectations"] == "true";
618717

619718
final bool fuzz = environment["fuzz"] == "true";
620719

621720
final CompilerContext compilerContext = new CompilerContext(options);
721+
final CompilerContext compilerContextNoNNBD =
722+
new CompilerContext(optionsNoNNBD);
622723

623724
// Disable colors to ensure that expectation files are the same across
624725
// platforms and independent of stdin/stderr.
625726
colors.enableColors = false;
626727

627-
return new Context(compilerContext, errors, updateExpectations, fuzz);
728+
return new Context(
729+
compilerContext, compilerContextNoNNBD, errors, updateExpectations, fuzz);
628730
}
629731

630732
void main([List<String> arguments = const []]) =>

0 commit comments

Comments
 (0)