mirror of
https://github.com/dart-lang/sdk
synced 2024-10-04 17:04:56 +00:00
[gardening] Fix leaks in run_vm_tests binary detected by ASAN.
Change-Id: I8a7f008ad7d25111b0c9da7a2e65f489edce7900 Reviewed-on: https://dart-review.googlesource.com/c/79260 Commit-Queue: Vyacheslav Egorov <vegorov@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
This commit is contained in:
parent
a6c8b62056
commit
3fe3106489
|
@ -245,18 +245,20 @@ static int Main(int argc, const char** argv) {
|
|||
int arg_pos = 1;
|
||||
bool start_kernel_isolate = false;
|
||||
if (strstr(argv[arg_pos], "--dfe") == argv[arg_pos]) {
|
||||
const char* delim = strstr(argv[1], "=");
|
||||
const char* delim = strstr(argv[arg_pos], "=");
|
||||
if (delim == NULL || strlen(delim + 1) == 0) {
|
||||
bin::Log::PrintErr("Invalid value for the option: %s\n", argv[1]);
|
||||
bin::Log::PrintErr("Invalid value for the option: %s\n", argv[arg_pos]);
|
||||
PrintUsage();
|
||||
return 1;
|
||||
}
|
||||
kernel_snapshot = strdup(delim + 1);
|
||||
// VM needs '--use-dart-frontend' option, which we will insert in place
|
||||
// of '--dfe' option.
|
||||
argv[arg_pos] = strdup("--use-dart-frontend");
|
||||
// Remove this flag from the list by shifting all arguments down.
|
||||
for (intptr_t i = arg_pos; i < argc - 1; i++) {
|
||||
argv[i] = argv[i + 1];
|
||||
}
|
||||
argv[argc - 1] = nullptr;
|
||||
argc--;
|
||||
start_kernel_isolate = true;
|
||||
++arg_pos;
|
||||
}
|
||||
|
||||
if (arg_pos == argc - 1 && strcmp(argv[arg_pos], "--benchmarks") == 0) {
|
||||
|
@ -275,8 +277,12 @@ static int Main(int argc, const char** argv) {
|
|||
bin::TimerUtils::InitOnce();
|
||||
bin::EventHandler::Start();
|
||||
|
||||
const char* error = Flags::ProcessCommandLineFlags(dart_argc, dart_argv);
|
||||
ASSERT(error == NULL);
|
||||
char* error = Flags::ProcessCommandLineFlags(dart_argc, dart_argv);
|
||||
if (error != NULL) {
|
||||
bin::Log::PrintErr("Failed to parse flags: %s\n", error);
|
||||
free(error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
TesterState::vm_snapshot_data = dart::bin::vm_snapshot_data;
|
||||
TesterState::create_callback = CreateIsolateAndSetup;
|
||||
|
@ -286,13 +292,17 @@ static int Main(int argc, const char** argv) {
|
|||
|
||||
error = Dart::Init(
|
||||
dart::bin::vm_snapshot_data, dart::bin::vm_snapshot_instructions,
|
||||
CreateIsolateAndSetup /* create */, NULL /* shutdown */,
|
||||
CleanupIsolate /* cleanup */, NULL /* thread_exit */,
|
||||
CreateIsolateAndSetup /* create */, nullptr /* shutdown */,
|
||||
CleanupIsolate /* cleanup */, nullptr /* thread_exit */,
|
||||
dart::bin::DartUtils::OpenFile, dart::bin::DartUtils::ReadFile,
|
||||
dart::bin::DartUtils::WriteFile, dart::bin::DartUtils::CloseFile,
|
||||
NULL /* entropy_source */, NULL /* get_service_assets */,
|
||||
nullptr /* entropy_source */, nullptr /* get_service_assets */,
|
||||
start_kernel_isolate);
|
||||
ASSERT(error == NULL);
|
||||
if (error != nullptr) {
|
||||
bin::Log::PrintErr("Failed to initialize VM: %s\n", error);
|
||||
free(error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Apply the filter to all registered tests.
|
||||
TestCaseBase::RunAll();
|
||||
|
@ -300,7 +310,11 @@ static int Main(int argc, const char** argv) {
|
|||
Benchmark::RunAll(argv[0]);
|
||||
|
||||
error = Dart::Cleanup();
|
||||
ASSERT(error == NULL);
|
||||
if (error != nullptr) {
|
||||
bin::Log::PrintErr("Failed shutdown VM: %s\n", error);
|
||||
free(error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
TestCaseBase::RunAllRaw();
|
||||
|
||||
|
|
|
@ -373,10 +373,10 @@ void Dart::WaitForIsolateShutdown() {
|
|||
ASSERT(Isolate::isolates_list_head_ == Dart::vm_isolate());
|
||||
}
|
||||
|
||||
const char* Dart::Cleanup() {
|
||||
char* Dart::Cleanup() {
|
||||
ASSERT(Isolate::Current() == NULL);
|
||||
if (vm_isolate_ == NULL) {
|
||||
return "VM already terminated.";
|
||||
return strdup("VM already terminated.");
|
||||
}
|
||||
|
||||
if (FLAG_trace_shutdown) {
|
||||
|
|
|
@ -24,6 +24,8 @@ class Program;
|
|||
|
||||
class Dart : public AllStatic {
|
||||
public:
|
||||
// Returns null if initialization succeeds, otherwise returns an error message
|
||||
// (caller owns error message and has to free it).
|
||||
static char* Init(const uint8_t* vm_snapshot_data,
|
||||
const uint8_t* vm_snapshot_instructions,
|
||||
Dart_IsolateCreateCallback create,
|
||||
|
@ -37,7 +39,10 @@ class Dart : public AllStatic {
|
|||
Dart_EntropySource entropy_source,
|
||||
Dart_GetVMServiceAssetsArchive get_service_assets,
|
||||
bool start_kernel_isolate);
|
||||
static const char* Cleanup();
|
||||
|
||||
// Returns null if cleanup succeeds, otherwise returns an error message
|
||||
// (caller owns error message and has to free it).
|
||||
static char* Cleanup();
|
||||
|
||||
static Isolate* CreateIsolate(const char* name_prefix,
|
||||
const Dart_IsolateFlags& api_flags);
|
||||
|
|
|
@ -1011,11 +1011,7 @@ DART_EXPORT char* Dart_Initialize(Dart_InitializeParams* params) {
|
|||
|
||||
DART_EXPORT char* Dart_Cleanup() {
|
||||
CHECK_NO_ISOLATE(Isolate::Current());
|
||||
const char* err_msg = Dart::Cleanup();
|
||||
if (err_msg != NULL) {
|
||||
return strdup(err_msg);
|
||||
}
|
||||
return NULL;
|
||||
return Dart::Cleanup();
|
||||
}
|
||||
|
||||
DART_EXPORT char* Dart_SetVMFlags(int argc, const char** argv) {
|
||||
|
|
|
@ -480,12 +480,8 @@ class VMTestSuite extends TestSuite {
|
|||
void _addTest(ExpectationSet testExpectations, String testName) {
|
||||
var args = configuration.standardOptions.toList();
|
||||
if (configuration.compilerConfiguration.previewDart2) {
|
||||
// TODO(ahe): Are any of these arguments used or needed?
|
||||
args.add('--use-dart-frontend');
|
||||
// '--dfe' has to be the first argument for run_vm_test to pick it up.
|
||||
args.insert(0, '--dfe=$buildDir/gen/kernel-service.dart.snapshot');
|
||||
// TODO(ahe): This argument is probably ignored by the VM.
|
||||
args.add('--strong');
|
||||
}
|
||||
|
||||
args.add(testName);
|
||||
|
|
Loading…
Reference in a new issue