diff --git a/tools/vscode-extension/package.json b/tools/vscode-extension/package.json index 1694084f0..18e1227a2 100644 --- a/tools/vscode-extension/package.json +++ b/tools/vscode-extension/package.json @@ -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":[ diff --git a/tools/vscode-extension/src/commands/cmdFIGetOptimalTargets.ts b/tools/vscode-extension/src/commands/cmdFIGetOptimalTargets.ts new file mode 100644 index 000000000..b35ff19f0 --- /dev/null +++ b/tools/vscode-extension/src/commands/cmdFIGetOptimalTargets.ts @@ -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(); +} diff --git a/tools/vscode-extension/src/commands/cmdRunFI.ts b/tools/vscode-extension/src/commands/cmdRunFI.ts index 8c55a8ba9..bc2ecce80 100644 --- a/tools/vscode-extension/src/commands/cmdRunFI.ts +++ b/tools/vscode-extension/src/commands/cmdRunFI.ts @@ -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 = ['full', '--target_dir=' + pathOfLocal]; - const [res, output] = await systemSync(cmdToExec, args); - if (res === false) { - println('Failed run FI'); - println(output); - return; - } + runFuzzIntrospector(); } diff --git a/tools/vscode-extension/src/commands/cmdSetupFI.ts b/tools/vscode-extension/src/commands/cmdSetupFI.ts index 7a8970a6f..bae19f373 100644 --- a/tools/vscode-extension/src/commands/cmdSetupFI.ts +++ b/tools/vscode-extension/src/commands/cmdSetupFI.ts @@ -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 = ['-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 = [ - '-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(); } diff --git a/tools/vscode-extension/src/extension.ts b/tools/vscode-extension/src/extension.ts index 1392d4da9..4c60c30bd 100644 --- a/tools/vscode-extension/src/extension.ts +++ b/tools/vscode-extension/src/extension.ts @@ -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 diff --git a/tools/vscode-extension/src/fuzzIntrospectorHelper.ts b/tools/vscode-extension/src/fuzzIntrospectorHelper.ts new file mode 100644 index 000000000..14737d4cf --- /dev/null +++ b/tools/vscode-extension/src/fuzzIntrospectorHelper.ts @@ -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 = ['-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 = [ + '-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 = [ + '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; +}