A bytecode optimizer for Android apps
This report summarizes scanner evidence for meta/redex, a C++ project with 6,318 GitHub stars. SynthScan examined 568,238 lines of code across 2131 source files, recording 1072 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 2.2 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 960 finding(s).
Are imports declared and package/API names verified? 42 finding(s).
Are wrappers, guards, and repeated structures necessary? 173 finding(s).
Which changes need focused human review? 1072 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1072 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | setup_oss_toolchain.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | libredex/ProguardMap.cpp | 1 | /* | COMMENT |
| LOW | libredex/IRAssembler.cpp | 1 | /* | COMMENT |
| LOW | libredex/ReferencedState.h | 41 | // Whether it is referenced from an XML layout. | COMMENT |
| LOW | libredex/ReferencedState.h | 101 | // m_force_rename and m_dont_rename should be set during evaluating | COMMENT |
| LOW | libredex/DexHasher.cpp | 1 | /* | COMMENT |
| LOW | libredex/ProguardMatcher.cpp | 1 | /* | COMMENT |
| LOW | libredex/GraphVisualizer.cpp | 21 | #include "IRCode.h" | COMMENT |
| LOW | libredex/GraphVisualizer.cpp | 41 | // begin_compilation | COMMENT |
| LOW | libredex/GraphVisualizer.cpp | 61 | // end_states | COMMENT |
| LOW | libredex/VirtualScopes.cpp | 1 | /* | COMMENT |
| LOW | libredex/VirtualScopes.cpp | 101 | return true; | COMMENT |
| LOW | libredex/VirtualScopes.cpp | 261 | COMMENT | |
| LOW | libredex/RedexResources.h | 1 | /* | COMMENT |
| LOW | libredex/ProguardParser.cpp | 1 | /* | COMMENT |
| LOW | libredex/FrequentlyUsedPointersCache.h | 61 | #undef STORE_TYPE | COMMENT |
| LOW | libredex/RedexResources.cpp | 1 | /* | COMMENT |
| LOW | libredex/RedexResources.cpp | 21 | COMMENT | |
| LOW | libredex/Walkers.h | 1 | /* | COMMENT |
| LOW | libredex/DexClass.cpp | 1 | /* | COMMENT |
| LOW | libredex/DexClass.cpp | 21 | #include "DexMemberRefs.h" | COMMENT |
| LOW | libredex/Debug.h | 21 | #else | COMMENT |
| LOW | libredex/Debug.h | 61 | ((cond) ? static_cast<void>(0) : ((fail), static_cast<void>(0))) | COMMENT |
| LOW | libredex/MethodOverrideGraph.cpp | 1 | /* | COMMENT |
| LOW | libredex/MethodOverrideGraph.cpp | 221 | // will not resolve to the subinterface's method at runtime, but these | COMMENT |
| LOW | libredex/MethodOverrideGraph.cpp | 261 | COMMENT | |
| LOW | libredex/MethodOverrideGraph.cpp | 281 | // m_scope (internal) classes. Restricting to m_scope alone misses | COMMENT |
| LOW | libredex/MethodOverrideGraph.cpp | 361 | // re-declares a method). We intentionally call create_miranda_for | COMMENT |
| LOW | libredex/DexVt.cpp | 1 | /* | COMMENT |
| LOW | libredex/DexVt.cpp | 21 | #include <memory> | COMMENT |
| LOW | libredex/DexVt.cpp | 41 | #include "IRList.h" | COMMENT |
| LOW | libredex/DexVt.cpp | 461 | capture_loops(*cfg, &rec); | COMMENT |
| LOW | libredex/BaselineProfile.h | 41 | COMMENT | |
| LOW | libredex/BaselineProfile.h | 61 | COMMENT | |
| LOW | libredex/BaselineProfile.h | 101 | // Whether the profile flags ask dex2oat to compile this entry: | COMMENT |
| LOW | libredex/BaselineProfile.h | 121 | // Methods the caller's exclusion set kept out of the candidate pool. | COMMENT |
| LOW | libredex/IODIMetadata.cpp | 61 | std::string& storage = base_name; | COMMENT |
| LOW | libredex/Armv7JitLoopChecker.h | 21 | } // namespace cfg | COMMENT |
| LOW | libredex/SourceBlocksViolations.cpp | 1 | /* | COMMENT |
| LOW | libredex/SourceBlocksViolations.cpp | 21 | COMMENT | |
| LOW | libredex/SourceBlocksViolations.cpp | 221 | // `dom < block` iff `dom == 0 && block == 1`). The equivalence to the old | COMMENT |
| LOW | libredex/SourceBlocksViolations.cpp | 521 | summed_values[i] += first_sb_pred->get_val(i).value_or(0); | COMMENT |
| LOW | libredex/DexOutput.h | 1 | /* | COMMENT |
| LOW | libredex/DexPosition.cpp | 1 | /* | COMMENT |
| LOW | libredex/DexPosition.cpp | 221 | const auto* unknown_source_string = DexString::make_string("UnknownSource"); | COMMENT |
| LOW | libredex/DexPosition.cpp | 281 | add_position(case_pos); | COMMENT |
| LOW | libredex/Reachability.cpp | 1 | /* | COMMENT |
| LOW | libredex/BundleResources.cpp | 1 | /* | COMMENT |
| LOW | libredex/BundleResources.cpp | 21 | #include <string> | COMMENT |
| LOW | libredex/MethodProfiles.cpp | 1121 | if (a == COLD_START) { | COMMENT |
| LOW | libredex/DexUtil.cpp | 1 | /* | COMMENT |
| LOW | libredex/IRList.h | 1 | /* | COMMENT |
| LOW | libredex/DexAssessments.cpp | 1 | /* | COMMENT |
| LOW | libredex/DexOutput.cpp | 1 | /* | COMMENT |
| LOW | libredex/DexOutput.cpp | 21 | #include <stdlib.h> | COMMENT |
| LOW | libredex/DexOutput.cpp | 41 | #include "DexInstruction.h" | COMMENT |
| LOW | libredex/DexOutput.cpp | 561 | COMMENT | |
| LOW | libredex/Trace.cpp | 1 | /* | COMMENT |
| LOW | libredex/ClassOrderSample.h | 21 | // APK, so that two builds' placements can be compared per dex-ordering regime. | COMMENT |
| LOW | libredex/ClassOrderSample.h | 41 | namespace class_order_sample { | COMMENT |
| 643 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | redex.py | 151 | def add_extra_environment_args(env: typing.Dict[str, str]) -> None: | CODE |
| LOW | redex.py | 556 | def align_and_sign_output_apk( | CODE |
| LOW | redex.py | 967 | def _has_android_library_jars(pg_file: str) -> bool: | STRING |
| LOW | redex.py | 1055 | def _check_shrinker_heuristics(args: argparse.Namespace) -> None: | STRING |
| LOW | redex.py | 1108 | def _handle_baseline_profiles(args: argparse.Namespace) -> None: | STRING |
| LOW | redex.py | 1116 | def _get_baseline_profile_interactions( | STRING |
| LOW | redex.py | 1232 | def _handle_class_frequencies(args: argparse.Namespace) -> None: | STRING |
| LOW | tools/python/dex.py | 381 | def find_encoded_method_by_code_off(self, code_off): | CODE |
| LOW | tools/python/dex.py | 1279 | def get_internal_pretty_method_str_rep(self): | CODE |
| LOW | tools/python/dex.py | 1427 | def check_debug_info_encoding(self): | CODE |
| LOW | tools/python/dex.py | 1770 | def demangle_class_method_name(self, cls_mangled, method_name): | CODE |
| LOW | tools/python/dex.py | 1791 | def get_debug_info_items_and_total_size(self): | CODE |
| LOW | tools/python/dex.py | 1984 | def find_method_id_by_code_offset(self, code_off): | CODE |
| LOW | tools/python/dex.py | 2078 | def get_class_def_index_from_offset(self, class_def_offset): | CODE |
| LOW | tools/python/dex.py | 2085 | def get_code_item_index_from_code_off(self, code_off): | CODE |
| LOW | tools/python/dex.py | 2099 | def find_method_from_code_off(self, code_off): | CODE |
| LOW | tools/python/dex.py | 2182 | def find_class_def_by_type_index(self, class_idx): | CODE |
| LOW | tools/python/dex.py | 2374 | def get_signed_hex_offset_as_str(signed_offset, width): | CODE |
| LOW | tools/python/block_profile_to_lines.py | 235 | def get_unmatched_profile_methods(self) -> list[str]: | CODE |
| LOW | tools/python/file_extract.py | 396 | def get_fixed_length_c_string( | CODE |
| LOW | tools/python/pgi/analyze_pgi_logs.py | 52 | def _parse_raw_method_data_at_inline(method_name, arr): | CODE |
| LOW | tools/python/symbolicator/iodi.py | 60 | def map_iodi_no_debug_to_mappings(self, debug_line_map, class_name, method_name): | CODE |
| LOW | tools/callgraph-analysis/corelib/loader.py | 79 | def get_nodes_in_class_method(self, class_name, method_name): | CODE |
| LOW | tools/reachability-analysis/as_hprof.py | 336 | def reserve_reachable_type_object_ids( | CODE |
| LOW | tools/reachability-analysis/as_hprof.py | 390 | def write_reachable_type_objects( | CODE |
| LOW | tools/reachability-analysis/as_hprof.py | 479 | def write_reachability_object_class(self, class_name: str) -> ClassId: | CODE |
| LOW | tools/reachability-analysis/as_hprof.py | 498 | def write_reachability_instance( | CODE |
| LOW | tools/reachability-analysis/as_hprof.py | 619 | def write_reachability_object_class(self, class_name: str) -> ClassId: | CODE |
| LOW | tools/reachability-analysis/as_hprof.py | 639 | def write_reachability_instance( | CODE |
| LOW | tools/reachability-analysis/test/test_sqlite_export.py | 18 | def test_exports_faithful_graph_with_named_edge_direction(self): | CODE |
| LOW | tools/reachability-analysis/test/test_sqlite_export.py | 131 | def test_materializes_logical_dominator_tree_and_omits_rootless_nodes(self): | CODE |
| LOW | tools/reachability-analysis/test/test_sqlite_export.py | 188 | def test_refuses_to_overwrite_output(self): | CODE |
| LOW | tools/reachability-analysis/test/test_sqlite_export.py | 194 | def test_exports_new_marker_edges_in_retainer_direction(self): | CODE |
| LOW | …ols/reachability-analysis/test/test_deserialization.py | 49 | def test_reachability_graph_dump_round_trip(self): | CODE |
| LOW | …ols/reachability-analysis/test/test_deserialization.py | 82 | def test_dump_preserves_duplicate_node_records(self): | CODE |
| LOW | …ols/reachability-analysis/test/test_deserialization.py | 114 | def test_get_node_prefers_class_over_annotation(self): | CODE |
| LOW | …ols/reachability-analysis/test/test_deserialization.py | 123 | def test_method_override_graph(self): | CODE |
| LOW | tools/reachability-analysis/test/test_analysis.py | 25 | def test_group_by_common_keys(self): | CODE |
| LOW | tools/reachability-analysis/test/test_analysis.py | 62 | def test_group_members_by_class(self): | CODE |
| LOW | tools/reachability-analysis/test/test_analysis.py | 74 | def test_get_dominated_handles_a_deep_graph(self): | CODE |
| LOW | tools/reachability-analysis/test/test_analysis.py | 90 | def test_get_dominators_on_linear_chain(self): | CODE |
| LOW | tools/reachability-analysis/test/test_analysis.py | 101 | def test_get_dominators_keeps_only_shared_nodes_across_roots(self): | CODE |
| LOW | tools/reachability-analysis/test/test_analysis.py | 118 | def test_get_dominators_handles_a_reachable_cycle(self): | CODE |
| LOW | tools/reachability-analysis/test/test_analysis.py | 134 | def test_get_dominators_rejects_a_target_unreachable_from_roots(self): | CODE |
| LOW | tools/reachability-analysis/test/test_diff.py | 23 | def test_keeps_rooted_ancestors_and_descendants_of_new_nodes(self): | CODE |
| LOW | tools/reachability-analysis/test/test_diff.py | 64 | def test_excludes_predecessors_without_a_path_from_a_root(self): | CODE |
| LOW | tools/reachability-analysis/test/test_diff.py | 92 | def test_duplicate_labels_contribute_all_edges(self): | CODE |
| LOW | tools/reachability-analysis/test/test_diff.py | 113 | def test_empty_diff_produces_empty_graph(self): | CODE |
| LOW⚡ | tools/reachability-analysis/test/test_graph_query.py | 183 | def test_neighbors_resolves_annotation_names(self): | CODE |
| LOW⚡ | tools/reachability-analysis/test/test_graph_query.py | 191 | def test_table_format_and_missing_node_error(self): | CODE |
| LOW⚡ | tools/reachability-analysis/test/test_graph_query.py | 201 | def test_neighbors_disambiguates_class_and_annotation_names(self): | CODE |
| LOW | tools/reachability-analysis/test/test_graph_query.py | 64 | def test_roots_filters_by_kind_and_limit(self): | CODE |
| LOW | tools/reachability-analysis/test/test_graph_query.py | 71 | def test_roots_supports_csv_and_table_output(self): | CODE |
| LOW | tools/reachability-analysis/test/test_graph_query.py | 83 | def test_roots_collapse_duplicate_logical_nodes(self): | CODE |
| LOW | tools/reachability-analysis/test/test_graph_query.py | 106 | def test_rejects_invalid_catalog_metadata(self): | CODE |
| LOW | tools/reachability-analysis/test/test_graph_query.py | 123 | def test_reports_catalog_errors_without_a_traceback(self): | CODE |
| LOW | tools/reachability-analysis/test/test_graph_query.py | 143 | def test_help_exposes_only_sqlite_input(self): | CODE |
| LOW | tools/reachability-analysis/test/test_graph_query.py | 154 | def test_semantic_roots_resolves_seed_reasons_and_excludes_non_program_nodes( | CODE |
| LOW | tools/reachability-analysis/test/test_graph_query.py | 167 | def test_neighbors_labels_both_edge_directions(self): | CODE |
| LOW | tools/reachability-analysis/test/test_graph_query.py | 237 | def test_path_follows_retainer_to_retained(self): | CODE |
| 43 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/python/dex.py | 38 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 40 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 232 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 234 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 260 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 262 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 291 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 293 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 341 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 343 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 405 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 407 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 424 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 426 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 440 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 442 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 469 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 471 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 797 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 799 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 919 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 921 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 941 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 943 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 964 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 966 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1005 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1007 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1028 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1030 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1046 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1048 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1063 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1065 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1086 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1088 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1119 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1121 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1137 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/python/dex.py | 1139 | # ---------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/arsc/ArscStats.cpp | 450 | // Step 1: parse the string pools and build up a vector of idx -> vector of | COMMENT |
| LOW⚡ | sparta/rust/src/wpo.rs | 407 | // Step 1: construct auxilary data structures, including | COMMENT |
| LOW⚡ | sparta/rust/src/wpo.rs | 412 | // Step 2: start constructing WPO. | COMMENT |
| LOW⚡ | opt/clinit-batching/EarlyClassLoadsAnalysis.cpp | 292 | // Step 1: Find Application and AppComponentFactory classes from manifest | COMMENT |
| LOW⚡ | opt/clinit-batching/EarlyClassLoadsAnalysis.cpp | 300 | // Step 2: Collect entry point methods in actual invocation order. | COMMENT |
| LOW | opt/clinit-batching/EarlyClassLoadsAnalysis.cpp | 324 | // Step 3: Walk callgraph from entry points | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 751 | // Step 3: Add the new method to the class | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 754 | // Step 4: Derive stats for the new method from the original clinit | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 757 | // Step 5: Remove the original clinit, making the class trivially | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 904 | // Step 2: Identify candidate clinits based on baseline profile | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 907 | // Step 3: Filter out early loaded classes from candidates | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 1063 | // Step 5: Build dependency graph and topological sort | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 1068 | // Step 6: Transform clinits in dependency order | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 1072 | // Step 7: Generate orchestrator method body with invoke-static calls | COMMENT |
| LOW | opt/clinit-batching/ClinitBatchingPass.cpp | 703 | // Step 1: Remove ACC_FINAL from static fields being written | COMMENT |
| LOW | opt/clinit-batching/ClinitBatchingPass.cpp | 725 | // Step 2: Create new __initStatics$<ClassName>() method with clinit body | COMMENT |
| LOW | opt/clinit-batching/ClinitBatchingPass.cpp | 874 | // Step 1: Run early class loads analysis to find classes loaded before | COMMENT |
| LOW | opt/clinit-batching/ClinitBatchingPass.cpp | 928 | // Step 4: Safety analysis using InitClassesWithSideEffects as the base | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1236 | // Step 1: Get sorted basic blocks to instrument with their information. | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1252 | // Step 2: Fill in some info eagerly. This is necessary as later steps may be | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1288 | // Step 3: Insert onMethodBegin to track method execution, and bit-vector | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1305 | // Step 4: Insert block coverage update instructions to each blocks. | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1318 | // Step 5: Insert block counting instructions to each loop block then | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1361 | // Step 5: Insert onMethodExit in exit block(s) if basic block tracing is | COMMENT |
| LOW | opt/object-escape-analysis/ExpandableMethodParams.cpp | 136 | // We need to check if we don't have too many args that won't fit | COMMENT |
| LOW | opt/kotlin-lambda/KotlinLambdaDeduplicationPass.cpp | 271 | // Step 1: Collect all lambdas and insert their invoke methods. | COMMENT |
| LOW | opt/kotlin-lambda/KotlinLambdaDeduplicationPass.cpp | 304 | // Step 2: Check if any duplicate groups exist. | COMMENT |
| LOW⚡ | opt/kotlin-lambda/KotlinLambdaDeduplicationPass.cpp | 332 | // Step 3: Build a map from lambda types to their dex indices. We pick the | COMMENT |
| LOW⚡ | opt/kotlin-lambda/KotlinLambdaDeduplicationPass.cpp | 340 | // Step 4: Process duplicate groups. | COMMENT |
| LOW⚡ | opt/kotlin-lambda/KotlinLambdaDeduplicationPass.cpp | 346 | // Step 5: Rewrite all usages. | COMMENT |
| LOW⚡ | …rvice/switch-partitioning/SwitchEquivPrerequisites.cpp | 18 | // Step 1: Gather linear prologue blocks to find the first branch point | COMMENT |
| LOW⚡ | …rvice/switch-partitioning/SwitchEquivPrerequisites.cpp | 24 | // Step 2: Run constant propagation analysis | COMMENT |
| LOW⚡ | …rvice/switch-partitioning/SwitchEquivPrerequisites.cpp | 30 | // Step 3: Find the determining register (the one being switched on) | COMMENT |
| LOW⚡ | …rvice/switch-partitioning/SwitchEquivPrerequisites.cpp | 39 | // Step 4: Get the root branch instruction | COMMENT |
| LOW⚡ | …rvice/switch-partitioning/SwitchEquivPrerequisites.cpp | 49 | // Step 5: Construct and return SwitchEquivFinder | COMMENT |
| LOW | service/class-merging/Model.cpp | 1116 | // Step 1: Find overridden_meth from non-mergeable methods | COMMENT |
| LOW | service/class-merging/Model.cpp | 1133 | // Step 2: Build a class->method map for this scope (cached) | COMMENT |
| LOW | service/class-merging/Model.cpp | 1148 | // Step 3: Iterate merger's mergeables and look up their methods | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/arsc/ArscStats.cpp | 450 | // Step 1: parse the string pools and build up a vector of idx -> vector of | COMMENT |
| LOW⚡ | sparta/rust/src/wpo.rs | 407 | // Step 1: construct auxilary data structures, including | COMMENT |
| LOW⚡ | sparta/rust/src/wpo.rs | 412 | // Step 2: start constructing WPO. | COMMENT |
| LOW⚡ | opt/clinit-batching/EarlyClassLoadsAnalysis.cpp | 292 | // Step 1: Find Application and AppComponentFactory classes from manifest | COMMENT |
| LOW⚡ | opt/clinit-batching/EarlyClassLoadsAnalysis.cpp | 300 | // Step 2: Collect entry point methods in actual invocation order. | COMMENT |
| LOW | opt/clinit-batching/EarlyClassLoadsAnalysis.cpp | 324 | // Step 3: Walk callgraph from entry points | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 751 | // Step 3: Add the new method to the class | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 754 | // Step 4: Derive stats for the new method from the original clinit | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 757 | // Step 5: Remove the original clinit, making the class trivially | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 904 | // Step 2: Identify candidate clinits based on baseline profile | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 907 | // Step 3: Filter out early loaded classes from candidates | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 1063 | // Step 5: Build dependency graph and topological sort | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 1068 | // Step 6: Transform clinits in dependency order | COMMENT |
| LOW⚡ | opt/clinit-batching/ClinitBatchingPass.cpp | 1072 | // Step 7: Generate orchestrator method body with invoke-static calls | COMMENT |
| LOW | opt/clinit-batching/ClinitBatchingPass.cpp | 703 | // Step 1: Remove ACC_FINAL from static fields being written | COMMENT |
| LOW | opt/clinit-batching/ClinitBatchingPass.cpp | 725 | // Step 2: Create new __initStatics$<ClassName>() method with clinit body | COMMENT |
| LOW | opt/clinit-batching/ClinitBatchingPass.cpp | 874 | // Step 1: Run early class loads analysis to find classes loaded before | COMMENT |
| LOW | opt/clinit-batching/ClinitBatchingPass.cpp | 928 | // Step 4: Safety analysis using InitClassesWithSideEffects as the base | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1236 | // Step 1: Get sorted basic blocks to instrument with their information. | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1252 | // Step 2: Fill in some info eagerly. This is necessary as later steps may be | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1288 | // Step 3: Insert onMethodBegin to track method execution, and bit-vector | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1305 | // Step 4: Insert block coverage update instructions to each blocks. | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1318 | // Step 5: Insert block counting instructions to each loop block then | COMMENT |
| LOW | opt/instrument/BlockInstrument.cpp | 1361 | // Step 5: Insert onMethodExit in exit block(s) if basic block tracing is | COMMENT |
| LOW | opt/kotlin-lambda/KotlinLambdaDeduplicationPass.cpp | 271 | // Step 1: Collect all lambdas and insert their invoke methods. | COMMENT |
| LOW | opt/kotlin-lambda/KotlinLambdaDeduplicationPass.cpp | 304 | // Step 2: Check if any duplicate groups exist. | COMMENT |
| LOW⚡ | opt/kotlin-lambda/KotlinLambdaDeduplicationPass.cpp | 332 | // Step 3: Build a map from lambda types to their dex indices. We pick the | COMMENT |
| LOW⚡ | opt/kotlin-lambda/KotlinLambdaDeduplicationPass.cpp | 340 | // Step 4: Process duplicate groups. | COMMENT |
| LOW⚡ | opt/kotlin-lambda/KotlinLambdaDeduplicationPass.cpp | 346 | // Step 5: Rewrite all usages. | COMMENT |
| LOW⚡ | …rvice/switch-partitioning/SwitchEquivPrerequisites.cpp | 18 | // Step 1: Gather linear prologue blocks to find the first branch point | COMMENT |
| LOW⚡ | …rvice/switch-partitioning/SwitchEquivPrerequisites.cpp | 24 | // Step 2: Run constant propagation analysis | COMMENT |
| LOW⚡ | …rvice/switch-partitioning/SwitchEquivPrerequisites.cpp | 30 | // Step 3: Find the determining register (the one being switched on) | COMMENT |
| LOW⚡ | …rvice/switch-partitioning/SwitchEquivPrerequisites.cpp | 39 | // Step 4: Get the root branch instruction | COMMENT |
| LOW⚡ | …rvice/switch-partitioning/SwitchEquivPrerequisites.cpp | 49 | // Step 5: Construct and return SwitchEquivFinder | COMMENT |
| LOW | service/class-merging/Model.cpp | 1116 | // Step 1: Find overridden_meth from non-mergeable methods | COMMENT |
| LOW | service/class-merging/Model.cpp | 1133 | // Step 2: Build a class->method map for this scope (cached) | COMMENT |
| LOW | service/class-merging/Model.cpp | 1148 | // Step 3: Iterate merger's mergeables and look up their methods | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | redex.py | 74 | CODE | |
| LOW | redex.py | 253 | CODE | |
| LOW | redex.py | 967 | CODE | |
| LOW | redex.py | 1734 | CODE | |
| LOW | redex.py | 366 | CODE | |
| LOW | gen_packed_apilevels.py | 54 | CODE | |
| LOW | tools/python/dex.py | 4458 | CODE | |
| LOW | tools/python/dex.py | 579 | CODE | |
| LOW | tools/python/dex.py | 660 | CODE | |
| LOW | tools/python/dex.py | 722 | CODE | |
| LOW | tools/python/dex.py | 859 | CODE | |
| LOW | tools/python/dex.py | 1156 | CODE | |
| LOW | tools/python/dex.py | 1943 | CODE | |
| LOW | tools/python/dex.py | 1965 | CODE | |
| LOW | tools/python/dex.py | 1992 | CODE | |
| LOW | tools/python/dex.py | 2053 | CODE | |
| LOW | tools/python/dex.py | 2279 | CODE | |
| LOW | tools/python/dex.py | 2432 | CODE | |
| LOW | tools/python/dex.py | 2463 | CODE | |
| LOW | tools/python/dex.py | 2475 | CODE | |
| LOW | tools/python/dex.py | 2496 | CODE | |
| LOW | tools/python/dex.py | 4695 | CODE | |
| LOW | tools/python/block_profile_to_lines.py | 180 | CODE | |
| LOW | tools/python/file_extract.py | 125 | CODE | |
| LOW | tools/python/file_extract.py | 264 | CODE | |
| LOW | tools/python/file_extract.py | 396 | CODE | |
| LOW | tools/python/file_extract.py | 838 | CODE | |
| LOW | tools/python/file_extract.py | 941 | CODE | |
| LOW | tools/python/file_extract.py | 972 | CODE | |
| LOW | tools/python/file_extract.py | 1079 | CODE | |
| LOW | tools/python/pgi/analyze_pgi_logs.py | 166 | CODE | |
| LOW | tools/python/symbolicator/logcat.py | 71 | CODE | |
| LOW | tools/python/symbolicator/debug_line_map.py | 22 | CODE | |
| LOW | tools/python/symbolicator/debug_line_map.py | 60 | CODE | |
| LOW | tools/python/symbolicator/dexdump.py | 46 | CODE | |
| LOW | tools/python/symbolicator/dexdump.py | 82 | CODE | |
| LOW | tools/python/symbolicator/dexdump.py | 120 | CODE | |
| LOW | tools/python/symbolicator/symbolicator.py | 72 | CODE | |
| LOW | tools/reachability-analysis/lib/analysis.py | 82 | CODE | |
| LOW | tools/reachability-analysis/lib/sqlite_export.py | 71 | CODE | |
| LOW | tools/reachability-analysis/lib/dominator_tree.py | 157 | CODE | |
| LOW | tools/reachability-analysis/lib/core.py | 165 | CODE | |
| LOW | tools/reachability-analysis/lib/core.py | 349 | CODE | |
| LOW | tools/hprof/dump_classes_from_hprof.py | 1105 | CODE | |
| LOW | tools/hprof/dump_classes_from_hprof.py | 1124 | CODE | |
| LOW | tools/hprof/dump_classes_from_hprof.py | 1194 | CODE | |
| LOW | tools/hprof/dump_classes_from_hprof.py | 1238 | CODE | |
| LOW | tools/hprof/dump_classes_from_hprof.py | 127 | CODE | |
| LOW | tools/hprof/dump_classes_from_hprof.py | 149 | CODE | |
| LOW | tools/hprof/dump_classes_from_hprof.py | 879 | CODE | |
| LOW | tools/hprof/dump_classes_from_hprof.py | 962 | CODE | |
| LOW | tools/hprof/dump_classes_from_hprof.py | 1036 | CODE | |
| LOW | tools/hprof/dump_classes_from_hprof.py | 1258 | CODE | |
| LOW | pyredex/packer.py | 300 | CODE | |
| LOW | pyredex/packer.py | 76 | CODE | |
| LOW | pyredex/unpacker.py | 708 | CODE | |
| LOW | pyredex/unpacker.py | 729 | CODE | |
| LOW | pyredex/unpacker.py | 107 | CODE | |
| LOW | pyredex/unpacker.py | 839 | CODE | |
| LOW | pyredex/unpacker.py | 1135 | CODE | |
| 2 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | gen_packed_apilevels.py | 18 | CODE | |
| LOW | gen_simple_module.py | 17 | CODE | |
| LOW | tools/redex-tool/DexSqlQuery.py | 7 | CODE | |
| LOW | tools/redex-tool/DexSqlQuery.py | 7 | CODE | |
| LOW | tools/redex-tool/DexSqlQuery.py | 7 | CODE | |
| LOW | tools/redex-tool/DexSqlQuery.py | 7 | CODE | |
| LOW | tools/python/block_profile_to_lines.py | 23 | CODE | |
| LOW | tools/python/symbolicator/logcat.py | 6 | CODE | |
| LOW | tools/python/symbolicator/logcat.py | 6 | CODE | |
| LOW | tools/python/symbolicator/logcat.py | 6 | CODE | |
| LOW | tools/python/symbolicator/logcat.py | 6 | CODE | |
| LOW | tools/python/symbolicator/debug_line_map.py | 6 | CODE | |
| LOW | tools/python/symbolicator/debug_line_map.py | 6 | CODE | |
| LOW | tools/python/symbolicator/debug_line_map.py | 6 | CODE | |
| LOW | tools/python/symbolicator/line_unmap.py | 6 | CODE | |
| LOW | tools/python/symbolicator/line_unmap.py | 6 | CODE | |
| LOW | tools/python/symbolicator/line_unmap.py | 6 | CODE | |
| LOW | tools/python/symbolicator/dexdump.py | 6 | CODE | |
| LOW | tools/python/symbolicator/dexdump.py | 6 | CODE | |
| LOW | tools/python/symbolicator/dexdump.py | 6 | CODE | |
| LOW | tools/python/symbolicator/dexdump.py | 6 | CODE | |
| LOW | tools/python/symbolicator/symbolicator.py | 7 | CODE | |
| LOW | tools/python/symbolicator/symbolicator.py | 7 | CODE | |
| LOW | tools/python/symbolicator/symbolicator.py | 7 | CODE | |
| LOW | tools/python/symbolicator/symbolicator.py | 7 | CODE | |
| LOW | tools/python/symbolicator/symbol_files.py | 6 | CODE | |
| LOW | tools/python/symbolicator/symbol_files.py | 6 | CODE | |
| LOW | tools/python/symbolicator/symbol_files.py | 6 | CODE | |
| LOW | tools/python/symbolicator/symbol_files.py | 6 | CODE | |
| LOW | tools/reachability-analysis/diff.py | 7 | CODE | |
| LOW | tools/reachability-analysis/graph_query.py | 7 | CODE | |
| LOW | tools/reachability-analysis/lib/reachability_diff.py | 7 | CODE | |
| LOW | tools/reachability-analysis/lib/analysis.py | 9 | CODE | |
| LOW | tools/reachability-analysis/lib/sqlite_query.py | 7 | CODE | |
| LOW | tools/reachability-analysis/lib/dominator_tree.py | 7 | CODE | |
| LOW | pyredex/__init__.py | 6 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tools/python/dex.py | 1280 | # What it looks like boolean com.facebook.common.jit.common.JitDisabledChecker.testCompileMethod(int) | COMMENT |
| CRITICAL | test/unit/ProguardMapTest.cpp | 32 | "android.support.v7.view.menu.MenuBuilder.getContext():807:807 -> " | CODE |
| CRITICAL | test/integ/Propagation.java | 33 | String tag = com.facebook.redextest.Propagation.class.getSimpleName(); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | libredex/IODIMetadata.cpp | 73 | // offsets in stack traces, then we cannot leverage proguard mappings anymore, | COMMENT |
| MEDIUM | libredex/UnknownVirtuals.cpp | 136 | // not exist in the hierarchy known to redex. Essentially the method | COMMENT |
| MEDIUM | libredex/AnnotationSignatureParser.cpp | 47 | // can make this more robust in the future. | COMMENT |
| MEDIUM | opt/obfuscate/ObfuscateUtils.h | 812 | // Essentially what this does is walks the hierarchy collecting names of | COMMENT |
| MEDIUM | opt/insert-source-blocks/InsertSourceBlocks.cpp | 1303 | // Absolutely no source file data. :-( | COMMENT |
| MEDIUM | …ove-unreachable/TypeAnalysisAwareRemoveUnreachable.cpp | 139 | // Can we leverage exact types? | COMMENT |
| MEDIUM | …ove-unreachable/TypeAnalysisAwareRemoveUnreachable.cpp | 186 | // Can we leverage best known approximation? | COMMENT |
| MEDIUM | opt/peephole/Peephole.cpp | 57 | // This is essentially a string searching problem. We can ideally utilize | COMMENT |
| MEDIUM | service/switch-partitioning/StringSwitchFinder.cpp | 344 | // just before it (robust to moves/CSE): replay from the block's entry state | COMMENT |
| MEDIUM | service/switch-partitioning/StringSwitchFinder.h | 345 | // is resolved by the constant-propagation fixpoint, so it is robust to | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tools/reachability-analysis/lib/sqlite_export.py | 54 | except FileNotFoundError: | CODE |
| HIGH | pyredex/bintools.py | 123 | except (subprocess.CalledProcessError, FileNotFoundError): | CODE |
| HIGH | pyredex/bintools.py | 98 | except Exception: | CODE |
| HIGH | pyredex/bintools.py | 113 | except Exception: | CODE |
| HIGH | pyredex/logger.py | 77 | except KeyError: | CODE |
| HIGH | pyredex/utils.py | 148 | except BaseException: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/reachability-analysis/as_hprof.py | 64 | def update_u4(self, offset: int, value: int) -> None: | CODE |
| LOW | pyredex/bintools.py | 72 | def set_addr2line_path(path: str) -> None: | CODE |
| LOW⚡ | pyredex/bintools.py | 344 | def set_state(self, new_state: BinaryState) -> None: | CODE |
| LOW⚡ | pyredex/bintools.py | 347 | def set_started(self, new_proc: PopenType) -> None: | CODE |
| LOW⚡ | pyredex/bintools.py | 351 | def set_postprocessing(self) -> None: | CODE |
| LOW⚡ | pyredex/bintools.py | 354 | def set_finished(self) -> None: | CODE |
| LOW⚡ | pyredex/bintools.py | 358 | def set_proc(self, new_proc: PopenType) -> None: | CODE |
| LOW | pyredex/logger.py | 97 | def update_trace_file(env: typing.Dict[str, str]) -> None: | CODE |
| LOW | pyredex/unpacker.py | 1129 | def set_resource_file_mapping(self, path: str) -> None: | CODE |
| LOW⚡ | pyredex/utils.py | 167 | def set_omit_sdk_tool_discovery(self) -> None: | CODE |
| LOW | pyredex/utils.py | 317 | def set_root_dir_for_buck(path: str) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/python/dex.py | 4159 | CODE | |
| MEDIUM | tools/python/dex.py | 4160 | CODE | |
| MEDIUM | tools/python/dex.py | 4161 | CODE | |
| MEDIUM | tools/python/dex.py | 4162 | CODE | |
| MEDIUM | tools/python/dex.py | 4163 | CODE | |
| MEDIUM | tools/python/dex.py | 4164 | CODE | |
| MEDIUM | tools/python/dex.py | 4165 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | redex.py | 1296 | print("Error: destination directory already exists!") | STRING |
| MEDIUM | redex.py | 1325 | print("Error: output_ir should be a directory") | STRING |
| LOW | redex.py | 1469 | except Exception as e: | STRING |
| MEDIUM | tools/reachability-analysis/graph_to_sqlite.py | 38 | print("Error: %s" % error, file=sys.stderr) | CODE |
| LOW | pyredex/bintools.py | 98 | except Exception: | CODE |
| LOW | pyredex/bintools.py | 113 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/oatmeal/test/commit-test-data.sh | 9 | # Usage: | COMMENT |
| LOW | tools/oatmeal/test/fetch-test-data.sh | 9 | # Usage: | COMMENT |
| LOW | tools/oatmeal/test/update-test-data.sh | 10 | # Usage: | COMMENT |
| LOW | tools/hprof/dump_classes_from_hprof.py | 8 | # Example usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | redex.py | 125 | f.write("cd %s || exit\n" % quote(os.getcwd())) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/python/file_extract.py | 890 | # Check if this item is just an alignment directive? | COMMENT |
| LOW⚡ | pyredex/utils.py | 256 | # Set NO_BUCKD to minimize disruption to any currently running buckd | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …st/unit/constant-propagation/StringPropagationTest.cpp | 275 | (const-string "placeholder") | CODE |
| LOW | …st/unit/constant-propagation/StringPropagationTest.cpp | 589 | (const-string "placeholder") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | service/switch-partitioning/SwitchEquivFinder.cpp | 352 | // And don't forget to clear out the upper register of wide | COMMENT |