Skip to main content

RG3 is a C/C++ analyzer framework

Project description

RG3

RG3 - is a backend & frontend for processing & analyzing C++ code. It provides information about types into Python frontend to future codegen stage. We've using LLVM as our backend to prepare code.

See our GitHub for more details.

Install

Make sure that your system has clang (any version):

  • macOS: you need to install XCode (tested on 15.x but should work everywhere)
  • Window: you need to install clang 17.x or later and add it into PATH
  • Linux: gcc & g++ at least 13 version (temporary limitation, planned to fix at 0.0.4)
  • Other platforms & archs: Contact us in our GitHub.

It's a better way to use RG3 inside virtualenv:

python3 -m venv venv
source ./venv/bin/activate
pip install rg3py

Usage:

Sample code analyze code from buffer:

from rg3py import CodeAnalyzer, CppStandard, CppCompilerIssueKind, CppTypeKind, CppClass, FunctionArgument
from typing import List


def prepare_args(args: List[FunctionArgument]) -> str:
    return ','.join(f'{arg.type_info.get_name()} {arg.name}' for arg in args)


analyzer: CodeAnalyzer = CodeAnalyzer.make()
analyzer.set_code("""
    namespace my::cool::name_space {
        /**
        * @runtime
        **/
        enum class ECoolEnum : int {
            CE_FIRST_ENTRY = 0,
            CE_ANOTHER_ENTRY = 0xFFEE,
            CE_DUMMY = 256
        };

        /// @runtime
        struct MyGeniusStruct
        {};

        struct SomeThirdPartyStruct
        {
            float fProperty = 42.f;
            MyGeniusStruct sGenius {};

            static bool IsGeniusDesc(bool bCanReplace) const;
        };

        template <typename T> struct ThirdPartyRegistrator {};
        template <> struct 
            __attribute__((annotate("RG3_RegisterRuntime")))
            __attribute__((annotate("RG3_RegisterField[fProperty:Property]")))
            __attribute__((annotate("RG3_RegisterField[sGenius:GeniusData]")))
            __attribute__((annotate("RG3_RegisterFunction[IsGeniusDesc]")))
        ThirdPartyRegistrator<SomeThirdPartyStruct>
        {
            using Type = SomeThirdPartyStruct;
        };
    }
    """)

analyzer.set_cpp_standard(CppStandard.CXX_17)
analyzer.analyze()

for t in analyzer.types:
    print(f"We have a type {t.pretty_name} ({t.kind})")

    if t.kind == CppTypeKind.TK_STRUCT_OR_CLASS:
        as_class: CppClass = t
        for prop in as_class.properties:
            print(f"\tProperty {prop.name} (aka {prop.alias}) of type {prop.type_info.get_name()}")

        for func in as_class.functions:
            args_as_str: str = prepare_args(func.arguments)
            print(f"\tFunction {'static' if func.is_static else ''} {func.return_type.get_name()} {func.name}({args_as_str}){' const' if func.is_const else ''}")

expected output is

We have a type my::cool::name_space::ECoolEnum (TK_ENUM)
We have a type my::cool::name_space::MyGeniusStruct (TK_STRUCT_OR_CLASS)
We have a type my::cool::name_space::SomeThirdPartyStruct (TK_STRUCT_OR_CLASS)
	Property fProperty (aka Property) of type float
	Property sGenius (aka GeniusData) of type MyGeniusStruct
	Function static bool IsGeniusDesc(bool bCanReplace)

Features

  • Supported Windows (x86_64), Linux (x86_64) and macOS (x86_64 and ARM64)
  • Supported C++03, 11, 14, 17, 20, 23 (26 in theory, need to migrate to next LLVM)
  • Supported threads in analysis on native side (see Tests/PyIntegration/test.py test: test_analyzer_context_sample for example)
  • Statically linked, no external dependencies (except Clang instance on machine)
  • Special macro definitions to hide unnecessary code
  • Template specializations reporting
  • Anonymous registration without changes in third party code

Current limitations

Project focused on work around C/C++ headers (C++ especially). Feel free to fork project & add support of anything what you want :)

Third Party libraries

  • LLVM 16.0.4 - our main backend of C++ analysis
  • Boost 1.81.0 - python support & process launcher
  • FMT - string formatter
  • googletest - for internal unit testing
  • pytest - for python side unit testing

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rg3py-0.0.3-py3-none-win_amd64.whl (7.9 MB view details)

Uploaded Python 3Windows x86-64

rg3py-0.0.3-py3-none-macosx_12_7_universal2.whl (23.4 MB view details)

Uploaded Python 3macOS 12.7+ universal2 (ARM64, x86-64)

rg3py-0.0.3-py3-none-any.whl (15.2 MB view details)

Uploaded Python 3

File details

Details for the file rg3py-0.0.3-py3-none-win_amd64.whl.

File metadata

  • Download URL: rg3py-0.0.3-py3-none-win_amd64.whl
  • Upload date:
  • Size: 7.9 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for rg3py-0.0.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 e66f7507f1f8d1fb8d7fb4c924f9c7e96987bfee4c64d43af67d8f9599ddf83e
MD5 d0361264b3a1f49fd27468fe775a71cc
BLAKE2b-256 8305b7e13b39696c819e01c692be859d733e674c05e7cf6a73c1d1a39959cb55

See more details on using hashes here.

File details

Details for the file rg3py-0.0.3-py3-none-macosx_12_7_universal2.whl.

File metadata

  • Download URL: rg3py-0.0.3-py3-none-macosx_12_7_universal2.whl
  • Upload date:
  • Size: 23.4 MB
  • Tags: Python 3, macOS 12.7+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for rg3py-0.0.3-py3-none-macosx_12_7_universal2.whl
Algorithm Hash digest
SHA256 501c566db0f48019c4f0e2bc3a52cc828522bf9d582310b929cfb03f08cd2cbb
MD5 36f9daa2b274b2a6708ca21555c69f66
BLAKE2b-256 1447b99c9b26866fc69e5d2c58ca7f2d0e696ff25c362900875ef96fc8c594e0

See more details on using hashes here.

File details

Details for the file rg3py-0.0.3-py3-none-any.whl.

File metadata

  • Download URL: rg3py-0.0.3-py3-none-any.whl
  • Upload date:
  • Size: 15.2 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for rg3py-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 a33d37638ae913fe34f7c00661f65d6bd3d5a0e54f74b73cfa1b8cd0f6fed78c
MD5 20bac33b966f163dcd1b24928b935058
BLAKE2b-256 962d3ccfa78a82800069393b716f0c77eec06143cae457df8d3a3ae3cdc4fc22

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page