circle-ir 3.16.4 → 3.16.7
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.
- package/README.md +3 -0
- package/dist/analysis/passes/n-plus-one-pass.js +30 -1
- package/dist/analysis/passes/n-plus-one-pass.js.map +1 -1
- package/dist/analysis/passes/naming-convention-pass.js +3 -0
- package/dist/analysis/passes/naming-convention-pass.js.map +1 -1
- package/dist/analysis/passes/redundant-loop-pass.js +8 -2
- package/dist/analysis/passes/redundant-loop-pass.js.map +1 -1
- package/dist/analysis/passes/unbounded-collection-pass.js +13 -0
- package/dist/analysis/passes/unbounded-collection-pass.js.map +1 -1
- package/dist/analysis/passes/unhandled-exception-pass.js +87 -0
- package/dist/analysis/passes/unhandled-exception-pass.js.map +1 -1
- package/dist/browser/circle-ir.js +92 -3
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# circle-ir
|
|
2
2
|
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+
|
|
3
6
|
A high-performance Static Application Security Testing (SAST) library for detecting security vulnerabilities through taint analysis, and code quality findings through an extensible 36-pass analysis pipeline. Works in Node.js and browsers.
|
|
4
7
|
|
|
5
8
|
## Features
|
|
@@ -56,11 +56,40 @@ const MEDIUM_CONFIDENCE_DB_METHODS = new Set([
|
|
|
56
56
|
* This catches both `dbConnection.query()` and `userRepository.find()`.
|
|
57
57
|
*/
|
|
58
58
|
const DB_OR_HTTP_RECEIVER_PREFIX = /^(db|conn|connection|pool|client|repo|repository|orm|em|entityManager|sequelize|mongoose|prisma|axios|http|https|api|svc|service|dao|store|cache|gql|graphql|mongo|redis|sql|pg|mysql|sqlite|dynamo|cosmos|elastic|es|solr|neo4j|cassandra|couchbase|firestore|supabase|drizzle|knex|typeorm|mikro)/i;
|
|
59
|
-
const DB_OR_HTTP_RECEIVER_SUFFIX = /(?:Repository|Repo|Dao|DataSource|DbContext|Client|Service|Store|Cache|Gateway|Adapter|Provider|Manager|Handler|Proxy|Facade|Connection|Pool|Session|Template|Mapper|Access|Query|Command|Storage|Bucket|Table|Collection
|
|
59
|
+
const DB_OR_HTTP_RECEIVER_SUFFIX = /(?:Repository|Repo|Dao|DataSource|DbContext|Client|Service|Store|Cache|Gateway|Adapter|Provider|Manager|Handler|Proxy|Facade|Connection|Pool|Session|Template|Mapper|Access|Query|Command|Storage|Bucket|Table|Collection)$/;
|
|
60
|
+
/**
|
|
61
|
+
* Receiver name patterns that indicate a built-in in-memory collection
|
|
62
|
+
* (`Map`, `WeakMap`, plain object used as a hash) rather than a DB/HTTP
|
|
63
|
+
* client. These are common in algorithm implementations where `.get()`,
|
|
64
|
+
* `.has()`, `.set()` are called inside loops without any I/O.
|
|
65
|
+
*
|
|
66
|
+
* Examples: `rpoIndex`, `nodeMap`, `idomLookup`, `byIdDict`, `nodesById`.
|
|
67
|
+
*
|
|
68
|
+
* Note: `Set`, `Cache`, `Store` are intentionally NOT here because they may
|
|
69
|
+
* legitimately refer to remote stores (`redisCache`, `sessionStore`,
|
|
70
|
+
* `resultSet`).
|
|
71
|
+
*/
|
|
72
|
+
const IN_MEMORY_COLLECTION_RECEIVER = /(?:Index|Map|Lookup|Dict|ById|ByName|ByKey|ByType|ByPath|ByFile|ByLine)$/;
|
|
73
|
+
/**
|
|
74
|
+
* Names of built-in in-memory collections commonly used as bare-word
|
|
75
|
+
* receivers in algorithm code (e.g. `idom.get(node)`, `seen.has(x)`).
|
|
76
|
+
*/
|
|
77
|
+
const IN_MEMORY_COLLECTION_NAMES = new Set([
|
|
78
|
+
'map', 'set', 'dict', 'lookup', 'index', 'cache', 'seen', 'visited',
|
|
79
|
+
'idom', 'memo', 'registry',
|
|
80
|
+
]);
|
|
60
81
|
/**
|
|
61
82
|
* Check if a receiver name indicates a DB or HTTP client.
|
|
83
|
+
*
|
|
84
|
+
* Returns false for in-memory collection patterns (`*Index`, `*Map`, etc.)
|
|
85
|
+
* even if they would otherwise match a DB suffix, to avoid false positives
|
|
86
|
+
* on JavaScript `Map` / `Set` `.get()` calls inside loops.
|
|
62
87
|
*/
|
|
63
88
|
function isDbOrHttpReceiver(receiver) {
|
|
89
|
+
if (IN_MEMORY_COLLECTION_RECEIVER.test(receiver))
|
|
90
|
+
return false;
|
|
91
|
+
if (IN_MEMORY_COLLECTION_NAMES.has(receiver.toLowerCase()))
|
|
92
|
+
return false;
|
|
64
93
|
return DB_OR_HTTP_RECEIVER_PREFIX.test(receiver) || DB_OR_HTTP_RECEIVER_SUFFIX.test(receiver);
|
|
65
94
|
}
|
|
66
95
|
function isDbOrApiCall(call) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"n-plus-one-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/n-plus-one-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH;;;GAGG;AACH,MAAM,0BAA0B,GAAwB,IAAI,GAAG,CAAC;IAC9D,iBAAiB;IACjB,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa;IAClE,oBAAoB;IACpB,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY;IAC5D,WAAW;IACX,mBAAmB,EAAE,mBAAmB;IACxC,kBAAkB,EAAE,kBAAkB;IACtC,gBAAgB,EAAE,WAAW,EAAE,UAAU;IACzC,YAAY;IACZ,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY;IACzD,SAAS;IACT,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY;IAC/E,UAAU;IACV,OAAO;CACR,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,4BAA4B,GAAwB,IAAI,GAAG,CAAC;IAChE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS;IACrC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;IAClE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS;IACxC,MAAM,EAAE,QAAQ;CACjB,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,0BAA0B,GAAG,sSAAsS,CAAC;AAE1U,MAAM,0BAA0B,GAAG,
|
|
1
|
+
{"version":3,"file":"n-plus-one-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/n-plus-one-pass.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,9 @@ function shouldSkipName(name) {
|
|
|
54
54
|
return true;
|
|
55
55
|
if (GENERIC_NAMES.has(name))
|
|
56
56
|
return true;
|
|
57
|
+
// Skip synthetic/internal names generated by the parser (e.g., <module>, <anonymous>)
|
|
58
|
+
if (name.startsWith('<') || name.endsWith('>'))
|
|
59
|
+
return true;
|
|
57
60
|
return false;
|
|
58
61
|
}
|
|
59
62
|
export class NamingConventionPass {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming-convention-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/naming-convention-pass.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"naming-convention-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/naming-convention-pass.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,10 @@
|
|
|
16
16
|
* Languages: JavaScript/TypeScript, Java, Python, Rust. Bash — skipped.
|
|
17
17
|
*/
|
|
18
18
|
// Match: varName.length or varName.size() or varName.count()
|
|
19
|
+
// Note: for JS/TS, `.length` is an O(1) property access, not a method call.
|
|
20
|
+
// Use LENGTH_PATTERN_METHODS for JS/TS (excludes `.length`).
|
|
19
21
|
const LENGTH_PATTERN = /\b([A-Za-z_$][A-Za-z0-9_$]*)\s*\.\s*(?:length|size\(\)|count\(\))/g;
|
|
22
|
+
const LENGTH_PATTERN_METHODS = /\b([A-Za-z_$][A-Za-z0-9_$]*)\s*\.\s*(?:size\(\)|count\(\))/g;
|
|
20
23
|
// Match: Object.keys(varName) Object.values(varName) Object.entries(varName)
|
|
21
24
|
const OBJECT_STATIC_PATTERN = /\bObject\s*\.\s*(?:keys|values|entries)\s*\(\s*([A-Za-z_$][A-Za-z0-9_$]*)\s*\)/g;
|
|
22
25
|
// Match: Math.sqrt(varName) Math.pow(varName Math.abs(varName) Math.floor(varName) Math.ceil(varName)
|
|
@@ -52,9 +55,12 @@ export class RedundantLoopPass {
|
|
|
52
55
|
if (lineText.trim() === '')
|
|
53
56
|
continue;
|
|
54
57
|
// --- .length / .size() / .count() ---
|
|
55
|
-
|
|
58
|
+
// For JS/TS, `.length` is an O(1) property access — only flag method calls
|
|
59
|
+
const lengthRe = (language === 'javascript' || language === 'typescript')
|
|
60
|
+
? LENGTH_PATTERN_METHODS : LENGTH_PATTERN;
|
|
61
|
+
lengthRe.lastIndex = 0;
|
|
56
62
|
let m;
|
|
57
|
-
while ((m =
|
|
63
|
+
while ((m = lengthRe.exec(lineText)) !== null) {
|
|
58
64
|
const varName = m[1];
|
|
59
65
|
if (modifiedVars.has(varName))
|
|
60
66
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redundant-loop-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/redundant-loop-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,kEAAkE;AAClE,MAAM,cAAc,GAAG,oEAAoE,CAAC;
|
|
1
|
+
{"version":3,"file":"redundant-loop-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/redundant-loop-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,kEAAkE;AAClE,4EAA4E;AAC5E,6DAA6D;AAC7D,MAAM,cAAc,GAAG,oEAAoE,CAAC;AAC5F,MAAM,sBAAsB,GAAG,6DAA6D,CAAC;AAE7F,gFAAgF;AAChF,MAAM,qBAAqB,GACzB,iFAAiF,CAAC;AAEpF,2GAA2G;AAC3G,MAAM,YAAY,GAChB,0GAA0G,CAAC;AAM7G,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,4BAA4B,CAAC;IACpC,QAAQ,GAAG,aAAsB,CAAC;IAE3C,GAAG,CAAC,GAAgB;QAClB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;QAEtC,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QAEjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAElD,MAAM,UAAU,GAAsC,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC,CAAC,iCAAiC;QAErE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;YAEtC,4DAA4D;YAC5D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;YACvC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACpC,IAAI,GAAG,CAAC,IAAI,IAAI,UAAU,IAAI,GAAG,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;oBACnD,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YAED,yDAAyD;YACzD,KAAK,IAAI,EAAE,GAAG,UAAU,EAAE,EAAE,IAAI,QAAQ,IAAI,EAAE,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;gBACzE,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEzC,mBAAmB;gBACnB,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;oBAAE,SAAS;gBAErC,uCAAuC;gBACvC,2EAA2E;gBAC3E,MAAM,QAAQ,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,YAAY,CAAC;oBACvE,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC5C,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAyB,CAAC;gBAC9B,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC9C,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrB,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;wBAAE,SAAS;oBACxC,8FAA8F;oBAC9F,8EAA8E;oBAC9E,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClB,MAAM,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;oBAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAElB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,UAAU,CAAC;wBACb,EAAE,EAAE,8BAA8B,IAAI,IAAI,EAAE,EAAE;wBAC9C,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,OAAO,EAAE,IAAI,CAAC,IAAI;wBAClB,GAAG,EAAE,UAAU;wBACf,QAAQ,EAAE,KAAK;wBACf,KAAK,EAAE,MAAM;wBACb,OAAO,EACL,iCAAiC,IAAI,yDAAyD;wBAChG,IAAI;wBACJ,IAAI,EAAE,EAAE;wBACR,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE;wBACxB,GAAG,EAAE,aAAa,IAAI,0DAA0D;wBAChF,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE;qBAC5E,CAAC,CAAC;gBACL,CAAC;gBAED,wCAAwC;gBACxC,qBAAqB,CAAC,SAAS,GAAG,CAAC,CAAC;gBACpC,OAAO,CAAC,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC3D,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrB,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;wBAAE,SAAS;oBACxC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClB,MAAM,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;oBAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAElB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,UAAU,CAAC;wBACb,EAAE,EAAE,8BAA8B,IAAI,IAAI,EAAE,MAAM;wBAClD,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,OAAO,EAAE,IAAI,CAAC,IAAI;wBAClB,GAAG,EAAE,UAAU;wBACf,QAAQ,EAAE,KAAK;wBACf,KAAK,EAAE,MAAM;wBACb,OAAO,EACL,iCAAiC,IAAI,iEAAiE;wBACxG,IAAI;wBACJ,IAAI,EAAE,EAAE;wBACR,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE;wBACxB,GAAG,EAAE,aAAa,IAAI,0BAA0B;wBAChD,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE;qBAC5E,CAAC,CAAC;gBACL,CAAC;gBAED,oBAAoB;gBACpB,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC;gBAC3B,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBAClD,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrB,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;wBAAE,SAAS;oBACxC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;oBAC5C,MAAM,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;oBAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAElB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,UAAU,CAAC;wBACb,EAAE,EAAE,8BAA8B,IAAI,IAAI,EAAE,OAAO;wBACnD,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,OAAO,EAAE,IAAI,CAAC,IAAI;wBAClB,GAAG,EAAE,UAAU;wBACf,QAAQ,EAAE,KAAK;wBACf,KAAK,EAAE,MAAM;wBACb,OAAO,EACL,iCAAiC,IAAI,yDAAyD;wBAChG,IAAI;wBACJ,IAAI,EAAE,EAAE;wBACR,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE;wBACxB,GAAG,EAAE,aAAa,IAAI,0BAA0B;wBAChD,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE;qBAC5E,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -31,6 +31,14 @@ const SHRINK_METHODS = new Set([
|
|
|
31
31
|
]);
|
|
32
32
|
/** Regex: size limit guard pattern in source text. */
|
|
33
33
|
const SIZE_LIMIT_RE = /\b(?:size|length|count|len)\s*\(\)?\s*[<>]=?\s*\d|\b(?:MAX|LIMIT|CAPACITY|MAX_SIZE)\b/i;
|
|
34
|
+
/**
|
|
35
|
+
* Regex: bounded iteration patterns.
|
|
36
|
+
* These loops iterate a finite collection, so grow ops inside them are bounded.
|
|
37
|
+
* - JS/TS: `for (const x of items)`, `for (const k in obj)`, `.forEach(`, `.map(`
|
|
38
|
+
* - Python: `for x in items:`
|
|
39
|
+
* - Java: `for (Type x : items)` (enhanced for)
|
|
40
|
+
*/
|
|
41
|
+
const BOUNDED_LOOP_RE = /\bfor\s*\(.*\b(?:of|in)\b|\bfor\s+\w+\s+in\b|\bfor\s*\([^;]*:[^;]*\)|\.(?:forEach|map|flatMap|filter|reduce)\s*\(/;
|
|
34
42
|
export class UnboundedCollectionPass {
|
|
35
43
|
name = 'unbounded-collection';
|
|
36
44
|
category = 'performance';
|
|
@@ -55,6 +63,11 @@ export class UnboundedCollectionPass {
|
|
|
55
63
|
const { start_line, end_line } = loop;
|
|
56
64
|
// Collect source text for the loop body (for heuristic checks)
|
|
57
65
|
const loopSource = codeLines.slice(start_line - 1, end_line).join('\n');
|
|
66
|
+
// Skip bounded loops: for...of, for...in, forEach, enhanced for (Java)
|
|
67
|
+
// These iterate a finite collection, so grow ops are bounded by input size.
|
|
68
|
+
const loopHeader = codeLines[start_line - 1] ?? '';
|
|
69
|
+
if (BOUNDED_LOOP_RE.test(loopHeader))
|
|
70
|
+
continue;
|
|
58
71
|
// Find grow calls in the loop body
|
|
59
72
|
const growCalls = [];
|
|
60
73
|
for (const call of graph.ir.calls) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unbounded-collection-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/unbounded-collection-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,oEAAoE;AACpE,MAAM,YAAY,GAAgC;IAChD,IAAI,EAAQ,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1G,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3E,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3E,MAAM,EAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpE,IAAI,EAAQ,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;CACnE,CAAC;AAEF,gEAAgE;AAChE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY;IACxE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO;CAC/D,CAAC,CAAC;AAEH,sDAAsD;AACtD,MAAM,aAAa,GACjB,wFAAwF,CAAC;
|
|
1
|
+
{"version":3,"file":"unbounded-collection-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/unbounded-collection-pass.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,79 @@
|
|
|
23
23
|
import { ExceptionFlowGraph } from '../../graph/exception-flow-graph.js';
|
|
24
24
|
const JS_THROW_RE = /^\s*throw\s+/;
|
|
25
25
|
const PYTHON_RAISE_RE = /^\s*raise\b/;
|
|
26
|
+
// Regex to detect try/catch blocks in source (JS/TS and Python)
|
|
27
|
+
const JS_TRY_RE = /^\s*try\s*\{/;
|
|
28
|
+
const JS_CATCH_RE = /^\s*\}\s*catch\b/;
|
|
29
|
+
const PY_TRY_RE = /^\s*try\s*:/;
|
|
30
|
+
const PY_EXCEPT_RE = /^\s*except\b/;
|
|
31
|
+
/**
|
|
32
|
+
* Build try/catch covered ranges directly from source code.
|
|
33
|
+
* This supplements CFG-based ranges when the CFG builder doesn't emit
|
|
34
|
+
* exception edges for all try/catch blocks (e.g., complex control flow).
|
|
35
|
+
*
|
|
36
|
+
* For JS/TS: uses brace-depth tracking to correctly pair nested try/catch.
|
|
37
|
+
* For Python: uses indent-level matching.
|
|
38
|
+
*/
|
|
39
|
+
function buildSourceCoveredRanges(codeLines, language) {
|
|
40
|
+
if (language === 'python') {
|
|
41
|
+
return buildPythonCoveredRanges(codeLines);
|
|
42
|
+
}
|
|
43
|
+
return buildJsCoveredRanges(codeLines);
|
|
44
|
+
}
|
|
45
|
+
function buildJsCoveredRanges(codeLines) {
|
|
46
|
+
const ranges = [];
|
|
47
|
+
// Stack of try-line numbers; push on `try {`, pop on matching `} catch`
|
|
48
|
+
const tryStack = [];
|
|
49
|
+
let braceDepthAtTry = [];
|
|
50
|
+
let braceDepth = 0;
|
|
51
|
+
for (let i = 0; i < codeLines.length; i++) {
|
|
52
|
+
const line = codeLines[i];
|
|
53
|
+
// Check for try before counting braces on this line
|
|
54
|
+
if (JS_TRY_RE.test(line)) {
|
|
55
|
+
tryStack.push(i + 1);
|
|
56
|
+
// Record brace depth BEFORE the try's opening brace
|
|
57
|
+
braceDepthAtTry.push(braceDepth);
|
|
58
|
+
}
|
|
59
|
+
// Check for } catch — this closes the innermost try
|
|
60
|
+
if (JS_CATCH_RE.test(line) && tryStack.length > 0) {
|
|
61
|
+
const tryLine = tryStack.pop();
|
|
62
|
+
braceDepthAtTry.pop();
|
|
63
|
+
ranges.push({ start: tryLine, end: i }); // i is 0-based, catch line = i+1, covered = [tryLine, i]
|
|
64
|
+
}
|
|
65
|
+
// Count braces for depth tracking
|
|
66
|
+
for (const ch of line) {
|
|
67
|
+
if (ch === '{')
|
|
68
|
+
braceDepth++;
|
|
69
|
+
else if (ch === '}')
|
|
70
|
+
braceDepth--;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return ranges;
|
|
74
|
+
}
|
|
75
|
+
function buildPythonCoveredRanges(codeLines) {
|
|
76
|
+
const ranges = [];
|
|
77
|
+
const tryStack = [];
|
|
78
|
+
for (let i = 0; i < codeLines.length; i++) {
|
|
79
|
+
const line = codeLines[i];
|
|
80
|
+
if (PY_TRY_RE.test(line)) {
|
|
81
|
+
const indent = line.search(/\S/);
|
|
82
|
+
tryStack.push({ line: i + 1, indent });
|
|
83
|
+
}
|
|
84
|
+
if (PY_EXCEPT_RE.test(line) && tryStack.length > 0) {
|
|
85
|
+
const indent = line.search(/\S/);
|
|
86
|
+
// Pop the try with matching indent level
|
|
87
|
+
for (let j = tryStack.length - 1; j >= 0; j--) {
|
|
88
|
+
if (tryStack[j].indent === indent) {
|
|
89
|
+
const tryLine = tryStack[j].line;
|
|
90
|
+
tryStack.splice(j, 1);
|
|
91
|
+
ranges.push({ start: tryLine, end: i });
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return ranges;
|
|
98
|
+
}
|
|
26
99
|
export class UnhandledExceptionPass {
|
|
27
100
|
name = 'unhandled-exception';
|
|
28
101
|
category = 'reliability';
|
|
@@ -36,6 +109,8 @@ export class UnhandledExceptionPass {
|
|
|
36
109
|
const codeLines = code.split('\n');
|
|
37
110
|
const exGraph = new ExceptionFlowGraph(cfg, graph.blockById);
|
|
38
111
|
// Build covered ranges: [tryBlock.start_line, catchBlock.start_line - 1]
|
|
112
|
+
// Use both CFG-based ranges (from ExceptionFlowGraph) and source-based ranges
|
|
113
|
+
// to handle cases where the CFG builder doesn't emit exception edges for all try/catch blocks.
|
|
39
114
|
const coveredRanges = [];
|
|
40
115
|
for (const pair of exGraph.pairs) {
|
|
41
116
|
if (pair.catchBlock.start_line > pair.tryBlock.start_line) {
|
|
@@ -45,8 +120,20 @@ export class UnhandledExceptionPass {
|
|
|
45
120
|
});
|
|
46
121
|
}
|
|
47
122
|
}
|
|
123
|
+
// Supplement with source-level try/catch detection
|
|
124
|
+
for (const range of buildSourceCoveredRanges(codeLines, language)) {
|
|
125
|
+
// Only add if not already covered by a CFG-based range
|
|
126
|
+
const alreadyCovered = coveredRanges.some(r => r.start <= range.start && r.end >= range.end);
|
|
127
|
+
if (!alreadyCovered) {
|
|
128
|
+
coveredRanges.push(range);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
48
131
|
// Collect catch-block start lines (to detect re-throws)
|
|
132
|
+
// Include both CFG-based and source-based catch lines
|
|
49
133
|
const catchStarts = new Set(exGraph.pairs.map(p => p.catchBlock.start_line));
|
|
134
|
+
for (const range of coveredRanges) {
|
|
135
|
+
catchStarts.add(range.end + 1); // catch line = end of covered range + 1
|
|
136
|
+
}
|
|
50
137
|
const throwRe = language === 'python' ? PYTHON_RAISE_RE : JS_THROW_RE;
|
|
51
138
|
const unhandled = [];
|
|
52
139
|
const reportedMethods = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unhandled-exception-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/unhandled-exception-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,MAAM,eAAe,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"unhandled-exception-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/unhandled-exception-pass.ts"],"names":[],"mappings":"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"}
|
|
@@ -18974,8 +18974,24 @@ var MEDIUM_CONFIDENCE_DB_METHODS = /* @__PURE__ */ new Set([
|
|
|
18974
18974
|
"lookup"
|
|
18975
18975
|
]);
|
|
18976
18976
|
var DB_OR_HTTP_RECEIVER_PREFIX = /^(db|conn|connection|pool|client|repo|repository|orm|em|entityManager|sequelize|mongoose|prisma|axios|http|https|api|svc|service|dao|store|cache|gql|graphql|mongo|redis|sql|pg|mysql|sqlite|dynamo|cosmos|elastic|es|solr|neo4j|cassandra|couchbase|firestore|supabase|drizzle|knex|typeorm|mikro)/i;
|
|
18977
|
-
var DB_OR_HTTP_RECEIVER_SUFFIX = /(?:Repository|Repo|Dao|DataSource|DbContext|Client|Service|Store|Cache|Gateway|Adapter|Provider|Manager|Handler|Proxy|Facade|Connection|Pool|Session|Template|Mapper|Access|Query|Command|Storage|Bucket|Table|Collection
|
|
18977
|
+
var DB_OR_HTTP_RECEIVER_SUFFIX = /(?:Repository|Repo|Dao|DataSource|DbContext|Client|Service|Store|Cache|Gateway|Adapter|Provider|Manager|Handler|Proxy|Facade|Connection|Pool|Session|Template|Mapper|Access|Query|Command|Storage|Bucket|Table|Collection)$/;
|
|
18978
|
+
var IN_MEMORY_COLLECTION_RECEIVER = /(?:Index|Map|Lookup|Dict|ById|ByName|ByKey|ByType|ByPath|ByFile|ByLine)$/;
|
|
18979
|
+
var IN_MEMORY_COLLECTION_NAMES = /* @__PURE__ */ new Set([
|
|
18980
|
+
"map",
|
|
18981
|
+
"set",
|
|
18982
|
+
"dict",
|
|
18983
|
+
"lookup",
|
|
18984
|
+
"index",
|
|
18985
|
+
"cache",
|
|
18986
|
+
"seen",
|
|
18987
|
+
"visited",
|
|
18988
|
+
"idom",
|
|
18989
|
+
"memo",
|
|
18990
|
+
"registry"
|
|
18991
|
+
]);
|
|
18978
18992
|
function isDbOrHttpReceiver(receiver) {
|
|
18993
|
+
if (IN_MEMORY_COLLECTION_RECEIVER.test(receiver)) return false;
|
|
18994
|
+
if (IN_MEMORY_COLLECTION_NAMES.has(receiver.toLowerCase())) return false;
|
|
18979
18995
|
return DB_OR_HTTP_RECEIVER_PREFIX.test(receiver) || DB_OR_HTTP_RECEIVER_SUFFIX.test(receiver);
|
|
18980
18996
|
}
|
|
18981
18997
|
function isDbOrApiCall(call) {
|
|
@@ -20224,6 +20240,7 @@ var DeepInheritancePass = class {
|
|
|
20224
20240
|
|
|
20225
20241
|
// src/analysis/passes/redundant-loop-pass.ts
|
|
20226
20242
|
var LENGTH_PATTERN = /\b([A-Za-z_$][A-Za-z0-9_$]*)\s*\.\s*(?:length|size\(\)|count\(\))/g;
|
|
20243
|
+
var LENGTH_PATTERN_METHODS = /\b([A-Za-z_$][A-Za-z0-9_$]*)\s*\.\s*(?:size\(\)|count\(\))/g;
|
|
20227
20244
|
var OBJECT_STATIC_PATTERN = /\bObject\s*\.\s*(?:keys|values|entries)\s*\(\s*([A-Za-z_$][A-Za-z0-9_$]*)\s*\)/g;
|
|
20228
20245
|
var MATH_PATTERN = /\bMath\s*\.\s*(?:sqrt|pow|abs|floor|ceil|round|log|log2|log10)\s*\(\s*([A-Za-z_$][A-Za-z0-9_$]*)\s*[,)]/g;
|
|
20229
20246
|
var RedundantLoopPass = class {
|
|
@@ -20251,9 +20268,10 @@ var RedundantLoopPass = class {
|
|
|
20251
20268
|
for (let ln = start_line; ln <= end_line && ln <= codeLines.length; ln++) {
|
|
20252
20269
|
const lineText = codeLines[ln - 1] ?? "";
|
|
20253
20270
|
if (lineText.trim() === "") continue;
|
|
20254
|
-
|
|
20271
|
+
const lengthRe = language === "javascript" || language === "typescript" ? LENGTH_PATTERN_METHODS : LENGTH_PATTERN;
|
|
20272
|
+
lengthRe.lastIndex = 0;
|
|
20255
20273
|
let m;
|
|
20256
|
-
while ((m =
|
|
20274
|
+
while ((m = lengthRe.exec(lineText)) !== null) {
|
|
20257
20275
|
const varName = m[1];
|
|
20258
20276
|
if (modifiedVars.has(varName)) continue;
|
|
20259
20277
|
const expr = m[0];
|
|
@@ -20357,6 +20375,7 @@ var SHRINK_METHODS = /* @__PURE__ */ new Set([
|
|
|
20357
20375
|
"drain"
|
|
20358
20376
|
]);
|
|
20359
20377
|
var SIZE_LIMIT_RE = /\b(?:size|length|count|len)\s*\(\)?\s*[<>]=?\s*\d|\b(?:MAX|LIMIT|CAPACITY|MAX_SIZE)\b/i;
|
|
20378
|
+
var BOUNDED_LOOP_RE = /\bfor\s*\(.*\b(?:of|in)\b|\bfor\s+\w+\s+in\b|\bfor\s*\([^;]*:[^;]*\)|\.(?:forEach|map|flatMap|filter|reduce)\s*\(/;
|
|
20360
20379
|
var UnboundedCollectionPass = class {
|
|
20361
20380
|
name = "unbounded-collection";
|
|
20362
20381
|
category = "performance";
|
|
@@ -20379,6 +20398,8 @@ var UnboundedCollectionPass = class {
|
|
|
20379
20398
|
for (const loop of loops) {
|
|
20380
20399
|
const { start_line, end_line } = loop;
|
|
20381
20400
|
const loopSource = codeLines.slice(start_line - 1, end_line).join("\n");
|
|
20401
|
+
const loopHeader = codeLines[start_line - 1] ?? "";
|
|
20402
|
+
if (BOUNDED_LOOP_RE.test(loopHeader)) continue;
|
|
20382
20403
|
const growCalls = [];
|
|
20383
20404
|
for (const call of graph.ir.calls) {
|
|
20384
20405
|
const ln = call.location.line;
|
|
@@ -20752,6 +20773,62 @@ var BroadCatchPass = class {
|
|
|
20752
20773
|
// src/analysis/passes/unhandled-exception-pass.ts
|
|
20753
20774
|
var JS_THROW_RE = /^\s*throw\s+/;
|
|
20754
20775
|
var PYTHON_RAISE_RE = /^\s*raise\b/;
|
|
20776
|
+
var JS_TRY_RE = /^\s*try\s*\{/;
|
|
20777
|
+
var JS_CATCH_RE = /^\s*\}\s*catch\b/;
|
|
20778
|
+
var PY_TRY_RE = /^\s*try\s*:/;
|
|
20779
|
+
var PY_EXCEPT_RE = /^\s*except\b/;
|
|
20780
|
+
function buildSourceCoveredRanges(codeLines, language) {
|
|
20781
|
+
if (language === "python") {
|
|
20782
|
+
return buildPythonCoveredRanges(codeLines);
|
|
20783
|
+
}
|
|
20784
|
+
return buildJsCoveredRanges(codeLines);
|
|
20785
|
+
}
|
|
20786
|
+
function buildJsCoveredRanges(codeLines) {
|
|
20787
|
+
const ranges = [];
|
|
20788
|
+
const tryStack = [];
|
|
20789
|
+
let braceDepthAtTry = [];
|
|
20790
|
+
let braceDepth = 0;
|
|
20791
|
+
for (let i2 = 0; i2 < codeLines.length; i2++) {
|
|
20792
|
+
const line = codeLines[i2];
|
|
20793
|
+
if (JS_TRY_RE.test(line)) {
|
|
20794
|
+
tryStack.push(i2 + 1);
|
|
20795
|
+
braceDepthAtTry.push(braceDepth);
|
|
20796
|
+
}
|
|
20797
|
+
if (JS_CATCH_RE.test(line) && tryStack.length > 0) {
|
|
20798
|
+
const tryLine = tryStack.pop();
|
|
20799
|
+
braceDepthAtTry.pop();
|
|
20800
|
+
ranges.push({ start: tryLine, end: i2 });
|
|
20801
|
+
}
|
|
20802
|
+
for (const ch of line) {
|
|
20803
|
+
if (ch === "{") braceDepth++;
|
|
20804
|
+
else if (ch === "}") braceDepth--;
|
|
20805
|
+
}
|
|
20806
|
+
}
|
|
20807
|
+
return ranges;
|
|
20808
|
+
}
|
|
20809
|
+
function buildPythonCoveredRanges(codeLines) {
|
|
20810
|
+
const ranges = [];
|
|
20811
|
+
const tryStack = [];
|
|
20812
|
+
for (let i2 = 0; i2 < codeLines.length; i2++) {
|
|
20813
|
+
const line = codeLines[i2];
|
|
20814
|
+
if (PY_TRY_RE.test(line)) {
|
|
20815
|
+
const indent = line.search(/\S/);
|
|
20816
|
+
tryStack.push({ line: i2 + 1, indent });
|
|
20817
|
+
}
|
|
20818
|
+
if (PY_EXCEPT_RE.test(line) && tryStack.length > 0) {
|
|
20819
|
+
const indent = line.search(/\S/);
|
|
20820
|
+
for (let j = tryStack.length - 1; j >= 0; j--) {
|
|
20821
|
+
if (tryStack[j].indent === indent) {
|
|
20822
|
+
const tryLine = tryStack[j].line;
|
|
20823
|
+
tryStack.splice(j, 1);
|
|
20824
|
+
ranges.push({ start: tryLine, end: i2 });
|
|
20825
|
+
break;
|
|
20826
|
+
}
|
|
20827
|
+
}
|
|
20828
|
+
}
|
|
20829
|
+
}
|
|
20830
|
+
return ranges;
|
|
20831
|
+
}
|
|
20755
20832
|
var UnhandledExceptionPass = class {
|
|
20756
20833
|
name = "unhandled-exception";
|
|
20757
20834
|
category = "reliability";
|
|
@@ -20773,9 +20850,20 @@ var UnhandledExceptionPass = class {
|
|
|
20773
20850
|
});
|
|
20774
20851
|
}
|
|
20775
20852
|
}
|
|
20853
|
+
for (const range of buildSourceCoveredRanges(codeLines, language)) {
|
|
20854
|
+
const alreadyCovered = coveredRanges.some(
|
|
20855
|
+
(r) => r.start <= range.start && r.end >= range.end
|
|
20856
|
+
);
|
|
20857
|
+
if (!alreadyCovered) {
|
|
20858
|
+
coveredRanges.push(range);
|
|
20859
|
+
}
|
|
20860
|
+
}
|
|
20776
20861
|
const catchStarts = new Set(
|
|
20777
20862
|
exGraph.pairs.map((p) => p.catchBlock.start_line)
|
|
20778
20863
|
);
|
|
20864
|
+
for (const range of coveredRanges) {
|
|
20865
|
+
catchStarts.add(range.end + 1);
|
|
20866
|
+
}
|
|
20779
20867
|
const throwRe = language === "python" ? PYTHON_RAISE_RE : JS_THROW_RE;
|
|
20780
20868
|
const unhandled = [];
|
|
20781
20869
|
const reportedMethods = /* @__PURE__ */ new Set();
|
|
@@ -21773,6 +21861,7 @@ function shouldSkipName(name2) {
|
|
|
21773
21861
|
if (name2.startsWith("_") || name2.startsWith("$")) return true;
|
|
21774
21862
|
if (DUNDER_RE.test(name2)) return true;
|
|
21775
21863
|
if (GENERIC_NAMES.has(name2)) return true;
|
|
21864
|
+
if (name2.startsWith("<") || name2.endsWith(">")) return true;
|
|
21776
21865
|
return false;
|
|
21777
21866
|
}
|
|
21778
21867
|
var NamingConventionPass = class {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "circle-ir",
|
|
3
|
-
"version": "3.16.
|
|
3
|
+
"version": "3.16.7",
|
|
4
4
|
"description": "High-performance Static Application Security Testing (SAST) library for detecting security vulnerabilities through taint analysis",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"url": "https://github.com/sponsors/cogniumhq"
|
|
82
82
|
},
|
|
83
83
|
"engines": {
|
|
84
|
-
"node": ">=
|
|
84
|
+
"node": ">=20.0.0"
|
|
85
85
|
},
|
|
86
86
|
"type": "module",
|
|
87
87
|
"publishConfig": {
|