sourceverity 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +91 -3
  2. package/dist/analysis/arrayBounds.d.ts +4 -0
  3. package/dist/analysis/arrayBounds.d.ts.map +1 -0
  4. package/dist/analysis/arrayBounds.js +4 -0
  5. package/dist/analysis/arrayBounds.js.map +1 -0
  6. package/dist/analysis/arrayBoundsCore.d.ts +69 -0
  7. package/dist/analysis/arrayBoundsCore.d.ts.map +1 -0
  8. package/dist/analysis/arrayBoundsCore.js +863 -0
  9. package/dist/analysis/arrayBoundsCore.js.map +1 -0
  10. package/dist/analysis/arrayConstructionBounds.d.ts +14 -0
  11. package/dist/analysis/arrayConstructionBounds.d.ts.map +1 -0
  12. package/dist/analysis/arrayConstructionBounds.js +445 -0
  13. package/dist/analysis/arrayConstructionBounds.js.map +1 -0
  14. package/dist/analysis/arrayIterationBounds.d.ts +12 -0
  15. package/dist/analysis/arrayIterationBounds.d.ts.map +1 -0
  16. package/dist/analysis/arrayIterationBounds.js +578 -0
  17. package/dist/analysis/arrayIterationBounds.js.map +1 -0
  18. package/dist/analysis/{controlFlow.d.ts → controlFlowGuards.d.ts} +1 -9
  19. package/dist/analysis/controlFlowGuards.d.ts.map +1 -0
  20. package/dist/analysis/controlFlowGuards.js +119 -0
  21. package/dist/analysis/controlFlowGuards.js.map +1 -0
  22. package/dist/analysis/controlFlowTypes.d.ts +5 -0
  23. package/dist/analysis/controlFlowTypes.d.ts.map +1 -0
  24. package/dist/analysis/controlFlowTypes.js +2 -0
  25. package/dist/analysis/controlFlowTypes.js.map +1 -0
  26. package/dist/analysis/frameworks.d.ts.map +1 -1
  27. package/dist/analysis/frameworks.js +11 -23
  28. package/dist/analysis/frameworks.js.map +1 -1
  29. package/dist/analysis/functions.d.ts.map +1 -1
  30. package/dist/analysis/functions.js +70 -30
  31. package/dist/analysis/functions.js.map +1 -1
  32. package/dist/analysis/nonNullGuards.d.ts +7 -0
  33. package/dist/analysis/nonNullGuards.d.ts.map +1 -0
  34. package/dist/analysis/nonNullGuards.js +340 -0
  35. package/dist/analysis/nonNullGuards.js.map +1 -0
  36. package/dist/analysis/reactStateBounds.d.ts +8 -0
  37. package/dist/analysis/reactStateBounds.d.ts.map +1 -0
  38. package/dist/analysis/reactStateBounds.js +390 -0
  39. package/dist/analysis/reactStateBounds.js.map +1 -0
  40. package/dist/cli/help.js +1 -1
  41. package/dist/cli/main.d.ts.map +1 -1
  42. package/dist/cli/main.js +22 -1
  43. package/dist/cli/main.js.map +1 -1
  44. package/dist/core/config.d.ts +7 -0
  45. package/dist/core/config.d.ts.map +1 -0
  46. package/dist/core/config.js +42 -0
  47. package/dist/core/config.js.map +1 -0
  48. package/dist/engine/runner.js +1 -1
  49. package/dist/engine/runner.js.map +1 -1
  50. package/dist/engine/symbols.d.ts +0 -1
  51. package/dist/engine/symbols.d.ts.map +1 -1
  52. package/dist/engine/symbols.js +2 -12
  53. package/dist/engine/symbols.js.map +1 -1
  54. package/dist/repository/detector.d.ts.map +1 -1
  55. package/dist/repository/detector.js +31 -11
  56. package/dist/repository/detector.js.map +1 -1
  57. package/dist/rules/async/floatingPromise.d.ts.map +1 -1
  58. package/dist/rules/async/floatingPromise.js +20 -0
  59. package/dist/rules/async/floatingPromise.js.map +1 -1
  60. package/dist/rules/network/fetchStatusUnchecked.js +1 -1
  61. package/dist/rules/network/fetchStatusUnchecked.js.map +1 -1
  62. package/dist/rules/react/derivedStateEffect.d.ts.map +1 -1
  63. package/dist/rules/react/derivedStateEffect.js +60 -5
  64. package/dist/rules/react/derivedStateEffect.js.map +1 -1
  65. package/dist/rules/typescript/nonNullAssertionRisk.js +1 -1
  66. package/dist/rules/typescript/nonNullAssertionRisk.js.map +1 -1
  67. package/package.json +1 -1
  68. package/dist/analysis/controlFlow.d.ts.map +0 -1
  69. package/dist/analysis/controlFlow.js +0 -2592
  70. package/dist/analysis/controlFlow.js.map +0 -1
@@ -0,0 +1,340 @@
1
+ import { isCompleteBoundsExitGuard, isConstructedArrayCardinalityBoundedIndex, isFindIndexBoundedIndex, isFixedLengthGuardedIndex, isLoopOrCallbackBoundedIndex, isPositiveBoundsEntryGuard, isSearchProvenanceBoundedIndex, isStaticArrayLiteralBoundedIndex, normalizeArrayTarget, normalizeIndexExpression, } from "./arrayBounds.js";
2
+ import { hasVariableReassignment, statementExitsControlFlow, } from "./controlFlowGuards.js";
3
+ import { isReactStateBoundedIndex } from "./reactStateBounds.js";
4
+ import { unwrapExpression } from "./values.js";
5
+ function identifiersMatch(left, right, checker) {
6
+ if (!checker)
7
+ return left.text === right.text;
8
+ const leftSymbol = checker.getSymbolAtLocation(left);
9
+ const rightSymbol = checker.getSymbolAtLocation(right);
10
+ return leftSymbol && rightSymbol ? leftSymbol === rightSymbol : left.text === right.text;
11
+ }
12
+ function getConstIdentifierDeclaration(identifier, ts, checker) {
13
+ const symbol = checker?.getSymbolAtLocation(identifier);
14
+ const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];
15
+ if (!declaration || !ts.isVariableDeclaration(declaration) || !ts.isIdentifier(declaration.name)) {
16
+ return undefined;
17
+ }
18
+ const declarationList = declaration.parent;
19
+ return ts.isVariableDeclarationList(declarationList) &&
20
+ (declarationList.flags & ts.NodeFlags.Const) !== 0
21
+ ? declaration
22
+ : undefined;
23
+ }
24
+ function isNullishLiteral(node, ts) {
25
+ return (node.kind === ts.SyntaxKind.NullKeyword ||
26
+ node.kind === ts.SyntaxKind.UndefinedKeyword ||
27
+ (ts.isIdentifier(node) && node.text === "undefined"));
28
+ }
29
+ function getNullCheckedIdentifier(expression, ts) {
30
+ const condition = unwrapExpression(expression, ts);
31
+ if (!ts.isBinaryExpression(condition))
32
+ return undefined;
33
+ const operator = condition.operatorToken.kind;
34
+ if (operator !== ts.SyntaxKind.EqualsEqualsToken &&
35
+ operator !== ts.SyntaxKind.EqualsEqualsEqualsToken) {
36
+ return undefined;
37
+ }
38
+ const left = unwrapExpression(condition.left, ts);
39
+ const right = unwrapExpression(condition.right, ts);
40
+ if (ts.isIdentifier(left) && isNullishLiteral(right, ts))
41
+ return left;
42
+ if (ts.isIdentifier(right) && isNullishLiteral(left, ts))
43
+ return right;
44
+ return undefined;
45
+ }
46
+ function getConditionalNullSentinelSource(initializer, ts) {
47
+ const conditional = unwrapExpression(initializer, ts);
48
+ if (!ts.isConditionalExpression(conditional))
49
+ return undefined;
50
+ if (!isNullishLiteral(unwrapExpression(conditional.whenTrue, ts), ts))
51
+ return undefined;
52
+ return getNullCheckedIdentifier(conditional.condition, ts);
53
+ }
54
+ function isConstConditionalSentinelGuarded(operand, statements, targetIndex, ts, checker) {
55
+ if (!checker)
56
+ return false;
57
+ for (let guardIndex = 0; guardIndex < targetIndex; guardIndex++) {
58
+ const guard = statements[guardIndex];
59
+ if (!guard ||
60
+ !ts.isIfStatement(guard) ||
61
+ !statementExitsControlFlow(guard.thenStatement, ts)) {
62
+ continue;
63
+ }
64
+ const sentinel = getNullCheckedIdentifier(guard.expression, ts);
65
+ if (!sentinel)
66
+ continue;
67
+ const sentinelDeclaration = getConstIdentifierDeclaration(sentinel, ts, checker);
68
+ if (!sentinelDeclaration ||
69
+ !sentinelDeclaration.initializer ||
70
+ sentinelDeclaration.getStart() >= guard.getStart()) {
71
+ continue;
72
+ }
73
+ const source = getConditionalNullSentinelSource(sentinelDeclaration.initializer, ts);
74
+ const sourceDeclaration = source
75
+ ? getConstIdentifierDeclaration(source, ts, checker)
76
+ : undefined;
77
+ if (source &&
78
+ sourceDeclaration &&
79
+ sourceDeclaration.getStart() < sentinelDeclaration.getStart() &&
80
+ identifiersMatch(source, operand, checker)) {
81
+ return true;
82
+ }
83
+ }
84
+ return false;
85
+ }
86
+ function isConstConditionalSentinelGuardedInAncestorScopes(node, operand, ts, checker) {
87
+ let child = node;
88
+ while (child.parent) {
89
+ const parent = child.parent;
90
+ if (ts.isBlock(parent) || ts.isSourceFile(parent)) {
91
+ let statement = child;
92
+ while (statement.parent && statement.parent !== parent) {
93
+ statement = statement.parent;
94
+ }
95
+ const statementIndex = parent.statements.indexOf(statement);
96
+ if (statementIndex > 0 &&
97
+ isConstConditionalSentinelGuarded(operand, parent.statements, statementIndex, ts, checker)) {
98
+ return true;
99
+ }
100
+ if (parent.parent &&
101
+ (ts.isFunctionDeclaration(parent.parent) ||
102
+ ts.isFunctionExpression(parent.parent) ||
103
+ ts.isArrowFunction(parent.parent) ||
104
+ ts.isMethodDeclaration(parent.parent))) {
105
+ return false;
106
+ }
107
+ }
108
+ child = parent;
109
+ }
110
+ return false;
111
+ }
112
+ /**
113
+ * Checks if a non-null assertion operand is guarded against null/undefined or out-of-bounds access.
114
+ */
115
+ export function isGuardedNonNullAssertion(node, ts, checker) {
116
+ const operand = unwrapExpression(node.expression, ts);
117
+ // Case 1: Indexed access non-null assertion: `array[index]!`
118
+ if (ts.isElementAccessExpression(operand)) {
119
+ // 1a. Check static array literal bounded index: e.g. tiers[0]! or colW[2]!
120
+ const staticLiteralCheck = isStaticArrayLiteralBoundedIndex(operand, ts, checker);
121
+ if (staticLiteralCheck?.isGuarded) {
122
+ return staticLiteralCheck;
123
+ }
124
+ // 1b. Check fixed-length equality or comparison guards: e.g. if (sliceArgs.length === 2) sliceArgs[0]!
125
+ const fixedLengthCheck = isFixedLengthGuardedIndex(node, operand, ts, checker);
126
+ if (fixedLengthCheck?.isGuarded) {
127
+ return fixedLengthCheck;
128
+ }
129
+ // 1c. Check constructed array cardinality: e.g. amplitudes[numLayers]! or coeffs[0]!
130
+ const cardinalityCheck = isConstructedArrayCardinalityBoundedIndex(node, operand, ts, checker);
131
+ if (cardinalityCheck?.isGuarded) {
132
+ return cardinalityCheck;
133
+ }
134
+ // 1d. Check loop or callback bounds: e.g. for (let i = 0; i < arr.length; i++) arr[i]!
135
+ const loopCheck = isLoopOrCallbackBoundedIndex(node, operand, ts, checker);
136
+ if (loopCheck?.isGuarded) {
137
+ return loopCheck;
138
+ }
139
+ // 1d. Check React state bounds: e.g. STEPS[step]! with constrained setStep transitions
140
+ const reactStateCheck = isReactStateBoundedIndex(operand, ts, checker);
141
+ if (reactStateCheck?.isGuarded) {
142
+ return reactStateCheck;
143
+ }
144
+ // 1e. Check search provenance: e.g. copy[victimIdx]!
145
+ const provenanceCheck = isSearchProvenanceBoundedIndex(node, operand, ts, checker);
146
+ if (provenanceCheck?.isGuarded) {
147
+ return provenanceCheck;
148
+ }
149
+ // 1f. Check findIndex contract: e.g. const i = arr.findIndex(...); if (i !== -1) arr[i]!
150
+ const findIndexCheck = isFindIndexBoundedIndex(node, operand, ts, checker);
151
+ if (findIndexCheck?.isGuarded) {
152
+ return findIndexCheck;
153
+ }
154
+ // 1g. Dominating statement-level bounds exit check: if (index < 0 || index >= array.length) return;
155
+ const arrayInfo = normalizeArrayTarget(operand.expression, ts, checker);
156
+ const indexInfo = normalizeIndexExpression(operand.argumentExpression, ts, checker);
157
+ if (arrayInfo && indexInfo) {
158
+ let walk = node;
159
+ while (walk.parent &&
160
+ !ts.isFunctionDeclaration(walk.parent) &&
161
+ !ts.isFunctionExpression(walk.parent) &&
162
+ !ts.isArrowFunction(walk.parent) &&
163
+ !ts.isSourceFile(walk.parent)) {
164
+ if (ts.isIfStatement(walk.parent)) {
165
+ if (walk.parent.thenStatement === walk ||
166
+ (ts.isBlock(walk.parent.thenStatement) &&
167
+ walk.parent.thenStatement.statements.includes(walk))) {
168
+ if (isPositiveBoundsEntryGuard(walk.parent.expression, indexInfo, arrayInfo, ts)) {
169
+ return {
170
+ isGuarded: true,
171
+ evidence: `Enclosing guard '${walk.parent.expression.getText()}' proves index '${indexInfo.baseText}${indexInfo.offset ? ` + ${indexInfo.offset}` : ""}' is strictly in-bounds for '${arrayInfo.text}'.`,
172
+ };
173
+ }
174
+ }
175
+ }
176
+ walk = walk.parent;
177
+ }
178
+ let stmt = node;
179
+ while (stmt.parent && !ts.isBlock(stmt.parent) && !ts.isSourceFile(stmt.parent)) {
180
+ stmt = stmt.parent;
181
+ }
182
+ if (stmt.parent && (ts.isBlock(stmt.parent) || ts.isSourceFile(stmt.parent))) {
183
+ const statements = stmt.parent.statements;
184
+ const targetIndex = statements.indexOf(stmt);
185
+ if (targetIndex > 0) {
186
+ for (let i = 0; i < targetIndex; i++) {
187
+ const prior = statements[i];
188
+ if (!prior)
189
+ continue;
190
+ if (ts.isIfStatement(prior)) {
191
+ if (statementExitsControlFlow(prior.thenStatement, ts)) {
192
+ if (isCompleteBoundsExitGuard(prior.expression, indexInfo, arrayInfo, ts)) {
193
+ return {
194
+ isGuarded: true,
195
+ evidence: `Dominating guard '${prior.expression.getText()}' proves index '${indexInfo.baseText}${indexInfo.offset ? ` + ${indexInfo.offset}` : ""}' is strictly in-bounds for '${arrayInfo.text}'.`,
196
+ };
197
+ }
198
+ }
199
+ }
200
+ }
201
+ }
202
+ }
203
+ }
204
+ }
205
+ // Case 2: Direct variable / identifier non-null assertion: `target!`
206
+ if (ts.isIdentifier(operand)) {
207
+ const targetName = operand.text;
208
+ const targetSymbol = checker?.getSymbolAtLocation(operand);
209
+ let resolvedTargetSymbol = targetSymbol;
210
+ if (resolvedTargetSymbol && (resolvedTargetSymbol.flags & ts.SymbolFlags.Alias) !== 0) {
211
+ try {
212
+ resolvedTargetSymbol = checker?.getAliasedSymbol(resolvedTargetSymbol);
213
+ }
214
+ catch {
215
+ // ignore
216
+ }
217
+ }
218
+ if (isConstConditionalSentinelGuardedInAncestorScopes(node, operand, ts, checker)) {
219
+ return {
220
+ isGuarded: true,
221
+ evidence: "A const conditional sentinel is null exactly when the asserted operand is null, and its null guard exits control flow.",
222
+ };
223
+ }
224
+ let stmt = node;
225
+ while (stmt.parent && !ts.isBlock(stmt.parent) && !ts.isSourceFile(stmt.parent)) {
226
+ stmt = stmt.parent;
227
+ }
228
+ if (stmt.parent && (ts.isBlock(stmt.parent) || ts.isSourceFile(stmt.parent))) {
229
+ const statements = ts.isBlock(stmt.parent) ? stmt.parent.statements : stmt.parent.statements;
230
+ const targetIndex = statements.indexOf(stmt);
231
+ if (targetIndex > 0) {
232
+ if (isConstConditionalSentinelGuarded(operand, statements, targetIndex, ts, checker)) {
233
+ return {
234
+ isGuarded: true,
235
+ evidence: "A const conditional sentinel is null exactly when the asserted operand is null, and its null guard exits control flow.",
236
+ };
237
+ }
238
+ for (let i = 0; i < targetIndex; i++) {
239
+ const prior = statements[i];
240
+ if (!prior)
241
+ continue;
242
+ if (ts.isIfStatement(prior) && statementExitsControlFlow(prior.thenStatement, ts)) {
243
+ const cond = unwrapExpression(prior.expression, ts);
244
+ let isGuardMatched = false;
245
+ let evidenceStr = "";
246
+ // 1. if (!target) return;
247
+ if (ts.isPrefixUnaryExpression(cond) && cond.operator === ts.SyntaxKind.ExclamationToken) {
248
+ const inner = unwrapExpression(cond.operand, ts);
249
+ if (ts.isIdentifier(inner)) {
250
+ const innerSym = checker?.getSymbolAtLocation(inner);
251
+ let resolvedInnerSym = innerSym;
252
+ if (resolvedInnerSym && (resolvedInnerSym.flags & ts.SymbolFlags.Alias) !== 0) {
253
+ try {
254
+ resolvedInnerSym = checker?.getAliasedSymbol(resolvedInnerSym);
255
+ }
256
+ catch {
257
+ // ignore
258
+ }
259
+ }
260
+ const matchesSymbol = resolvedTargetSymbol && resolvedInnerSym
261
+ ? resolvedInnerSym === resolvedTargetSymbol
262
+ : inner.text === targetName;
263
+ if (matchesSymbol) {
264
+ isGuardMatched = true;
265
+ evidenceStr = `Dominating guard '!${targetName}' proves operand is non-null.`;
266
+ }
267
+ }
268
+ }
269
+ // 2. if (target === null || target === undefined || target == null) return;
270
+ if (!isGuardMatched && ts.isBinaryExpression(cond)) {
271
+ const left = unwrapExpression(cond.left, ts);
272
+ const right = unwrapExpression(cond.right, ts);
273
+ const op = cond.operatorToken.kind;
274
+ if (op === ts.SyntaxKind.EqualsEqualsEqualsToken ||
275
+ op === ts.SyntaxKind.EqualsEqualsToken) {
276
+ let targetSide;
277
+ let nullSide;
278
+ if (ts.isIdentifier(left)) {
279
+ targetSide = left;
280
+ nullSide = right;
281
+ }
282
+ else if (ts.isIdentifier(right)) {
283
+ targetSide = right;
284
+ nullSide = left;
285
+ }
286
+ if (targetSide && nullSide) {
287
+ const innerSym = checker?.getSymbolAtLocation(targetSide);
288
+ let resolvedInnerSym = innerSym;
289
+ if (resolvedInnerSym && (resolvedInnerSym.flags & ts.SymbolFlags.Alias) !== 0) {
290
+ try {
291
+ resolvedInnerSym = checker?.getAliasedSymbol(resolvedInnerSym);
292
+ }
293
+ catch {
294
+ // ignore
295
+ }
296
+ }
297
+ const matchesSymbol = resolvedTargetSymbol && resolvedInnerSym
298
+ ? resolvedInnerSym === resolvedTargetSymbol
299
+ : targetSide.text === targetName;
300
+ if (matchesSymbol &&
301
+ (nullSide.kind === ts.SyntaxKind.NullKeyword ||
302
+ nullSide.kind === ts.SyntaxKind.UndefinedKeyword ||
303
+ (ts.isIdentifier(nullSide) && nullSide.text === "undefined"))) {
304
+ isGuardMatched = true;
305
+ evidenceStr = `Dominating null check proves '${targetName}' is non-null.`;
306
+ }
307
+ }
308
+ }
309
+ }
310
+ if (isGuardMatched) {
311
+ // Invalidation check: verify target was NOT reassigned between guard and assertion!
312
+ let isReassigned = false;
313
+ for (let j = i + 1; j < targetIndex; j++) {
314
+ const s = statements[j];
315
+ if (s && hasVariableReassignment(s, targetName, resolvedTargetSymbol, ts, checker)) {
316
+ isReassigned = true;
317
+ break;
318
+ }
319
+ }
320
+ if (!isReassigned) {
321
+ const currentStmt = statements[targetIndex];
322
+ if (currentStmt && hasVariableReassignment(currentStmt, targetName, resolvedTargetSymbol, ts, checker, node.pos)) {
323
+ isReassigned = true;
324
+ }
325
+ }
326
+ if (!isReassigned) {
327
+ return {
328
+ isGuarded: true,
329
+ evidence: evidenceStr,
330
+ };
331
+ }
332
+ }
333
+ }
334
+ }
335
+ }
336
+ }
337
+ }
338
+ return { isGuarded: false };
339
+ }
340
+ //# sourceMappingURL=nonNullGuards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonNullGuards.js","sourceRoot":"","sources":["../../src/analysis/nonNullGuards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type * as tsType from "typescript";
2
+ import type { GuardCheckResult } from "./controlFlowTypes.js";
3
+ /**
4
+ * Checks if a React state variable indexing a static const array is provably bounded by verified state transitions.
5
+ */
6
+ declare function isReactStateBoundedIndex(operand: tsType.ElementAccessExpression, ts: typeof tsType, checker?: tsType.TypeChecker | undefined): GuardCheckResult | undefined;
7
+ export { isReactStateBoundedIndex };
8
+ //# sourceMappingURL=reactStateBounds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactStateBounds.d.ts","sourceRoot":"","sources":["../../src/analysis/reactStateBounds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,YAAY,CAAC;AAQ1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AA2D9D;;GAEG;AACH,iBAAS,wBAAwB,CAC/B,OAAO,EAAE,MAAM,CAAC,uBAAuB,EACvC,EAAE,EAAE,OAAO,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,GACvC,gBAAgB,GAAG,SAAS,CA2X9B;AAED,OAAO,EAAE,wBAAwB,EAAE,CAAC"}