{"record":{"id":"4ed87c6f6470e506","repo":"abhigyanpatwari/GitNexus","slug":"taint-lang-provider-language-parts-join","errorCode":null,"errorMessage":"[taint] lang=${provider.language}: ${parts.join('; ')}","messagePattern":"\\[taint\\] lang=(.+?): (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"gitnexus/src/core/ingestion/scope-resolution/pipeline/run.ts","lineNumber":1619,"sourceCode":"        if (gapCount > 0) {\n          parts.push(\n            `${gapCount} function(s) skipped for taint ` +\n              `(${taintTotals.gapTruncated} fact-limit, ${taintTotals.gapOverflow} overflow, ` +\n              `${taintTotals.gapNoFacts} no-facts, ${taintTotals.unsafeSites} malformed sites)` +\n              (taintTotals.gapExamples.length > 0\n                ? ` — e.g. ${taintTotals.gapExamples.join(', ')}`\n                : ''),\n          );\n        }\n        if (taintTotals.dropped > 0) {\n          parts.push(\n            `${taintTotals.dropped} finding(s) dropped by the per-function cap` +\n              (taintTotals.dropExamples.length > 0\n                ? ` — e.g. ${taintTotals.dropExamples.join(', ')}`\n                : ''),\n          );\n        }\n        logger.warn(`[taint] lang=${provider.language}: ${parts.join('; ')}`);\n      }\n    }\n    // M4 (#2084 U1): summary harvest volume + anchor-resolution diagnostics.\n    if (harvestedSummaries.length > 0 || summaryUnresolved > 0) {\n      logger.debug(\n        `[taint-summary] lang=${provider.language}: ${harvestedSummaries.length} function ` +\n          `summary/summaries harvested` +\n          (summaryUnresolved > 0\n            ? `, ${summaryUnresolved} CFG anchor(s) unresolved (same-line collision or missing node)`\n            : ''),\n      );\n    }\n    // FU-C (U-C2): call-summary harvest volume + anchor-resolution diagnostics.\n    if (harvestedCallSummaries.length > 0 || callSummaryUnresolved > 0) {\n      logger.debug(\n        `[call-summary] lang=${provider.language}: ${harvestedCallSummaries.length} function ` +\n          `return-ascent summary/summaries harvested` +\n          (callSummaryUnresolved > 0","sourceCodeStart":1601,"sourceCodeEnd":1637,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/0d1aed942f0e8b5d3bac27519fff441aceea722d/gitnexus/src/core/ingestion/scope-resolution/pipeline/run.ts#L1601-L1637","documentation":"R4: after the taint pass, per-language aggregates surface coverage gaps and dropped findings unconditionally (never debug, never input.onWarn). The single warn line joins parts: how many functions had taint coverage gaps (with up to 5 example function names) and how many findings were dropped by the per-function fact cap (with examples). Solver-status gaps were already per-function-warned by the RD layer, which shares the solver and fact cap.","triggerScenarios":"Running analyze with a taint spec configured (PDG layer active) where some functions' taint solving hit coverage gaps or exceeded the per-function finding cap; taintTotals.gapExamples/dropExamples fill and parts.join('; ') forms the message.","commonSituations":"Monorepos or very large functions with many source→sink flows (taint findings in the hundreds per function), broad source/sink configurations, or codebases where the shared solver fact cap (same as the RD layer's) saturates for hot functions.","solutions":["Use gapExamples/dropExamples from the warn to find the exact functions losing findings","Split oversized functions so per-function finding counts fall under the cap — the cap is per-function, so decomposition directly restores coverage","Narrow the taint spec (fewer sources/sinks) if the volume is configuration-driven rather than code-driven","Treat remaining gaps as known-underreported when triaging explain() results for those functions"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Parse the aggregate line and gate security review on it:\nconst m = log.match(/\\[taint\\] lang=(\\w+): (.+)/);\nif (m) {\n  const gaps = m[2].match(/(\\d+) finding\\(s\\) dropped by the per-function cap — e\\.g\\. ([^;]+)/);\n  if (gaps) markFunctionsUnderreported(gaps[2].split(', '));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Split very large functions before taint review — the finding cap is per-function","Treat explain() results for warn-listed functions as a lower bound, never exhaustive","Correlate gapExamples with security-critical code first; those are exactly where under-reporting hurts"],"tags":["taint-analysis","pdg","static-analysis","coverage","caps"],"backgroundTag":"result-set-truncation","analyzedSha":"0d1aed942f0e8b5d3bac27519fff441aceea722d","analyzedAt":"2026-08-20T23:29:22.980Z","contentChangedAt":"2026-08-20T23:29:22.980Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}