{"id":34611497,"url":"https://github.com/euske/fgyama","last_synced_at":"2026-03-13T20:02:32.553Z","repository":{"id":42669007,"uuid":"89824936","full_name":"euske/fgyama","owner":"euske","description":"Static source code analyzer that extracts an interprocedural dataflow graph from Java source code. ","archived":false,"fork":false,"pushed_at":"2023-04-30T02:59:56.000Z","size":3015,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2023-04-30T04:43:09.029Z","etag":null,"topics":["dataflow-analysis","program-analysis","software-engineering","source-code-analysis"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/euske.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-04-30T02:32:23.000Z","updated_at":"2022-11-10T02:26:39.000Z","dependencies_parsed_at":"2022-09-08T16:51:55.756Z","dependency_job_id":null,"html_url":"https://github.com/euske/fgyama","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/euske/fgyama","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euske%2Ffgyama","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euske%2Ffgyama/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euske%2Ffgyama/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euske%2Ffgyama/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/euske","download_url":"https://codeload.github.com/euske/fgyama/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euske%2Ffgyama/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28003726,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-24T02:00:07.193Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dataflow-analysis","program-analysis","software-engineering","source-code-analysis"],"created_at":"2025-12-24T14:15:54.000Z","updated_at":"2025-12-24T14:15:55.586Z","avatar_url":"https://github.com/euske.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FGyama\n\nFGyama, or Flow Graph yama is a static source code analyzer\nthat extracts an interprocedural dataflow graph from\nJava source code. It's designed to be scalable so that\nit can be applied to a large code base.\n\n\n## What It Does\n\n### Input\n\n    public class Hello {\n        public static void main(String[] args) {\n            String name = args[0];\n            System.out.println(\"Hello, \"+name);\n        }\n    }\n\n### Output (SVG)\n\n\u003cimg src=\"docs/img/Hello.svg\"\u003e\n\n### Output (XML)\n\n    \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\u003cfgyama\u003e\n      \u003cclass extends=\"Ljava/lang/Object;\" name=\"LHello;\" path=\"/home/euske/work/r/fgyama/tests/Hello.java\"\u003e\n        \u003cmethod id=\"LHello;.\u0026lt;clinit\u0026gt;()V\" name=\"\u0026lt;clinit\u0026gt;\" style=\"initializer\"\u003e\n          \u003cast end=\"141\" start=\"0\" type=\"55\"/\u003e\n          \u003cscope name=\"LHello;.\u0026lt;clinit\u0026gt;\"/\u003e\n        \u003c/method\u003e\n        \u003cmethod id=\"LHello;.main([Ljava/lang/String;)V\" name=\"main\" style=\"static\"\u003e\n          \u003cast end=\"139\" start=\"25\" type=\"31\"/\u003e\n          \u003cscope name=\"LHello;.:main:25:139\"\u003e\n            \u003cnode id=\"M2_main_N1\" kind=\"input\" ref=\"#arg0\" type=\"[Ljava/lang/String;\"\u003e\n              \u003cast end=\"62\" start=\"49\" type=\"44\"/\u003e\n            \u003c/node\u003e\n            \u003cnode id=\"M2_main_N2\" kind=\"assign_var\" ref=\"$LHello;.:main:25:139/$args\" type=\"[Ljava/lang/String;\"\u003e\n              \u003cast end=\"62\" start=\"49\" type=\"44\"/\u003e\n              \u003caccept src=\"M2_main_N1\"/\u003e\n            \u003c/node\u003e\n            \u003cnode id=\"M2_main_N3\" kind=\"input\" ref=\"#this\" type=\"LHello;\"/\u003e\n            \u003cnode id=\"M2_main_N4\" kind=\"input\" ref=\"%Ljava/lang/String;\" type=\"Ljava/lang/String;\"/\u003e\n            \u003cnode id=\"M2_main_N5\" kind=\"input\" ref=\"@Ljava/lang/System;/.out\" type=\"Ljava/io/PrintStream;\"/\u003e\n            \u003cscope name=\"LHello;.:main:25:139.:B:64:139\"\u003e\n              \u003cnode id=\"M2_main_N6\" kind=\"ref_var\" ref=\"$LHello;.:main:25:139/$args\" type=\"[Ljava/lang/String;\"\u003e\n                \u003cast end=\"85\" start=\"81\" type=\"42\"/\u003e\n                \u003caccept src=\"M2_main_N2\"/\u003e\n              \u003c/node\u003e\n              \u003cnode data=\"0\" id=\"M2_main_N7\" kind=\"value\" type=\"I\"\u003e\n                \u003cast end=\"87\" start=\"86\" type=\"34\"/\u003e\n              \u003c/node\u003e\n              \u003cnode id=\"M2_main_N8\" kind=\"ref_array\" ref=\"%Ljava/lang/String;\" type=\"Ljava/lang/String;\"\u003e\n                \u003cast end=\"88\" start=\"81\" type=\"2\"/\u003e\n                \u003caccept label=\"array\" src=\"M2_main_N6\"/\u003e\n                \u003caccept label=\"index\" src=\"M2_main_N7\"/\u003e\n                \u003caccept src=\"M2_main_N4\"/\u003e\n              \u003c/node\u003e\n              \u003cnode id=\"M2_main_N9\" kind=\"assign_var\" ref=\"$LHello;.:main:25:139.:B:64:139/$name\" type=\"Ljava/lang/String;\"\u003e\n                \u003cast end=\"88\" start=\"74\" type=\"59\"/\u003e\n                \u003caccept src=\"M2_main_N8\"/\u003e\n              \u003c/node\u003e\n              \u003cnode id=\"M2_main_N10\" kind=\"ref_field\" ref=\"@Ljava/lang/System;/.out\" type=\"Ljava/io/PrintStream;\"\u003e\n                \u003cast end=\"108\" start=\"98\" type=\"40\"/\u003e\n                \u003caccept src=\"M2_main_N5\"/\u003e\n              \u003c/node\u003e\n              \u003cnode data=\"Hello, \" id=\"M2_main_N11\" kind=\"value\" type=\"Ljava/lang/String;\"\u003e\n                \u003cast end=\"126\" start=\"117\" type=\"45\"/\u003e\n              \u003c/node\u003e\n              \u003cnode id=\"M2_main_N12\" kind=\"ref_var\" ref=\"$LHello;.:main:25:139.:B:64:139/$name\" type=\"Ljava/lang/String;\"\u003e\n                \u003cast end=\"131\" start=\"127\" type=\"42\"/\u003e\n                \u003caccept src=\"M2_main_N9\"/\u003e\n              \u003c/node\u003e\n              \u003cnode data=\"+\" id=\"M2_main_N13\" kind=\"op_infix\" type=\"Ljava/lang/String;\"\u003e\n                \u003cast end=\"131\" start=\"117\" type=\"27\"/\u003e\n                \u003caccept label=\"L\" src=\"M2_main_N11\"/\u003e\n                \u003caccept label=\"R\" src=\"M2_main_N12\"/\u003e\n              \u003c/node\u003e\n              \u003cnode data=\"Ljava/io/PrintStream;.println(Ljava/lang/String;)V\" id=\"M2_main_N14\" kind=\"call\" type=\"V\"\u003e\n                \u003cast end=\"132\" start=\"98\" type=\"32\"/\u003e\n                \u003caccept label=\"#this\" src=\"M2_main_N10\"/\u003e\n                \u003caccept label=\"#arg0\" src=\"M2_main_N13\"/\u003e\n              \u003c/node\u003e\n              \u003cnode id=\"M2_main_N15\" kind=\"receive\" type=\"V\"\u003e\n                \u003cast end=\"132\" start=\"98\" type=\"32\"/\u003e\n                \u003caccept src=\"M2_main_N14\"/\u003e\n              \u003c/node\u003e\n            \u003c/scope\u003e\n          \u003c/scope\u003e\n        \u003c/method\u003e\n      \u003c/class\u003e\n    \u003c/fgyama\u003e\n\n## Node types (kinds):\n\n### Basic Operations\n\n| Kind         | Data                | Input(s)                       |\n| ------------ | ------------------- | -------------------------------|\n| value        | Actual value        |                                |\n| valueset     | Value count         | value0, value1, ...            |\n| op_assign    | Assignment operator | L, R                           |\n| op_prefix    | Prefix operator     | (default)                      |\n| op_infix     | Infix operator      | L, R                           |\n| op_postfix   | Postfix operator    | (default)                      |\n| op_typecast  | Casting type        | (default)                      |\n| op_typecheck | Checking type       | (default)                      |\n| op_iter      |                     | (default)                      |\n| ref_var      |                     | (default)                      |\n| ref_array    |                     | (default), array, index        |\n| ref_field    |                     | (default), obj                 |\n| assign_var   |                     | (default)                      |\n| assign_array |                     | (default), array, index        |\n| assign_field |                     | (default), obj                 |\n\n### Function Call\n\n| Kind         | Data                | Input(s)                       |\n| ------------ | ------------------- | -------------------------------|\n| call         | Method IDs          | @type, #arg0, ..., #bypass, .field, %type |\n| new          | Method ID           | @type, #arg0, ..., #bypass, .field, %type |\n| input        |                     |                                |\n| output       |                     | (default)                      |\n| return       |                     | (default)                      |\n| receive      |                     | (default), Fields              |\n| throw        |                     | !type                          |\n| catch        |                     | exc0, ...                      |\n| catchjoin    |                     | !type                          |\n\n### Control Flow\n\n| Kind         | Data                | Input(s)                       |\n| ------------ | ------------------- | -------------------------------|\n| join         |                     | cond, true, false              |\n| begin        | Loop ID             | init, cont                     |\n| end          | Loop ID             | (default), cond, _repeat       |\n| repeat       | Loop ID             | (default), _end                |\n| case         | Label count         | (default), match0, ...         |\n\n\n## How to Build\n\n### Prerequisites\n\n  * Java/Maven\n  * Eclipse JDT (automatically downloaded)\n  * Graphviz http://graphviz.org/\n\n### Compiling\n\n    $ mvn clean package\n\n### Testing\n\n    $ mvn exec:java -Dexec.args=\"./tests/Hello.java\" \u003e Hello.graph\n    or\n    $ ./tools/java2df.sh ./tests/Hello.java \u003e Hello.graph\n    then\n    $ python tools/graph2gv.py Hello.graph | dot -Tsvg \u003e Hello.svg\n\n\n## How to Use\n\n    XmlExporter exporter = new XmlExporter(System.out);\n    Java2DF converter = new Java2DF();\n    converter.loadDefaults();       // Load the standard classes.\n    converter.loadJarFile(\"path/to/my.jar\");        // Add a jar.\n    converter.addSourceFile(\"path/to/Hello.java\");  // Add a source code.\n    // Perform analysis for every user-defined class.\n    for (DFSourceKlass klass : converter.getSourceKlasses()) {\n        converter.analyzeKlass(exporter, klass);\n    }\n    exporter.close();\n\n### Options\n\n * `-v`: increases verbosity.\n * `-i filelist`: takes a filename list.\n * `-o output`: specifies the output file.\n * `-C classpath`: add a jar file / directory to the classpath.\n * `-S`: strict mode. (stops at a first error)\n * `-F`: pretty printing XML.\n\n\n## Development\n\n### Coding style\n\n    (c-add-style \"me\"\n             '(\"Java\"\n               (c-offsets-alist . (\n                                   (arglist-cont . c-lineup-argcont)\n                                   (arglist-intro . +)\n                                   ))\n               ))\n\n### TODOs\n\n  * Handle consecutive SwitchCases.\n  * Correct local scope handling.\n  * Java language spec.: https://docs.oracle.com/javase/specs/\n  * Moar unittests.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feuske%2Ffgyama","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feuske%2Ffgyama","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feuske%2Ffgyama/lists"}