vscode: bump introspector and add command for getting optimal targets (#12942)

Signed-off-by: David Korczynski <david@adalogics.com>
This commit is contained in:
DavidKorczynski 2025-01-15 20:14:52 +00:00 committed by GitHub
parent c42856e539
commit 63b0232d7c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 155 additions and 69 deletions

View File

@ -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":[

View File

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

View File

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

View File

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

View File

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

View File

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