[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:
Vyacheslav Egorov 2018-10-11 16:52:14 +00:00
parent a6c8b62056
commit 3fe3106489
5 changed files with 36 additions and 25 deletions

View file

@ -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();

View file

@ -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) {

View file

@ -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);

View file

@ -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) {

View file

@ -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);