Skip to content

Commit

Permalink
vscode: bump introspector and add command for getting optimal targets (
Browse files Browse the repository at this point in the history
…google#12942)

Signed-off-by: David Korczynski <[email protected]>
  • Loading branch information
DavidKorczynski authored Jan 15, 2025
1 parent c42856e commit 63b0232
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 69 deletions.
5 changes: 5 additions & 0 deletions tools/vscode-extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@
"command": "oss-fuzz.runFuzzIntrospector",
"title": "OSS-Fuzz: Run Full Fuzz Introspector",
"description": "Runs a full Fuzz Introspector"
},
{
"command": "oss-fuzz.GetOptimalTargets",
"title": "OSS-Fuzz: Get optimal targets",
"description": "Gets the optimal targets of this project"
}
],
"walkthroughs":[
Expand Down
21 changes: 21 additions & 0 deletions tools/vscode-extension/src/commands/cmdFIGetOptimalTargets.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////

import {getOptimalTargetsFromIntrospector} from '../fuzzIntrospectorHelper';

export async function runGetOptimalTargetsHandler() {
getOptimalTargetsFromIntrospector();
}
34 changes: 2 additions & 32 deletions tools/vscode-extension/src/commands/cmdRunFI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,41 +14,11 @@
//
////////////////////////////////////////////////////////////////////////////////

import * as vscode from 'vscode';
// import path = require('path');
import {println} from '../logger';
import {extensionConfig} from '../config';
import {isPathValidOssFuzzPath} from '../ossfuzzWrappers';
import {systemSync} from '../utils';
import {runFuzzIntrospector} from '../fuzzIntrospectorHelper';

/**
* Function for setting up Fuzz Introspector by way of a Python virtual env.
*/
export async function runFuzzIntrospectorHandler() {
println('Setting up oss-fuzz in /tmp/');

const workspaceFolder = vscode.workspace.workspaceFolders;
if (!workspaceFolder) {
return;
}
const pathOfLocal = workspaceFolder[0].uri.fsPath;
println('path of local: ' + pathOfLocal);

// First check if we already have Fuzz Introspector installed.
const tmpOssFuzzRepositoryPath = '/tmp/fi-tmp-env';

if ((await isPathValidOssFuzzPath(tmpOssFuzzRepositoryPath)) === true) {
println('Fuzz Introspector virtual env already exists in /tmp/fi-tmp-env');
extensionConfig.ossFuzzPepositoryWorkPath = tmpOssFuzzRepositoryPath;
return;
}

const cmdToExec = '/tmp/fi-tmp-env/bin/fuzz-introspector';
const args: Array<string> = ['full', '--target_dir=' + pathOfLocal];
const [res, output] = await systemSync(cmdToExec, args);
if (res === false) {
println('Failed run FI');
println(output);
return;
}
runFuzzIntrospector();
}
39 changes: 2 additions & 37 deletions tools/vscode-extension/src/commands/cmdSetupFI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,46 +14,11 @@
//
////////////////////////////////////////////////////////////////////////////////

import {println} from '../logger';
import {extensionConfig} from '../config';
import {isPathValidOssFuzzPath} from '../ossfuzzWrappers';
import {systemSync} from '../utils';
import {setUpFuzzIntrospector} from '../fuzzIntrospectorHelper';

/**
* Function for setting up Fuzz Introspector by way of a Python virtual env.
*/
export async function setUpFuzzIntrospectorHandler() {
println('Setting up oss-fuzz in /tmp/');

// First check if we already have Fuzz Introspector installed.
const tmpOssFuzzRepositoryPath = '/tmp/fi-tmp-env';

if ((await isPathValidOssFuzzPath(tmpOssFuzzRepositoryPath)) === true) {
println('Fuzz Introspector virtual env already exists in /tmp/fi-tmp-env');
extensionConfig.ossFuzzPepositoryWorkPath = tmpOssFuzzRepositoryPath;
return;
}

const cmdToExec = 'python3.11';
const args: Array<string> = ['-m', 'virtualenv', tmpOssFuzzRepositoryPath];
const [res, output] = await systemSync(cmdToExec, args);
if (res === false) {
println('Failed to create virtual environment');
println(output);
return;
}

const cmdToExec2 = '/tmp/fi-tmp-env/bin/python3.11';
const args2: Array<string> = [
'-m',
'pip',
'install',
'fuzz-introspector==0.1.5',
];
const [res2, output2] = await systemSync(cmdToExec2, args2);
if (res2 === false) {
println('Failed to create virtual environment');
println(output2);
return;
}
setUpFuzzIntrospector();
}
8 changes: 8 additions & 0 deletions tools/vscode-extension/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import {runEndToEndAndGetCoverage} from './commands/cmdEndToEndCoverage';
import {listFuzzersHandler} from './commands/cmdListFuzzers';
import {cmdInputCollectorReproduceTestcase} from './commands/cmdReproduceTestcase';
import {cmdDispatcherTemplate} from './commands/cmdTemplate';
import {runGetOptimalTargetsHandler} from './commands/cmdFIGetOptimalTargets';
import {setUpFuzzIntrospectorHandler} from './commands/cmdSetupFI';
import {runFuzzIntrospectorHandler} from './commands/cmdRunFI';
import {cmdDispatcherGenerateClusterfuzzLite} from './commands/cmdDispatcherGenerateClusterfuzzLite';
Expand Down Expand Up @@ -211,6 +212,13 @@ export function activate(context: vscode.ExtensionContext) {
}
)
);

context.subscriptions.push(
vscode.commands.registerCommand('oss-fuzz.GetOptimalTargets', async () => {
println('CMD start: run GetOptimalTargets');
await runGetOptimalTargetsHandler();
})
);
}

// This method is called when your extension is deactivated
Expand Down
117 changes: 117 additions & 0 deletions tools/vscode-extension/src/fuzzIntrospectorHelper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////

import * as vscode from 'vscode';

import {println} from './logger';
import {extensionConfig} from './config';
import {isPathValidOssFuzzPath} from './ossfuzzWrappers';
import {systemSync} from './utils';

const fs = require('fs');

export async function setUpFuzzIntrospector() {
println('Setting up oss-fuzz in /tmp/');

// First check if we already have Fuzz Introspector installed.
const tmpOssFuzzRepositoryPath = '/tmp/fi-tmp-env';

if ((await isPathValidOssFuzzPath(tmpOssFuzzRepositoryPath)) === true) {
println('Fuzz Introspector virtual env already exists in /tmp/fi-tmp-env');
extensionConfig.ossFuzzPepositoryWorkPath = tmpOssFuzzRepositoryPath;
return;
}

const cmdToExec = 'python3.11';
const args: Array<string> = ['-m', 'virtualenv', tmpOssFuzzRepositoryPath];
const [res, output] = await systemSync(cmdToExec, args);
if (res === false) {
println('Failed to create virtual environment');
println(output);
return;
}

const cmdToExec2 = '/tmp/fi-tmp-env/bin/python3.11';
const args2: Array<string> = [
'-m',
'pip',
'install',
'fuzz-introspector==0.1.6',
];
const [res2, output2] = await systemSync(cmdToExec2, args2);
if (res2 === false) {
println('Failed to create virtual environment');
println(output2);
return;
}
}

export async function runFuzzIntrospector() {
println('Setting up oss-fuzz in /tmp/');

const workspaceFolder = vscode.workspace.workspaceFolders;
if (!workspaceFolder) {
return;
}
const pathOfLocal = workspaceFolder[0].uri.fsPath;
println('path of local: ' + pathOfLocal);

// First check if we already have Fuzz Introspector installed.
const tmpOssFuzzRepositoryPath = '/tmp/fi-tmp-env';

if ((await isPathValidOssFuzzPath(tmpOssFuzzRepositoryPath)) === true) {
println('Fuzz Introspector virtual env already exists in /tmp/fi-tmp-env');
extensionConfig.ossFuzzPepositoryWorkPath = tmpOssFuzzRepositoryPath;
return;
}

await systemSync('mkdir', ['-p', '/tmp/out-fi/']);

const cmdToExec = '/tmp/fi-tmp-env/bin/fuzz-introspector';
const args: Array<string> = [
'full',
'--target_dir=' + pathOfLocal,
'--out-dir=/tmp/out-fi',
];
const [res, output] = await systemSync(cmdToExec, args);
if (res === false) {
println('Failed run FI');
println(output);
return;
}
}

export async function getOptimalTargetsFromIntrospector() {
if (!fs.existsSync('/tmp/out-fi/summary.json')) {
println('There are no introspector reports. Please run introspector first');
}
const json_data = fs.readFileSync('/tmp/out-fi/summary.json');
// println(json_data);

const jsonCodeCoverage = JSON.parse(json_data);

println('Optimal targets');
Object.entries(jsonCodeCoverage['analyses']['OptimalTargets']).forEach(
entry => {
const [key, value] = entry;
const objectDictionary: any = value as any;
println(JSON.stringify(objectDictionary, null, 2));
}
);
println('--------------------------');

return;
}

0 comments on commit 63b0232

Please sign in to comment.