codeanalyzer-python 1.3.0__py3-none-any.whl → 1.4.1__py3-none-any.whl
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.
- codeanalyzer/__main__.py +7 -13
- codeanalyzer/artifacts/dependencies.py +3 -3
- codeanalyzer/artifacts/discovery.py +8 -34
- codeanalyzer/core.py +3 -4
- codeanalyzer/dataflow/builder.py +10 -2
- codeanalyzer/dataflow/identity.py +3 -3
- codeanalyzer/dataflow/sdg.py +17 -2
- codeanalyzer/dataflow/summaries.py +27 -4
- codeanalyzer/entrypoints/matching.py +36 -7
- codeanalyzer/entrypoints/pipeline.py +52 -4
- codeanalyzer/entrypoints/rules.py +12 -1
- codeanalyzer/entrypoints/rules.yml +34 -0
- codeanalyzer/neo4j/bolt.py +101 -45
- codeanalyzer/neo4j/cypher.py +10 -4
- codeanalyzer/neo4j/emit.py +3 -2
- codeanalyzer/neo4j/project.py +97 -42
- codeanalyzer/neo4j/rows.py +36 -1
- codeanalyzer/neo4j/schema.py +10 -8
- codeanalyzer/options/options.py +2 -3
- codeanalyzer/schema/ids.py +17 -0
- codeanalyzer/schema/l1_body.py +2 -0
- codeanalyzer/schema/py_schema.py +8 -3
- {codeanalyzer_python-1.3.0.dist-info → codeanalyzer_python-1.4.1.dist-info}/METADATA +33 -18
- {codeanalyzer_python-1.3.0.dist-info → codeanalyzer_python-1.4.1.dist-info}/RECORD +28 -28
- {codeanalyzer_python-1.3.0.dist-info → codeanalyzer_python-1.4.1.dist-info}/WHEEL +0 -0
- {codeanalyzer_python-1.3.0.dist-info → codeanalyzer_python-1.4.1.dist-info}/entry_points.txt +0 -0
- {codeanalyzer_python-1.3.0.dist-info → codeanalyzer_python-1.4.1.dist-info}/licenses/LICENSE +0 -0
- {codeanalyzer_python-1.3.0.dist-info → codeanalyzer_python-1.4.1.dist-info}/licenses/NOTICE +0 -0
codeanalyzer/neo4j/schema.py
CHANGED
|
@@ -57,7 +57,9 @@ class RelType:
|
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
# Labels layered onto a node in addition to its primary/specific label.
|
|
60
|
-
|
|
60
|
+
# ``PyCanNode`` (#173) rides every node keyed by a ``can://python/`` id — an index
|
|
61
|
+
# anchor for the prefix-scoped destructive statements (see ``rows.CAN_NODE``).
|
|
62
|
+
MARKER_LABELS: List[str] = ["PyCanNode"]
|
|
61
63
|
|
|
62
64
|
_SPAN = {"start_line": "integer", "end_line": "integer"}
|
|
63
65
|
|
|
@@ -75,6 +77,8 @@ NODE_LABELS: List[NodeLabel] = [
|
|
|
75
77
|
"repo_uri": "string",
|
|
76
78
|
"source_revision": "string",
|
|
77
79
|
"repo_dirty": "boolean",
|
|
80
|
+
"entrypoint_frameworks": "string[]",
|
|
81
|
+
"entrypoint_report_json": "string",
|
|
78
82
|
},
|
|
79
83
|
),
|
|
80
84
|
NodeLabel(
|
|
@@ -88,7 +92,6 @@ NODE_LABELS: List[NodeLabel] = [
|
|
|
88
92
|
"content_hash": "string",
|
|
89
93
|
"last_modified": "float",
|
|
90
94
|
"file_size": "integer",
|
|
91
|
-
"_module": "string",
|
|
92
95
|
},
|
|
93
96
|
),
|
|
94
97
|
NodeLabel(
|
|
@@ -104,7 +107,6 @@ NODE_LABELS: List[NodeLabel] = [
|
|
|
104
107
|
"decorators": "string[]",
|
|
105
108
|
"docstring": "string",
|
|
106
109
|
**_SPAN,
|
|
107
|
-
"_module": "string",
|
|
108
110
|
"is_entrypoint": "boolean",
|
|
109
111
|
"entrypoint_frameworks": "string[]",
|
|
110
112
|
},
|
|
@@ -128,7 +130,6 @@ NODE_LABELS: List[NodeLabel] = [
|
|
|
128
130
|
"modifiers": "string[]",
|
|
129
131
|
"parameters_json": "string",
|
|
130
132
|
"accessed_symbols_json": "string",
|
|
131
|
-
"_module": "string",
|
|
132
133
|
"is_entrypoint": "boolean",
|
|
133
134
|
"entrypoint_frameworks": "string[]",
|
|
134
135
|
},
|
|
@@ -157,7 +158,6 @@ NODE_LABELS: List[NodeLabel] = [
|
|
|
157
158
|
"initializer": "string",
|
|
158
159
|
"docstring": "string",
|
|
159
160
|
**_SPAN,
|
|
160
|
-
"_module": "string",
|
|
161
161
|
},
|
|
162
162
|
),
|
|
163
163
|
NodeLabel(
|
|
@@ -171,7 +171,6 @@ NODE_LABELS: List[NodeLabel] = [
|
|
|
171
171
|
"initializer": "string",
|
|
172
172
|
"scope": "string",
|
|
173
173
|
**_SPAN,
|
|
174
|
-
"_module": "string",
|
|
175
174
|
},
|
|
176
175
|
),
|
|
177
176
|
# Level-3 CPG overlay (present only at -a 3). The dataflow vocabulary is
|
|
@@ -198,7 +197,6 @@ NODE_LABELS: List[NodeLabel] = [
|
|
|
198
197
|
"is_constructor_call": "boolean",
|
|
199
198
|
"arguments_json": "string",
|
|
200
199
|
**_SPAN,
|
|
201
|
-
"_module": "string",
|
|
202
200
|
},
|
|
203
201
|
),
|
|
204
202
|
# Neutral artifact/dependency subgraph (spec 2026-08-27, Task 6). No `Py`
|
|
@@ -210,7 +208,7 @@ NODE_LABELS: List[NodeLabel] = [
|
|
|
210
208
|
NodeLabel("Artifact", "Artifact", "id", {
|
|
211
209
|
"id": "string", "path": "string", "format": "string",
|
|
212
210
|
"roles": "string[]", "size_bytes": "integer", "sha256": "string",
|
|
213
|
-
"source": "string", "
|
|
211
|
+
"source": "string", "extraction": "string",
|
|
214
212
|
}),
|
|
215
213
|
NodeLabel("Package", "Package", "id", {
|
|
216
214
|
"id": "string", "ecosystem": "string", "name": "string",
|
|
@@ -336,6 +334,10 @@ INDEXES: List[str] = [
|
|
|
336
334
|
"CREATE INDEX py_callable_name IF NOT EXISTS FOR (c:PyCallable) ON (c.name)",
|
|
337
335
|
"CREATE INDEX py_class_name IF NOT EXISTS FOR (c:PyClass) ON (c.name)",
|
|
338
336
|
"CREATE FULLTEXT INDEX py_code_fts IF NOT EXISTS FOR (c:PyCallable) ON EACH [c.code, c.docstring]",
|
|
337
|
+
# #173: every destructive statement is ``MATCH (x:PyCanNode) WHERE x.id STARTS WITH $p``.
|
|
338
|
+
# A range index on the marker makes that a prefix seek; without it, a store scan per
|
|
339
|
+
# changed module. STARTS WITH is index-backed; CONTAINS / ENDS WITH are not.
|
|
340
|
+
"CREATE INDEX py_can_node_id IF NOT EXISTS FOR (n:PyCanNode) ON (n.id)",
|
|
339
341
|
]
|
|
340
342
|
|
|
341
343
|
|
codeanalyzer/options/options.py
CHANGED
|
@@ -43,7 +43,6 @@ class AnalysisOptions:
|
|
|
43
43
|
clear_cache: bool = False
|
|
44
44
|
verbosity: int = 0
|
|
45
45
|
entrypoint_rules: Tuple[Path, ...] = ()
|
|
46
|
-
# Artifact text
|
|
47
|
-
# `source`
|
|
46
|
+
# Artifact text capture (#157 follow-up): whether to capture `source` at
|
|
47
|
+
# all. There is no byte cap -- `source` is the whole file or "" (#172).
|
|
48
48
|
artifact_text: bool = True
|
|
49
|
-
artifact_text_max_bytes: int = 262144
|
codeanalyzer/schema/ids.py
CHANGED
|
@@ -23,6 +23,23 @@ def ordinal_id(callable_id: str, tag: str) -> str:
|
|
|
23
23
|
return f"{callable_id}@{tag}"
|
|
24
24
|
|
|
25
25
|
|
|
26
|
+
def global_ordinal(callable_id: str, local_key: str) -> str:
|
|
27
|
+
"""The GLOBAL ordinal id of a body node from its LOCAL key: synthetic keys
|
|
28
|
+
(`@entry`, `@formal_in:0`) already carry the `@`; positional keys (`15:2`,
|
|
29
|
+
`15:2/actual_in:0`) get one. This is the :PyBodyNode merge key and, since
|
|
30
|
+
#176, `BodyNode.id` — the one implementation both projections share."""
|
|
31
|
+
return f"{callable_id}{local_key}" if local_key.startswith("@") else f"{callable_id}@{local_key}"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def stamp_body_ids(callable) -> None:
|
|
35
|
+
"""Stamp `id` on every body node and parameter of one callable (#176).
|
|
36
|
+
Idempotent; each body emitter calls it after writing its nodes."""
|
|
37
|
+
for key, node in callable.body.items():
|
|
38
|
+
node.id = global_ordinal(callable.id, key)
|
|
39
|
+
for i, p in enumerate(callable.parameters or []):
|
|
40
|
+
p.id = ordinal_id(callable.id, f"formal_in:{i}")
|
|
41
|
+
|
|
42
|
+
|
|
26
43
|
def artifact_id(app_name: str, rel_path: str) -> str:
|
|
27
44
|
"""Language-neutral artifact id: ``can://artifact/<app>/<rel-path>``.
|
|
28
45
|
|
codeanalyzer/schema/l1_body.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""L1 body population: materialize `call` nodes from existing call sites.
|
|
2
2
|
`callee` is left None here — the sanctioned null→id refinement happens at L2."""
|
|
3
3
|
from __future__ import annotations
|
|
4
|
+
from codeanalyzer.schema.ids import stamp_body_ids
|
|
4
5
|
from codeanalyzer.schema.py_schema import PyApplication, PyClass, PyCallable, BodyNode, Span, byte_offsets
|
|
5
6
|
|
|
6
7
|
def _do_callable(source: str, c: PyCallable) -> None:
|
|
@@ -20,6 +21,7 @@ def _do_callable(source: str, c: PyCallable) -> None:
|
|
|
20
21
|
is_constructor_call=cs.is_constructor_call,
|
|
21
22
|
arguments=list(cs.arguments or []),
|
|
22
23
|
)
|
|
24
|
+
stamp_body_ids(c)
|
|
23
25
|
for ic in (c.callables or {}).values():
|
|
24
26
|
_do_callable(source, ic)
|
|
25
27
|
for icl in (c.types or {}).values():
|
codeanalyzer/schema/py_schema.py
CHANGED
|
@@ -128,6 +128,9 @@ class BodyNode(BaseModel):
|
|
|
128
128
|
"""A node in a callable's `body`: an AST region (statement/call/branch/…) or
|
|
129
129
|
a synthetic analysis vertex (entry/exit/formal_in/out/actual_in/out)."""
|
|
130
130
|
kind: str
|
|
131
|
+
# #176: the GLOBAL ordinal id — `<callable-id>@<local>` — the same value the
|
|
132
|
+
# Neo4j projection merges :PyBodyNode on. Stamped by `ids.stamp_body_ids`.
|
|
133
|
+
id: str = ""
|
|
131
134
|
span: Optional[Span] = None
|
|
132
135
|
callee: Optional[str] = None # only on `call` nodes; the sanctioned null→id slot
|
|
133
136
|
of: Optional[str] = None # param vertices: the variable/return they carry
|
|
@@ -287,6 +290,9 @@ class PyCallableParameter(BaseModel):
|
|
|
287
290
|
"""Represents a parameter of a Python callable (function/method)."""
|
|
288
291
|
|
|
289
292
|
name: str
|
|
293
|
+
# #176: `<callable-id>@formal_in:<i>` for position i — the L4 formal_in vertex
|
|
294
|
+
# that carries this parameter. A forward reference below level 4.
|
|
295
|
+
id: str = ""
|
|
290
296
|
type: Optional[str] = None
|
|
291
297
|
default_value: Optional[str] = None
|
|
292
298
|
decorators: List[PyDecorator] = []
|
|
@@ -512,9 +518,8 @@ class PyArtifact(BaseModel):
|
|
|
512
518
|
format: str # toml|yaml|json|ini|properties|requirements|dockerfile|text|binary
|
|
513
519
|
roles: List[str] = []
|
|
514
520
|
size_bytes: int = 0
|
|
515
|
-
sha256: str = "" # always the full file's hash, even when source is
|
|
516
|
-
source: str = "" #
|
|
517
|
-
text_truncated: bool = False # True when `source` is a prefix, not the full file
|
|
521
|
+
sha256: str = "" # always the full file's hash, even when source is empty
|
|
522
|
+
source: str = "" # the WHOLE file, or "" for binary / when capture is disabled -- never a prefix
|
|
518
523
|
extraction: str = "none" # none|partial|full
|
|
519
524
|
config_keys: List[PyConfigKey] = [] # flattened config keys (#152); [] when not namespace-eligible
|
|
520
525
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: codeanalyzer-python
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.1
|
|
4
4
|
Summary: Static analysis for Python — canonical schema v2 (symbol table, call graph, and native CFG/PDG/SDG dataflow) as analysis.json or a Neo4j property graph.
|
|
5
5
|
Author-email: Rahul Krishna <i.m.ralk@gmail.com>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -99,7 +99,9 @@ needs.
|
|
|
99
99
|
**interprocedural SDG** (synthetic parameter vertices, `param_in`/`param_out`/`summary`,
|
|
100
100
|
alias-aware DDG) at level 4 — all built in-process from the stdlib `ast`.
|
|
101
101
|
- **Neo4j output** — project the analysis into a labeled property graph: a self-contained
|
|
102
|
-
`graph.cypher` snapshot, or an **incremental** push to a live database over Bolt.
|
|
102
|
+
`graph.cypher` snapshot, or an **incremental** push to a live database over Bolt. A push is
|
|
103
|
+
**additive by default** and never deletes: `--eager` is what permits it to remove declarations
|
|
104
|
+
and edges the source no longer has.
|
|
103
105
|
- **Versioned schema** — a machine-readable, version-stamped Neo4j schema contract (`--emit schema`),
|
|
104
106
|
checked in as `schema.neo4j.json` (`2.0.0`) and shipped with every release.
|
|
105
107
|
- **Incremental cache** — per-file results are cached under `.codeanalyzer`; `--lazy` (default)
|
|
@@ -300,7 +302,19 @@ $ canpy --help
|
|
|
300
302
|
│ --eager --lazy Enable eager or │
|
|
301
303
|
│ lazy analysis. │
|
|
302
304
|
│ Defaults to │
|
|
303
|
-
│ lazy.
|
|
305
|
+
│ lazy. Also gates │
|
|
306
|
+
│ every │
|
|
307
|
+
│ destructive step │
|
|
308
|
+
│ of a '--emit │
|
|
309
|
+
│ neo4j' Bolt │
|
|
310
|
+
│ push: a lazy │
|
|
311
|
+
│ push only adds │
|
|
312
|
+
│ and updates, an │
|
|
313
|
+
│ eager one also │
|
|
314
|
+
│ removes │
|
|
315
|
+
│ declarations and │
|
|
316
|
+
│ edges the source │
|
|
317
|
+
│ no longer has. │
|
|
304
318
|
│ [default: lazy] │
|
|
305
319
|
│ --skip-tests --include-tests Skip test files │
|
|
306
320
|
│ in analysis. │
|
|
@@ -361,26 +375,18 @@ $ canpy --help
|
|
|
361
375
|
│ `source` text on │
|
|
362
376
|
│ discovered │
|
|
363
377
|
│ artifacts. │
|
|
378
|
+
│ `source` is the │
|
|
379
|
+
│ whole file; │
|
|
364
380
|
│ --no-artifact-t… │
|
|
365
|
-
│ empties
|
|
381
|
+
│ empties it │
|
|
366
382
|
│ everywhere │
|
|
367
383
|
│ (inventory │
|
|
368
384
|
│ unchanged). │
|
|
369
|
-
│ [default: │
|
|
370
|
-
│ artifact-text] │
|
|
371
|
-
│ --artifact-text-… <int range> Per-file byte │
|
|
372
|
-
│ [x>=1] cap on captured │
|
|
373
|
-
│ artifact │
|
|
374
|
-
│ `source`; a │
|
|
375
|
-
│ decodable file │
|
|
376
|
-
│ over the cap is │
|
|
377
|
-
│ truncated │
|
|
378
|
-
│ (text_truncated… │
|
|
379
385
|
│ sha256/size_byt… │
|
|
380
386
|
│ always reflect │
|
|
381
387
|
│ the full file. │
|
|
382
388
|
│ [default: │
|
|
383
|
-
│
|
|
389
|
+
│ artifact-text] │
|
|
384
390
|
│ --help Show this │
|
|
385
391
|
│ message and │
|
|
386
392
|
│ exit. │
|
|
@@ -453,7 +459,7 @@ levels are cumulative and additive — `analysis.json(-a 1) ⊆ … ⊆ analysis
|
|
|
453
459
|
| **1** | `-a 1` (default) | Symbol table, Jedi call graph, and `call` nodes in each callable's `body` | `body` calls (`callee: null`) |
|
|
454
460
|
| **2** | `-a 2` | Defuse-linker call-graph enrichment; each call's `callee` backfilled to a `can://` id | `call_graph`, `body` callees |
|
|
455
461
|
| **3** | `-a 3` | Native **intraprocedural** CFG/CDG/DDG (syntactic, name-equality, `prov: ["ssa"]`) | `cfg`, `cdg`, `ddg`, `@entry`/`@exit` on each callable |
|
|
456
|
-
| **4** | `-a 4` | **Interprocedural** SDG: synthetic param vertices, alias-aware DDG (`prov: ["points-to"]`) | `param_in`, `param_out`, `summary`, semantic `ddg` |
|
|
462
|
+
| **4** | `-a 4` | **Interprocedural** SDG: synthetic param vertices, alias-aware DDG (`prov: ["points-to"]`), port-wiring DDG between statements and param vertices (`prov: ["reaching-defs"]`) | `param_in`, `param_out`, `summary`, semantic `ddg` |
|
|
457
463
|
|
|
458
464
|
`-a 1`/`-a 2` timings and output are unaffected by the heavier levels — nothing at level 3+ runs
|
|
459
465
|
unless requested. Flag gating: `--graphs sdg` requires `-a 4`; `--graphs cfg,dfg,pdg` and
|
|
@@ -475,7 +481,11 @@ symbol-table signature by construction
|
|
|
475
481
|
- **Points-to oracle (level 4):** the **Scalpel** may-alias oracle — `ScalpelAliasOracle`
|
|
476
482
|
(`codeanalyzer/dataflow/scalpel_oracle.py`) — consumes Scalpel's SSA copy/const facts to answer
|
|
477
483
|
`may_alias(path_a, path_b)`, adding the alias-aware DDG edges (`prov: ["points-to"]`) and the
|
|
478
|
-
interprocedural summaries.
|
|
484
|
+
interprocedural summaries. Level 4 also wires the statement-level DDG to the param
|
|
485
|
+
vertices (def → `actual_in`, `actual_out` → call site, `formal_in` → use, def → `formal_out`)
|
|
486
|
+
with `prov: ["reaching-defs"]`; without those the SDG would be two disconnected graphs. So
|
|
487
|
+
`prov` takes three values: `ssa` (syntactic, L3), `reaching-defs` (port wiring, L4) and
|
|
488
|
+
`points-to` (alias-derived, L4). Scalpel is **vendored** — a `typed_ast`-free slice built into the
|
|
479
489
|
package under `codeanalyzer/dataflow/scalpel/` — so it is the **default** level-4 oracle with no
|
|
480
490
|
external dependency to install; the analyzer falls back to the built-in `TypeBasedAliasOracle`
|
|
481
491
|
(Jedi-inferred types; unknown types conservatively alias) only when Scalpel can't resolve a
|
|
@@ -540,7 +550,8 @@ A **callable** (function or method) carries its own CPG, keyed by node id:
|
|
|
540
550
|
"body": { // node id → node
|
|
541
551
|
"@entry": { "kind": "entry" },
|
|
542
552
|
"6:4": { "kind": "statement", "span": { … } },
|
|
543
|
-
"6:8": { "kind": "call", "span": { … },
|
|
553
|
+
"6:8": { "id": "can://…/main()@6:8", "kind": "call", "span": { … },
|
|
554
|
+
"callee": "can://…/helper(x)" }, // callee null until L2
|
|
544
555
|
"@formal_in:0": { "kind": "formal_in", "of": "a" }, // L4 param vertices
|
|
545
556
|
"6:4/actual_in:0": { "kind": "actual_in", "of": "a", "parent": "6:4" },
|
|
546
557
|
"@exit": { "kind": "exit" }
|
|
@@ -680,6 +691,10 @@ RETURN DISTINCT c.id
|
|
|
680
691
|
MATCH (m:PyCallable {is_entrypoint: true})
|
|
681
692
|
RETURN m.id, m.entrypoint_frameworks
|
|
682
693
|
|
|
694
|
+
// did the entrypoint pass find anything? (no entrypoints vs. nothing detected)
|
|
695
|
+
MATCH (a:PyApplication)
|
|
696
|
+
RETURN a.entrypoint_frameworks, a.entrypoint_report_json
|
|
697
|
+
|
|
683
698
|
// data dependences into one statement (level 3+)
|
|
684
699
|
MATCH (s:PyBodyNode {id: $stmt})<-[d:PY_DDG]-(src:PyBodyNode)
|
|
685
700
|
RETURN src.id, d.var, d.prov
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
codeanalyzer/__init__.py,sha256=BZ3Kuwl-F_F-8H8cepLnVJ4Ku4NNUjjqg0Y6ujPQSsI,108
|
|
2
|
-
codeanalyzer/__main__.py,sha256=
|
|
3
|
-
codeanalyzer/core.py,sha256=
|
|
2
|
+
codeanalyzer/__main__.py,sha256=o5_9ct61l3T7ryIsag8bz304NabVV-el_ooGD8tnbhA,15968
|
|
3
|
+
codeanalyzer/core.py,sha256=tk_3dz81ECXXv8CEciWTIVfBAHHIfTVCsZte1GAZ080,46620
|
|
4
4
|
codeanalyzer/provenance.py,sha256=DT-DqwdVwO7g-GyK3sC0_4vDNCUjZYEY1fyYCt-7VRM,2306
|
|
5
5
|
codeanalyzer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
codeanalyzer/artifacts/__init__.py,sha256=317sEeZLS1AYsfYDYIk7tLR3AdDFwWw_cmkeZDabkJo,906
|
|
7
7
|
codeanalyzer/artifacts/config_keys.py,sha256=ovwptAErLYutlCzUwvyim2kH6-6vUKxuRcBV2KJS71Y,26843
|
|
8
8
|
codeanalyzer/artifacts/config_use.py,sha256=1-jGacW249dwF7b6DOrTFuJ7sA5Ho9khgrgZqND0nro,27173
|
|
9
9
|
codeanalyzer/artifacts/config_use_rules.yml,sha256=fNgI6IceOsj78LYmgoDH-vQ4-Mfb2ZFGKIQhLuoL4ik,1483
|
|
10
|
-
codeanalyzer/artifacts/dependencies.py,sha256=
|
|
11
|
-
codeanalyzer/artifacts/discovery.py,sha256=
|
|
10
|
+
codeanalyzer/artifacts/dependencies.py,sha256=h_-XV5KhrT-1Ytguw0c4fyI9zSFzn9Aj7kR66omvL3M,10853
|
|
11
|
+
codeanalyzer/artifacts/discovery.py,sha256=cUVRSdV82G2hVGhkRGV7u24-tEAxUBmH9nkTg24ur0Y,5968
|
|
12
12
|
codeanalyzer/artifacts/parsers.py,sha256=xOjC53tT0Mv0k7ONGwzl5XUvpBLnZlEcGmyrX5DS45k,9035
|
|
13
13
|
codeanalyzer/dataflow/__init__.py,sha256=HCNOH24rAGLUMG94N9aC-2SsAWSntk3uys7e39ipU5o,1725
|
|
14
14
|
codeanalyzer/dataflow/access_paths.py,sha256=wC8Q9qD-RZzkoFWMVvu_6uNNmYP8z48OGp9h9v3F1d4,23623
|
|
15
15
|
codeanalyzer/dataflow/alias.py,sha256=ZYKY0DiR3GHv6YJr7C001Lode9rZsk6-gxdomUyIvwg,3928
|
|
16
|
-
codeanalyzer/dataflow/builder.py,sha256=
|
|
16
|
+
codeanalyzer/dataflow/builder.py,sha256=kUjI_oBHn5H8cfcSYxj40OHxiqXX-IbxXqahNLgffyQ,32812
|
|
17
17
|
codeanalyzer/dataflow/cfg.py,sha256=u5YXJjAaDshdgv-9kWWITbBJFP-MwXKq6hbNh0fhDm8,25307
|
|
18
18
|
codeanalyzer/dataflow/defuse.py,sha256=LrX1ToOZzR79NlAGg5T647UAFkpiEqEnT7t0K5RXOiI,4377
|
|
19
19
|
codeanalyzer/dataflow/dominance.py,sha256=X7Ki1QRdVqaseYsJtiUL7m9MbcC2WHEv9b8bczSLFUA,5086
|
|
20
|
-
codeanalyzer/dataflow/identity.py,sha256=
|
|
20
|
+
codeanalyzer/dataflow/identity.py,sha256=6aAz3iPSOpoS7l_moC7XGr2RS_GqJp_FlsWGglMJDjM,3812
|
|
21
21
|
codeanalyzer/dataflow/pdg.py,sha256=1Bm7AnoRqXBryZulII2idPw0feV8eZQ1VqqprQ8PW-g,3731
|
|
22
22
|
codeanalyzer/dataflow/scalpel_oracle.py,sha256=FxRadKrTWar0VKHyQJM40n3cq25sld3Sj4lMdOm5NFk,11494
|
|
23
23
|
codeanalyzer/dataflow/scc.py,sha256=Doa_0-5f3agCu_5UmeEDlCUErg34TtniKIv8Uqd7Jiw,3493
|
|
24
|
-
codeanalyzer/dataflow/sdg.py,sha256=
|
|
24
|
+
codeanalyzer/dataflow/sdg.py,sha256=taDXkIg0BZUtDEJUjRJB_dxrFl6tKNOUdFyj0zCiso0,18533
|
|
25
25
|
codeanalyzer/dataflow/slicing.py,sha256=lWZ7jHhlR8m7rECWJQXvwfs5GNZeJY55Cud3Ji5UbNU,3654
|
|
26
|
-
codeanalyzer/dataflow/summaries.py,sha256=
|
|
26
|
+
codeanalyzer/dataflow/summaries.py,sha256=TLtc5h4bLBC4lViuMhMlEp5rp_nBpDPOl4_wfBuRUY4,9210
|
|
27
27
|
codeanalyzer/dataflow/syntactic.py,sha256=AbHyXjKX_1xkGgKH48BpXYCWBauActGUwSMF_OD-uys,1124
|
|
28
28
|
codeanalyzer/dataflow/scalpel/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
29
29
|
codeanalyzer/dataflow/scalpel/README.md,sha256=YN-LxqYYDekIdhx39AG28sg9UySMmqvLQJivTvR2Fz8,1543
|
|
@@ -38,28 +38,28 @@ codeanalyzer/dataflow/scalpel/core/func_call_visitor.py,sha256=ps0snjTchBXilhor3
|
|
|
38
38
|
codeanalyzer/dataflow/scalpel/core/vars_visitor.py,sha256=gE5fNyJS6jslD6vsMRbFLoy3n1xTwH-b54mBcNYO72M,5660
|
|
39
39
|
codeanalyzer/entrypoints/__init__.py,sha256=VaMd4mSEPLuPlRxxAve_nTJ9ZH62stXZGTPNwU_BQ50,99
|
|
40
40
|
codeanalyzer/entrypoints/detect.py,sha256=fsWRQz1njvB9d3LIJEHxsNFE1GrB7q52KCvozw_UIUQ,4594
|
|
41
|
-
codeanalyzer/entrypoints/matching.py,sha256=
|
|
42
|
-
codeanalyzer/entrypoints/pipeline.py,sha256=
|
|
43
|
-
codeanalyzer/entrypoints/rules.py,sha256=
|
|
44
|
-
codeanalyzer/entrypoints/rules.yml,sha256=
|
|
41
|
+
codeanalyzer/entrypoints/matching.py,sha256=rQeY_w2dyG36DBUjle7GLXxqDKsoMhJYPjN4s11OGtM,7948
|
|
42
|
+
codeanalyzer/entrypoints/pipeline.py,sha256=vVSdttMfSAWour2fsC3LomMtwFLzRqmJHixJS82VY1I,7828
|
|
43
|
+
codeanalyzer/entrypoints/rules.py,sha256=yG772JHmNc2L10jIpxfg1xTh-QouJa6lNU9ubo3EZYg,6003
|
|
44
|
+
codeanalyzer/entrypoints/rules.yml,sha256=sguICRfDDNGjJPfZz-JSwkI_hzbTJaau1liHV_y4rTA,4637
|
|
45
45
|
codeanalyzer/jedi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
46
|
codeanalyzer/jedi/jedi.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
47
|
codeanalyzer/neo4j/__init__.py,sha256=8Ei6uThTOqmul6GhnKoGOjLXJZbyDwF5Jo-8I8NxnAk,1574
|
|
48
|
-
codeanalyzer/neo4j/bolt.py,sha256=
|
|
49
|
-
codeanalyzer/neo4j/cypher.py,sha256=
|
|
50
|
-
codeanalyzer/neo4j/emit.py,sha256=
|
|
51
|
-
codeanalyzer/neo4j/project.py,sha256=
|
|
52
|
-
codeanalyzer/neo4j/rows.py,sha256=
|
|
53
|
-
codeanalyzer/neo4j/schema.py,sha256=
|
|
48
|
+
codeanalyzer/neo4j/bolt.py,sha256=kcBhujHuUst6s1eZD-vARDn0iuKUAxSHrN14nrsKGM8,13472
|
|
49
|
+
codeanalyzer/neo4j/cypher.py,sha256=y2AW9OUAbZJ4TVHkFpHChJU3r_K7q81tTZKt0VNve6g,5677
|
|
50
|
+
codeanalyzer/neo4j/emit.py,sha256=OBCO77TDTaNpqk9Di3JIQzBouLpHPdgoXuPSs44iJuU,3587
|
|
51
|
+
codeanalyzer/neo4j/project.py,sha256=zoLsr2XGywlZbqnwlYvlhIpgu1jmIvSMTyAgIJZkmeM,38494
|
|
52
|
+
codeanalyzer/neo4j/rows.py,sha256=PMlJEyLVIrKITkkK5TOutIzDgBuKLA1RGAkrQ1HLpZo,9579
|
|
53
|
+
codeanalyzer/neo4j/schema.py,sha256=TyT3-Tu9thfWJTuvRtZ3BAIM4kQk13uUEJ-sgr9YAdE,14716
|
|
54
54
|
codeanalyzer/options/__init__.py,sha256=6NewN0a-1HAEgKcxQjYyVn2WEDLrhax8h3WLgZddeqI,94
|
|
55
|
-
codeanalyzer/options/options.py,sha256=
|
|
55
|
+
codeanalyzer/options/options.py,sha256=2jDCcs74iSEOhz90LoRGts6PC8yV9IDPVxnLPNmonOA,1609
|
|
56
56
|
codeanalyzer/schema/__init__.py,sha256=hIyz02abUJNPW8yUgguaeKflZjTmOZWbDiKICNBD7yk,4141
|
|
57
57
|
codeanalyzer/schema/assign_ids.py,sha256=pQHluLaO5a6hFREp3vjVRsUeAfTYSJ95RXS9TZvnoys,1590
|
|
58
58
|
codeanalyzer/schema/call_graph_ids.py,sha256=mWAhJDBsW8i-siJiINOHCXEm4qM6F_5se9-HuHWIFqU,568
|
|
59
|
-
codeanalyzer/schema/ids.py,sha256=
|
|
60
|
-
codeanalyzer/schema/l1_body.py,sha256=
|
|
59
|
+
codeanalyzer/schema/ids.py,sha256=gBjpOlx4S_1JULlXoAHGommd5e81D5dwd5JSopYwdo8,2543
|
|
60
|
+
codeanalyzer/schema/l1_body.py,sha256=_sca0mTkMRb-5lasep87faGjDxZJd9jGB0hmBx3uCgk,1757
|
|
61
61
|
codeanalyzer/schema/l2_callees.py,sha256=CTcBeGoO04DstDC6h-1sHMbbIrHDEOMxP01U9VLBcfc,2327
|
|
62
|
-
codeanalyzer/schema/py_schema.py,sha256=
|
|
62
|
+
codeanalyzer/schema/py_schema.py,sha256=lbW7fIRWOdVLH0Ql0yYCYZzaS-iaACBLOuDPmXesjKs,24238
|
|
63
63
|
codeanalyzer/semantic_analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
64
64
|
codeanalyzer/semantic_analysis/call_graph.py,sha256=6YEB_wTn5-oQYLrbIhJYE0BsHl4fpWPoy5Hwd9mTnGc,11918
|
|
65
65
|
codeanalyzer/semantic_analysis/defuse_linker.py,sha256=bSn1rCun28OQqSd2NOc9aVBSm47Gt9Iul4r_gwfqO1w,64930
|
|
@@ -70,9 +70,9 @@ codeanalyzer/syntactic_analysis/symbol_table_builder.py,sha256=eTknBDlUuuQd3JEwb
|
|
|
70
70
|
codeanalyzer/utils/__init__.py,sha256=hC6VWdR5rerSqBxzu9KQHTASWqwrrYJv-CMDwrTlzkc,137
|
|
71
71
|
codeanalyzer/utils/logging.py,sha256=Fw0tattPAOMs3o0JMjjXhRVLIF64f-SCcygUXF9jqeg,904
|
|
72
72
|
codeanalyzer/utils/progress_bar.py,sha256=C9JtzVdd10lIxTv-KA6PebqjKWueC_vMGwVzAtHuHIw,2818
|
|
73
|
-
codeanalyzer_python-1.
|
|
74
|
-
codeanalyzer_python-1.
|
|
75
|
-
codeanalyzer_python-1.
|
|
76
|
-
codeanalyzer_python-1.
|
|
77
|
-
codeanalyzer_python-1.
|
|
78
|
-
codeanalyzer_python-1.
|
|
73
|
+
codeanalyzer_python-1.4.1.dist-info/METADATA,sha256=tmpHTz20bMUPMGvpJp66Guu8NtDqo-SIFso_Sk0BoHI,43485
|
|
74
|
+
codeanalyzer_python-1.4.1.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
|
|
75
|
+
codeanalyzer_python-1.4.1.dist-info/entry_points.txt,sha256=v4Vux0Nnx7sOntVk_CH7W9RX6SkIkvR1FQYq73oVlCQ,105
|
|
76
|
+
codeanalyzer_python-1.4.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
77
|
+
codeanalyzer_python-1.4.1.dist-info/licenses/NOTICE,sha256=MdVkNYqHJ20on2FmWvgD4WpMsX5mir33xdyPvTXd0A0,1223
|
|
78
|
+
codeanalyzer_python-1.4.1.dist-info/RECORD,,
|
|
File without changes
|
{codeanalyzer_python-1.3.0.dist-info → codeanalyzer_python-1.4.1.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{codeanalyzer_python-1.3.0.dist-info → codeanalyzer_python-1.4.1.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|