Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as vscode from 'vscode';
import * as cp from 'child_process';
import * as xml2js from 'xml2js';

import { documentationLinkMap } from './util/documentation';
import { documentationLinkMap, getPremiumCertLink } from './util/documentation';
import { runCommand } from './util/scripts';
import { looksLikePath, resolvePath, findWorkspaceRoot } from './util/path';

Expand Down Expand Up @@ -301,6 +301,9 @@ async function runCppcheckOnFileXML(
diagnostic.code = documentationLinkMap[e.$.id] ? {
value: e.$.id,
target: vscode.Uri.parse(documentationLinkMap[e.$.id])
} : getPremiumCertLink(e.$.id) ? {
value: e.$.id,
target: vscode.Uri.parse(getPremiumCertLink(e.$.id))
} : e.$.id;

// Related Information
Expand Down
103 changes: 102 additions & 1 deletion src/util/documentation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,107 @@ const documentationLinkMap : Record<string, string> = {
'preprocessorErrorDirective': 'https://github.com/cppcheck-opensource/cppcheck/blob/main/man/checkers/preprocessorErrorDirective.md',
'truncLongCast': 'https://github.com/cppcheck-opensource/cppcheck/blob/main/man/checkers/truncLongCast.md',
'unknownMacro': 'https://github.com/cppcheck-opensource/cppcheck/blob/main/man/checkers/unknownMacro.md',
/************
*** CERT ***
************/
// Arrays ARR30-C
'arrayIndexOutOfBounds': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/arrays-arr/arr30-c',
'outOfBounds': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/arrays-arr/arr30-c',
'negativeIndex': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/arrays-arr/arr30-c',
'arrayIndexThenCheck': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/arrays-arr/arr30-c',
'arrayIndexOutOfBoundsCond': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/arrays-arr/arr30-c',
'possibleBufferAccessOutOfBounds': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/arrays-arr/arr30-c',
// Arrays ARR32-C
'negativeArraySize': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/arrays-arr/arr32-c',
// Arrays ARR36-C
'comparePointers': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/arrays-arr/arr36-c',
// Declarations and Initialization DCL30-C
'danglingLifetime': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/declarations-and-initialization-dcl/dcl30-c',
'returnDanglingLifetime': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/declarations-and-initialization-dcl/dcl30-c',
'autoVariables': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/declarations-and-initialization-dcl/dcl30-c',
'invalidLifetime': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/declarations-and-initialization-dcl/dcl30-c',
// Expressions EXP30-C
'unknownEvaluationOrder': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/expressions-exp/exp30-c',
// Expressions EXP33-C
'uninitvar': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/expressions-exp/exp33-c',
'uninitdata': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/expressions-exp/exp33-c',
'uninitstring': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/expressions-exp/exp33-c',
'uninitMemberVar': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/expressions-exp/exp33-c',
'uninitStructMember': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/expressions-exp/exp33-c',
// Expressions EXP34-C
'nullPointer': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/expressions-exp/exp34-c',
'nullPointerDefaultArg': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/expressions-exp/exp34-c',
'nullPointerRedundantCheck': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/expressions-exp/exp34-c',
// Expressions EXP46-C
'bitwiseOnBoolean': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/expressions-exp/exp46-c',
// Floating Point FLP34-C
'floatConversionOverflow' : 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/floating-point-flp/flp34-c',
'suspiciousFloatingPointCast': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/floating-point-flp/flp34-c',
// Input Output FIO39-C
'IOWithoutPositioning': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/input-output-fio/fio39-c',
// Input Output FIO42-C
'resourceLeak': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/input-output-fio/fio42-c',
// Input Output FIO47-C
'invalidscanf': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/input-output-fio/fio47-c',
'wrongPrintfScanfArgNum': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/input-output-fio/fio47-c',
'invalidLengthModifierError': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/input-output-fio/fio47-c',
'invalidScanfFormatWidth': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/input-output-fio/fio47-c',
'wrongPrintfScanfParameterPositionError': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/input-output-fio/fio47-c',
// Integers INT31-C
'memsetValueOutOfRange': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/integers-int/int31-c',
// Integers INT33-C
'zerodiv': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/integers-int/int33-c',
'zerodivcond': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/integers-int/int33-c',
// Integers INT34-C
'shiftNegative': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/integers-int/int34-c',
'shiftTooManyBits': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/integers-int/int34-c',
// Memory Management MEM30-C
'doubleFree': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/memory-management-mem/mem30-c',
'deallocret': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/memory-management-mem/mem30-c',
'deallocuse': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/memory-management-mem/mem30-c',
// Memory Management MEM31-C
'memleak': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/memory-management-mem/mem31-c',
'leakReturnValNotUsed': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/memory-management-mem/mem31-c',
'leakUnsafeArgAlloc': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/memory-management-mem/mem31-c',
'memleakOnRealloc': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/memory-management-mem/mem31-c',
// Memory Management MEM34-C
'autovarInvalidDeallocation': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/memory-management-mem/mem34-c',
'mismatchAllocDealloc': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/memory-management-mem/mem34-c',
// Miscellaneous MSC37-C
'missingReturn': 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/miscellaneous-msc/msc37-c',
};

export { documentationLinkMap };
function getPremiumCertLink(errorCode: string) : string {
// error codes are expected to be on the format of i.e. premium-cert-arr37-c
if (!errorCode.includes('premium-cert-')) {
return '';
}
const basicUrl = 'https://cmu-sei.github.io/secure-coding-standards/sei-cert-c-coding-standard/rules/';
const categoryMap : Record<string, string> = {
'arr': 'arrays-arr',
'str': 'characters-and-strings-str',
'con': 'concurrency-con',
'dcl': 'declarations-and-initialization-dcl',
'env': 'environment-env',
'err': 'error-handling-err',
'exp': 'expressions-exp',
'flp': 'floating-point-flp',
'fio': 'input-output-fio',
'int': 'integers-int',
'mem': 'memory-management-mem',
'win': 'microsoft-windows-win',
'msc': 'miscellaneous-msc',
'pos': 'posix-pos',
'pre': 'preprocessor-pre',
'sig': 'signals-sig',
};
const warningLinkSuffix = errorCode.replace('premium-cert-', '');
const category = categoryMap[warningLinkSuffix.slice(0,3)];
if (!category) {
return '';
}
const premiumCertWarningLink = basicUrl + category + '/' + warningLinkSuffix;
return premiumCertWarningLink;
}

export { documentationLinkMap, getPremiumCertLink };
Loading