Kaixiang Peng

162 papers B 1C 5Journal 143Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Ind. Informatics
Xin Qin, Hong Liu, Jie Dong, Kaixiang Peng
2026 J jnl
Neural Networks
Xin Qin, Xuan Guo, Jie Dong, Kaixiang Peng
2026 J jnl
Int. J. Control
Hongji Qi, Ming Chen, Kaixiang Peng, Zhiying Wang
2026 J jnl
Appl. Math. Comput.
Yulin Gai, Yue Sun, Ming Chen, Libing Wu, Kaixiang Peng, Huanqing Wang
2026 J jnl
Neurocomputing
Chuanfang Zhang, Wenxiao Yin, Kaixiang Peng, Xueyi Zhang
2026 J jnl
Appl. Soft Comput.
Chuanfang Zhang, Zhibin Huang, Hanwen Zhang, Wenxiao Yin, Kaixiang Peng
2026 J jnl
IEEE Internet Things J.
Haozhou Yuan, Xu Yang, Jingjing Gao, Jian Huang, Xian Zhou, Kaixiang Peng
2026 J jnl
IEEE Trans. Cybern.
Dongjie Hua, Jie Dong, Kaixiang Peng, Silvio Simani, Daye Li, Jianing Hou
2026 J jnl
Int. J. Syst. Sci.
Yulin Gai, Ming Chen, Huanqing Wang, Libing Wu, Kaixiang Peng
2026 J jnl
Expert Syst. Appl.
Hanwen Zhang, Wenxiao Yin, Chuanfang Zhang, Qiang Min, Ruihua Jiao, Kaixiang Peng
2026 J jnl
CoRR
En Fu, Yanyan Hu, Changhua Hu, Zengwang Jin, Kaixiang Peng
2026 J jnl
Appl. Soft Comput.
Kaixiang Peng, Wenbo Zhang, Qichun Zhang, Jie Dong
2026 J jnl
Int. J. Control
Yue Sun, Ming Chen, Kaixiang Peng, Libing Wu, Cungen Liu
2026 J jnl
IEEE Internet Things J.
Chi Zhang, Xueyi Zhang, Jie Dong, Liang Ma, Chuanfang Zhang, Kaixiang Peng
2025 J jnl
IEEE Trans. Ind. Informatics
Linlin Li, Steven X. Ding, Chenyang Wang, Maiying Zhong, Kaixiang Peng
2025 J jnl
Appl. Soft Comput.
Chuanfang Zhang, Wenxiao Yin, Chi Zhang, Kaixiang Peng, Xueyi Zhang
2025 J jnl
IEEE Trans. Instrum. Meas.
Dongjie Hua, Jie Dong, Kaixiang Peng, Qichun Zhang
2025 J jnl
IEEE Trans. Instrum. Meas.
Xin Qin, Kaixiang Peng, Hongjun Zhang
2025 J jnl
IEEE Trans. Instrum. Meas.
Jie Dong, Daye Li, Yanmei Wei, Kaixiang Peng
2025 J jnl
Appl. Intell.
Chuanfang Zhang, Wenxiao Yin, Kaixiang Peng, Xueyi Zhang
2025 J jnl
Reliab. Eng. Syst. Saf.
Jie Dong, Daye Li, Zhiyu Cong, Kaixiang Peng
2025 J jnl
Int. J. Prod. Res.
Kaixiang Peng, Yuzhe Wei, Tie Li, Xin Qin, Jie Dong
2025 J jnl
Eng. Appl. Artif. Intell.
Liang Ma, Qikai Yang, Orestes Llanes-Santiago, Kaixiang Peng
2025 J jnl
Int. J. Prod. Res.
Qingquan Xu, Jie Dong, Kaixiang Peng
2025 J jnl
Adv. Eng. Informatics
Liang Ma, Qikai Yang, Kaixiang Peng
2025 J jnl
IEEE Trans. Ind. Informatics
Dongjie Hua, Jie Dong, Kaixiang Peng, Silvio Simani
2025 J jnl
J. Frankl. Inst.
Sijie Peng, Yanyan Hu, Nannan Cheng, Qing Li, Kaixiang Peng
2025 J jnl
IEEE Trans. Cybern.
Xinyu Guan, Yanyan Hu, Kaixiang Peng
2025 J jnl
Int. J. Fuzzy Syst.
Ming Chen, Xiao Yu, Xiaoxuan Jiao, Kaixiang Peng, Li-Bing Wu
2025 J jnl
J. Frankl. Inst.
Jingjing Gao, Dong Zhao, Xu Yang, Jian Huang, Xian Zhou, Kaixiang Peng
2025 J jnl
Neurocomputing
Xufeng Lin, Yanyan Hu, Xuechun Zhang, Kaixiang Peng
2025 J jnl
Neural Comput. Appl.
Boning Li, Ming Chen, Shuchang Qi, Kaixiang Peng
2025 J jnl
IEEE Trans. Instrum. Meas.
Xu Yang, Tengyu Guo, Jian Huang, Yinghao Zhao, Xian Zhou, Kaixiang Peng
2025 J jnl
IEEE CAA J. Autom. Sinica
Xuerui Cao, Kaixiang Peng, Ruihua Jiao
2025 J jnl
IEEE Trans. Autom. Control.
Linlin Li, Steven X. Ding, Maiying Zhong, Kaixiang Peng
2025 J jnl
Neurocomputing
Jingjing Gao, Feng Gao, Zhengxuan Zhang, Xu Yang, Jian Huang, Kaixiang Peng
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Chi Zhang, Jie Dong, Kaixiang Peng, Hanwen Zhang
2025 J jnl
IEEE Trans. Instrum. Meas.
Hanwen Zhang, Houze Guo, Jun Shang, Kaixiang Peng
2025 J jnl
J. Control. Decis.
Hongji Qi, Ming Chen, Kaixiang Peng, Libing Wu
2025 J jnl
IEEE Trans. Artif. Intell.
Jian Huang, Zizhuo Liu, Xu Yang, Yupeng Liu, Zhaomin Lv, Kaixiang Peng, Okan K. Ersoy
2024 J jnl
IEEE Trans. Instrum. Meas.
Qingquan Xu, Jie Dong, Kaixiang Peng, Qichun Zhang
2024 J jnl
IEEE Trans. Ind. Informatics
Xueyi Zhang, Liang Ma, Kaixiang Peng, Chuanfang Zhang
2024 J jnl
IEEE Trans. Instrum. Meas.
Kaixiang Peng, Jiahao Wang, Hui Yang, Xin Qin
2024 J jnl
IEEE Trans. Instrum. Meas.
Liang Ma, Mengwei Wang, Kaixiang Peng
2024 J jnl
IEEE Trans. Instrum. Meas.
Chi Zhang, Jie Dong, Sikun Meng, Zhiyu Cong, Kaixiang Peng
2024 J jnl
Expert Syst. Appl.
Xueyi Zhang, Liang Ma, Kaixiang Peng, Chuanfang Zhang, Muhammad Asfandyar Shahid
2024 J jnl
Expert Syst. Appl.
Liang Ma, Mengwei Wang, Kaixiang Peng
2024 J jnl
Expert Syst. Appl.
Qingquan Xu, Jie Dong, Kaixiang Peng, Xuyan Yang
2024 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Xuerui Cao, Kaixiang Peng
2024 J jnl
Int. J. Fuzzy Syst.
Hongji Qi, Ming Chen, Kaixiang Peng
2024 J jnl
Comput. Ind. Eng.
Xuerui Cao, Kaixiang Peng, Ruihua Jiao
2024 J jnl
IEEE Trans Autom. Sci. Eng.
Jinghui Pan, Lili Qu, Kaixiang Peng
2024 C conf
ICARCV
Xinyu Guan, Yanyan Hu, Kaixiang Peng
2024 J jnl
Int. J. Syst. Sci.
Yue Sun, Ming Chen, Kaixiang Peng, Libing Wu, Cungen Liu
2024 J jnl
Appl. Math. Comput.
Xinyu Guan, Yanyan Hu, Kaixiang Peng
2024 J jnl
Int. J. Fuzzy Syst.
Yue Sun, Ming Chen, Kaixiang Peng, Li-Bing Wu, Cungen Liu
2024 J jnl
Neural Networks
Qing Li, Yangfan Wang, Jie Dong, Chi Zhang, Kaixiang Peng
2024 J jnl
IEEE Trans. Ind. Informatics
Liang Ma, Pingping Yang, Kaixiang Peng
2024 J jnl
IEEE Trans Autom. Sci. Eng.
Liang Ma, Mengwei Wang, Kaixiang Peng
2024 J jnl
IEEE Trans. Instrum. Meas.
Jian Huang, Xiaoyang Sun, Xu Yang, Kaixiang Peng
2024 J jnl
J. Syst. Control. Eng.
Xia Wu, Xu Yang, Jian Huang, Kaixiang Peng
2024 J jnl
Expert Syst. Appl.
Chi Zhang, Jie Dong, Kaixiang Peng, Ruitao Sun
2024 J jnl
IEEE Trans. Netw. Sci. Eng.
Xinyu Guan, Yanyan Hu, Kaixiang Peng
2024 J jnl
CoRR
En Fu, Yanyan Hu, Kaixiang Peng, Yuxin Chu
2024 J jnl
Reliab. Eng. Syst. Saf.
En Fu, Yanyan Hu, Kaixiang Peng, Yuxin Chu
2024 J jnl
CoRR
Linlin Li, Steven X. Ding, Liutao Zhou, Maiying Zhong, Kaixiang Peng
2024 J jnl
IEEE Trans. Instrum. Meas.
Jie Dong, Ruitao Sun, Chi Zhang, Kaixiang Peng
2024 J jnl
IEEE Trans. Fuzzy Syst.
Linlin Li, Haili Zhang, Steven X. Ding, Liang Qiao, Kaixiang Peng, Xin Peng
2023 J jnl
IEEE Trans. Ind. Informatics
Peng Tang, Kaixiang Peng, Zhiwen Chen, Jie Dong
2023 J jnl
IEEE Trans. Instrum. Meas.
Chuanfang Zhang, Kaixiang Peng, Jie Dong, Xueyi Zhang, Kaixuan Yang
2023 conf
ICPS
Liang Ma, Fuzhong Shi, Zijing Wu, Kaixiang Peng
2023 J jnl
Appl. Soft Comput.
Chuanfang Zhang, Kaixiang Peng, Jie Dong, Long Miao
2023 J jnl
IEEE Trans. Fuzzy Syst.
Ming Chen, Yingsen Li, Huanqing Wang, Kaixiang Peng, Libing Wu
2023 J jnl
IEEE Trans. Instrum. Meas.
Liang Ma, Mengwei Wang, Kaixiang Peng
2023 J jnl
J. Field Robotics
Jinghui Pan, Lili Qu, Kaixiang Peng
2023 J jnl
IEEE Trans. Instrum. Meas.
Cuicui Zhang, Jie Dong, Hongjun Zhang, Kaixiang Peng
2023 conf
ICPS
Chuanfang Zhang, Kaixiang Peng, Jie Dong, Liang Ma, Yangfan Wang, Dongjie Hua
2023 J jnl
Int. J. Control
Ming Chen, Siyu An, Kaixiang Peng, Hongyan Sun
2023 J jnl
Entropy
Jinghui Pan, Kaixiang Peng, Weicun Zhang
2023 J jnl
IEEE Trans. Instrum. Meas.
Jie Dong, Keren Cao, Kaixiang Peng
2023 J jnl
J. Field Robotics
Jinghui Pan, Lili Qu, Kaixiang Peng
2023 J jnl
IEEE Trans. Instrum. Meas.
Xuerui Cao, Kaixiang Peng
2022 J jnl
IEEE Trans. Instrum. Meas.
Jie Dong, Yaqi Wang, Kaixiang Peng
2022 J jnl
IEEE Trans. Control. Syst. Technol.
Liang Ma, Jie Dong, Kaixiang Peng
2022 J jnl
IEEE Trans. Instrum. Meas.
Jie Dong, Lingzhi Jiang, Chi Zhang, Kaixiang Peng
2022 J jnl
IEEE Trans. Instrum. Meas.
Liang Ma, Jie Dong, Kaixiang Peng
2022 J jnl
IEEE Trans. Ind. Electron.
Shannan Luo, Kaixiang Peng, Changbin Hu, Steven X. Ding, Hui Fan
2022 J jnl
Int. J. Syst. Sci.
Hongjun Zhang, Chi Zhang, Jie Dong, Kaixiang Peng
2022 J jnl
Neurocomputing
Liang Ma, Mengwei Wang, Jie Dong, Kaixiang Peng
2022 J jnl
J. Frankl. Inst.
Peng Tang, Kaixiang Peng, Ruihua Jiao
2022 B conf
SMC
Chuanfang Zhang, Kaixiang Peng, Jie Dong, Xueyi Zhang
2022 J jnl
Auton. Intell. Syst.
Shu Liang, Peng Yi, Yiguang Hong, Kaixiang Peng
2022 J jnl
Expert Syst. Appl.
Chuanfang Zhang, Kaixiang Peng, Jie Dong, Xueyi Zhang
2021 conf
CAA SAFEPROCESS
Yingxin Guo, Xueyi Zhang, Liang Ma, Kaixiang Peng
2021 J jnl
IEEE Trans. Ind. Informatics
Kai Zhang, Kaixiang Peng, Shanshan Zhao, Fan Wang
2021 conf
CAA SAFEPROCESS
Liang Ma, Xueyi Zhang, Kaixiang Peng, Jie Dong
2021 J jnl
Neurocomputing
Liang Ma, Jie Dong, Changjun Hu, Kaixiang Peng
2021 conf
CAA SAFEPROCESS
Yinghao Zhao, Xu Yang, Xia Wu, Jian Huang, Kaixiang Peng
2021 J jnl
Expert Syst. Appl.
Chuanfang Zhang, Kaixiang Peng, Jie Dong
2021 J jnl
IEEE Trans. Control. Syst. Technol.
Shuang Zhang, Rui Liu, Kaixiang Peng, Wei He
2021 conf
CAA SAFEPROCESS
Pengxue Lang, Kaixiang Peng, Jiapeng Cui, Jie Yang, Yingxin Guo
2021 J jnl
IEEE Trans. Ind. Informatics
Jian Huang, Xu Yang, Kaixiang Peng
2021 conf
CAA SAFEPROCESS
Jiapeng Cui, Kaixiang Peng, Pengxue Lang, Shuai Lu
2021 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Shuang Zhang, Pengxin Yang, Linghuan Kong, Wenshi Chen, Qiang Fu, Kaixiang Peng
2021 conf
CAA SAFEPROCESS
Hongjun Zhang, Chuanfang Zhang, Kaixiang Peng, Jie Dong, Liang Ma, Xueyi Zhang
2021 J jnl
IEEE CAA J. Autom. Sinica
Ruihua Jiao, Kaixiang Peng, Jie Dong
2021 conf
CAA SAFEPROCESS
Qiang Wang, Kaixiang Peng, Xuerui Cao
2021 J jnl
Entropy
Jinghui Pan, Lili Qu, Kaixiang Peng
2020 J jnl
IEEE Trans. Ind. Electron.
Kai Zhang, Kaixiang Peng, Steven X. Ding, Zhiwen Chen, Xu Yang
2020 J jnl
IEEE Trans. Ind. Electron.
Liang Ma, Jie Dong, Kaixiang Peng
2020 J jnl
IEEE Trans. Ind. Informatics
Liang Ma, Jie Dong, Kaixiang Peng
2020 J jnl
Neurocomputing
Jie Dong, Chi Zhang, Kaixiang Peng
2020 J jnl
Autom.
Xu Yang, Jingjing Gao, Linlin Li, Hao Luo, Steven X. Ding, Kaixiang Peng
2020 J jnl
Reliab. Eng. Syst. Saf.
Ruihua Jiao, Kaixiang Peng, Jie Dong, Chuanfang Zhang
2020 J jnl
IEEE Access
Jie Dong, Yingze Tian, Kaixiang Peng
2020 J jnl
IEEE Access
Peng Tang, Kaixiang Peng, Jie Dong, Kai Zhang, Shanshan Zhao
2020 J jnl
IEEE Trans. Ind. Informatics
Linlin Li, Steven X. Ding, Hao Luo, Kaixiang Peng, Ying Yang
2020 J jnl
IEEE Trans. Instrum. Meas.
Ruihua Jiao, Kaixiang Peng, Jie Dong
2020 J jnl
Int. J. Syst. Sci.
Hailong Tan, Bo Shen, Kaixiang Peng, Hongjian Liu
2019 conf
CAA SAFEPROCESS
Tianjing Qi, Kai Zhang, Kaixiang Peng, Shanshan Zhao
2019 J jnl
IEEE Access
Kaixiang Peng, Zhihao Ren, Jie Dong, Liang Ma
2019 conf
CAA SAFEPROCESS
Ruihua Jiao, Kaixiang Peng, Kai Zhang, Liang Ma, Yanting Pi
2019 J jnl
Neurocomputing
Kaixiang Peng, Ruihua Jiao, Jie Dong, Yanting Pi
2019 J jnl
Neurocomputing
Chuanfang Zhang, Kaixiang Peng, Jie Dong
2019 J jnl
IEEE Access
Linlin Li, Steven X. Ding, Kaixiang Peng, Jianbin Qiu, Ying Yang
2019 J jnl
IEEE Trans. Ind. Informatics
Liang Ma, Jie Dong, Kaixiang Peng, Chuanfang Zhang
2019 J jnl
Fuzzy Sets Syst.
Ling Wang, Jianyao Meng, RuiXia Huang, Hui Zhu, Kaixiang Peng
2019 J jnl
Autom.
Linlin Li, Hao Luo, Steven X. Ding, Ying Yang, Kaixiang Peng
2019 J jnl
IEEE Access
Jie Dong, Ruiqi Sun, Kaixiang Peng, Zhijie Shi, Liang Ma
2018 J jnl
IEEE Trans. Ind. Informatics
Kai Zhang, Kaixiang Peng, Jie Dong
2018 J jnl
IEEE Access
Kai Zhang, Kaixiang Peng, Yuri A. W. Shardt
2018 J jnl
IEEE Trans. Fuzzy Syst.
Linlin Li, Steven X. Ding, Ying Yang, Kaixiang Peng, Jianbin Qiu
2018 J jnl
J. Frankl. Inst.
Liang Ma, Jie Dong, Kaixiang Peng
2018 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Shuang Zhang, Yiting Dong, Yuncheng Ouyang, Zhao Yin, Kaixiang Peng
2018 J jnl
IEEE Access
Jie Dong, Qiang Wang, Mengyuan Wang, Kaixiang Peng
2018 J jnl
Neurocomputing
Kai Zhang, Kaixiang Peng, Ruohui Chu, Jie Dong
2018 J jnl
Appl. Soft Comput.
Ling Wang, Jianyao Meng, Peipei Xu, Kaixiang Peng
2018 J jnl
Neurocomputing
Liang Ma, Jie Dong, Kaixiang Peng
2018 J jnl
J. Control. Sci. Eng.
Yanyan Hu, Xiaoling Xue, Zengwang Jin, Kaixiang Peng
2017 J jnl
J. Frankl. Inst.
Kai Zhang, Jie Dong, Kaixiang Peng
2017 J jnl
J. Control. Sci. Eng.
Kaixiang Peng, Bingzheng Wang, Jie Dong
2017 J jnl
Autom.
Linlin Li, Steven X. Ding, Jianbin Qiu, Kaixiang Peng, Ying Yang
2017 J jnl
J. Frankl. Inst.
Kai Zhang, Steven X. Ding, Yuri A. W. Shardt, Zhiwen Chen, Kaixiang Peng
2017 J jnl
Neurocomputing
Kaixiang Peng, Mengyuan Wang, Jie Dong
2017 J jnl
IEEE Access
Jie Dong, Mengyuan Wang, Xiong Zhang, Liang Ma, Kaixiang Peng
2017 J jnl
J. Control. Sci. Eng.
Yanyan Hu, Shuai Qi, Xiaoling Xue, Kaixiang Peng
2016 J jnl
IEEE Trans. Ind. Electron.
Kaixiang Peng, Kai Zhang, Bo You, Jie Dong, Zidong Wang
2016 conf
CDC
Kai Zhang, Yuri A. W. Shardt, Zhiwen Chen, Steven X. Ding, Kaixiang Peng
2016 J jnl
J. Intell. Fuzzy Syst.
Ling Wang, Shu-Lin Li, Hua Sun, Kaixiang Peng
2016 J jnl
IEEE Trans. Ind. Electron.
Xu Yang, Hao Luo, Minjia Krueger, Steven X. Ding, Kaixiang Peng
2016 J jnl
J. Frankl. Inst.
Guang Wang, Hao Luo, Kaixiang Peng
2016 J jnl
Neurocomputing
Kaixiang Peng, Qianqian Li, Kai Zhang, Jie Dong
2015 J jnl
Neurocomputing
Jie Dong, Kai Zhang, Ya Huang, Gang Li, Kaixiang Peng
2015 J jnl
Neurocomputing
Kaixiang Peng, Kai Zhang, Bo You, Jie Dong
2015 J jnl
J. Frankl. Inst.
Kaixiang Peng, Kai Zhang, Jie Dong, Bo You
2014 J jnl
J. Frankl. Inst.
Kaixiang Peng, Kai Zhang, Jie Dong, Xu Yang
2013 J jnl
IEEE Trans. Ind. Informatics
Steven X. Ding, Shen Yin, Kaixiang Peng, Haiyang Hao, Bo Shen
2012 C conf
IECON
Shen Yin, Zuolong Wei, Huijun Gao, Kaixiang Peng
2010 C conf
ICARCV
Jie Dong, Xueming Ma, Kaixiang Peng
2010 C conf
ICARCV
Kaixiang Peng, Jie Dong
2009 conf
ICNC (1)
Kaixiang Peng, Xuli Zhang
2005 C conf
ACC
Zhenglin Wang, Yikang Sun, Kaixiang Peng
redb/extractors/decompiler/bninja/analysis/low_level.py
← Index redb/extractors/decompiler/bninja/analysis/low_level.py python
import time

from binaryninja import (
    LowLevelILInstruction,
)
from binaryninja import (
    LowLevelILOperation as LLIL_OP,
)
from binaryninja.lowlevelil import (
    LowLevelILAdd,
    LowLevelILConst,
    LowLevelILConstPtr,
    LowLevelILLoad,
    LowLevelILLsl,
    LowLevelILMul,
    LowLevelILPop,
    LowLevelILPush,
    LowLevelILReg,
    LowLevelILStore,
    LowLevelILSub,
)

# Support both package and standalone imports
try:
    from ..function_type import FunctionTypeAnalysis
    from ..similarity.minhasher import MinHasher, TokenKind
    from ..utils.hashes import calculate_sha256, calculate_tlsh
    from .low_level_normalization import LowLevelNormalization

except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.analysis.low_level_normalization import LowLevelNormalization
    from redb.extractors.decompiler.bninja.similarity.minhasher import MinHasher
    from redb.extractors.decompiler.bninja.function_type import FunctionTypeAnalysis
    from redb.extractors.decompiler.bninja.utils.hashes import calculate_sha256, calculate_tlsh

class LowLevelAnalysis:
    def __init__(self, function, bv, logger):
        self.function = function
        self.name = function.name
        self.start = function.start
        self.llil_func = function.llil
        self.bv = bv
        self.logger = logger
        self.errors = []

    def log_error(
        self, message, function_name, address, exception=None, error_location="unknown"
    ):
        """Log an error during processing."""
        error_msg = f"Error in function {function_name} at {address}: {message}"
        if exception:
            error_msg += f" - {str(exception)}"
        self.logger.error(error_msg)

        # Add to errors list
        error = {
            "function_name": function_name,
            "function_address": str(address),
            "error_location": error_location,
            "error_message": message,
            "error_details": str(exception) if exception else "",
            "error_type": type(exception).__name__ if exception else "Unknown",
            "timestamp": int(time.time() * 1000),
        }
        self.errors.append(error)

    def count_control_flow_instructions(self):
        if self.llil_func is None:
            return 0

        count = 0
        for basic_block in self.llil_func.basic_blocks:
            for ins in basic_block:
                op = ins.operation
                if op in (
                    LLIL_OP.LLIL_IF,
                    LLIL_OP.LLIL_GOTO,
                    LLIL_OP.LLIL_JUMP,
                    LLIL_OP.LLIL_JUMP_TO,
                    LLIL_OP.LLIL_CALL,
                    LLIL_OP.LLIL_CALL_SSA,
                ):
                    count += 1

        return count

    def collect_memory_patterns(self):
        """ """
        patterns = set()

        try:
            llil = self.llil_func
            arch = self.bv.arch
            sp_name = arch.stack_pointer if arch and arch.stack_pointer else "sp"

            def analyze_addr(addr_expr, might_be_direct):
                """
                Visit the expression for the address and understand whether it has a direct, scaled, base offset, etc.
                access to memory
                """
                found = {
                    "direct": False,
                    "scaled": False,
                    "base_off": False,
                    "stack": False,
                    "string": False,
                }

                def addr_cb(n):
                    # stack (SP/BP-like)
                    match n:
                        case LowLevelILReg(src=reg):
                            if reg == sp_name:
                                found["stack"] = True

                        case LowLevelILConst() | LowLevelILConstPtr():
                            if might_be_direct:
                                found["direct"] = True

                        # base +/- const
                        case (
                            LowLevelILAdd(left=l, right=r)
                            | LowLevelILSub(left=l, right=r)
                        ):
                            l_is_reg = isinstance(l, LowLevelILReg)
                            r_is_reg = isinstance(r, LowLevelILReg)
                            l_is_cst = isinstance(
                                l, (LowLevelILConst, LowLevelILConstPtr)
                            )
                            r_is_cst = isinstance(
                                r, (LowLevelILConst, LowLevelILConstPtr)
                            )
                            if (l_is_reg and r_is_cst) or (r_is_reg and l_is_cst):
                                found["base_off"] = True

                        # scaled index (index*scale) or shift (index << k)
                        case LowLevelILMul(left=l, right=r):
                            if (
                                isinstance(l, LowLevelILReg)
                                and isinstance(r, LowLevelILConst)
                            ) or (
                                isinstance(r, LowLevelILReg)
                                and isinstance(l, LowLevelILConst)
                            ):
                                found["scaled"] = True

                        case LowLevelILLsl(left, right):
                            if isinstance(left, LowLevelILReg) and isinstance(
                                right, LowLevelILConst
                            ):
                                found["scaled"] = True

                    return None

                _ = list(addr_expr.traverse(addr_cb))

                if found["direct"]:
                    patterns.add("MEM_DIRECT")
                if found["scaled"]:
                    patterns.add("MEM_SCALED_INDEX")
                if found["base_off"]:
                    patterns.add("MEM_BASE_OFFSET")
                if found["stack"]:
                    patterns.add("MEM_STACK")
                elif found["string"]:
                    patterns.add("MEM_STRING")

            def func_cb(i):
                match i:
                    case LowLevelILPush(src=addr):
                        analyze_addr(addr, False)
                    case LowLevelILPop(src=addr):
                        analyze_addr(addr, False)
                    case LowLevelILLoad(src=addr):
                        analyze_addr(addr, True)
                    case LowLevelILStore(dest=addr, src=_):
                        analyze_addr(addr, True)

                return None

            # complete visit for the single instruction
            _ = list(llil.traverse(func_cb))

            return sorted(patterns)

        except Exception as e:
            self.log_error(
                "Failed to collect memory patterns via LLIL.traverse",
                self.name,
                self.start,
                e,
                "collect_memory_patterns",
            )
            return []

    def collect_register_usage(self):
        """
        Collect frequencies for register usage
        """
        try:
            llil = self.llil_func

            register_usage = {}

            def inc(reg, kind):
                if reg is None:
                    return
                entry = register_usage.setdefault(reg, {"reads": 0, "writes": 0})
                entry[kind] += 1

            if not llil:
                return {}, 0, 0

            for top_il in llil.instructions:
                registers_read = self.function.get_regs_read_by(
                    top_il.address, self.bv.arch
                )
                registers_write = self.function.get_regs_written_by(
                    top_il.address, self.bv.arch
                )

                for reg_read in registers_read:
                    inc(reg_read, "reads")

                for reg_write in registers_write:
                    inc(reg_write, "writes")

            total_reads = sum(entry["reads"] for entry in register_usage.values())
            total_writes = sum(entry["writes"] for entry in register_usage.values())

            return register_usage, total_reads, total_writes

        except Exception as e:
            self.log_error(
                "Failed to collect register usage via LLIL.traverse",
                self.name,
                self.start,
                e,
                "collect_register_usage",
            )
            return {}, 0, 0

    def _classify_address(self, bv, addr):
        """
        Classification of the address
        """
        info = {
            "address": addr,
            "section": None,
            "segment_writable": None,
            "symbol": None,
            "kind": None,  # "string", "function_ptr", "data_var", "symbol", "unknown"
            "datatype": None,  # es. "char *", "int32_t", "my_struct", ...
            "note": None,
        }

        # section / segment
        sec = bv.get_section_at(addr)
        seg = bv.get_segment_at(addr)
        if sec:
            info["section"] = sec.name
        if seg:
            info["segment_writable"] = bool(seg.writable)

        sym = bv.get_symbol_at(addr)
        if sym:
            info["symbol"] = sym.full_name

        # function pointer
        try:
            fns = list(bv.get_functions_at(addr))
        except Exception:
            # some versions have get_function_at(addr) that returns a single object or None
            fns = [bv.get_function_at(addr)] if hasattr(bv, "get_function_at") else []
        fns = [f for f in fns if f]
        if fns:
            info["kind"] = "function_ptr"
            info["datatype"] = "func"
            info["note"] = f"points to function {fns[0].name}"
            return info

        # string
        sref = bv.get_string_at(addr)
        if sref:
            info["kind"] = "string"
            # sref.type:
            info["datatype"] = (
                getattr(sref, "type", None).__class__.__name__
                if hasattr(sref, "type")
                else "string"
            )
            return info

        # data typed variable
        dv = bv.get_data_var_at(addr)
        if dv:
            info["kind"] = "data_var"
            info["datatype"] = str(dv.type) if getattr(dv, "type", None) else None
            if getattr(dv, "name", None):
                info["symbol"] = dv.name if not info["symbol"] else info["symbol"]
            return info

        # only symbol (no data var)
        if sym and not info["kind"]:
            info["kind"] = "symbol"
            return info

        # unknown
        info["kind"] = "unknown"
        return info

    def count_data_references(self):
        """Count the number of data references in a function using LLIL."""
        count = 0

        if self.llil_func is None:
            return 0

        try:
            # Iterate LLIL basic blocks and instructions
            for instr in self.llil_func.instructions:
                instr_str = str(instr)
                logged = False
                src = None

                # Check for constant dereferencing or symbolic refs
                if hasattr(instr, "src"):
                    src = instr.src
                    if isinstance(src, (LowLevelILConstPtr, LowLevelILConst)):
                        count += 1
                        logged = True

                if not logged and "_" in instr_str:
                    count += 1

                # If src is a pointer constant, check if it lands in a writable data segment
                if src is not None and isinstance(src, LowLevelILConstPtr):
                    addr = src.constant
                    segment = self.bv.get_segment_at(addr)
                    if segment and segment.writable:
                        count += 1

        except Exception as e:
            self.logger.warning(
                f"Failed to use LLIL for counting data references in "
                f"{self.name} at {self.start}: {e}"
            )
        return count

    def compute_num_calls(self):
        c = 0

        if not self.llil_func:
            return 0

        for instr in self.llil_func.instructions:
            if instr.operation in (LLIL_OP.LLIL_CALL, LLIL_OP.LLIL_TAILCALL):
                c += 1
        return c

    def compute_max_block_size(self):
        """Compute the maximum basic block size in a function."""
        if self.llil_func is None:
            return 0

        max_size = 0
        for block in self.llil_func.basic_blocks:
            try:
                # Count instructions in this block using the direct length approach
                # This avoids UTF-8 decoding issues entirely
                block_size = block.instruction_count
                max_size = max(max_size, block_size)
            except Exception as e:
                self.log_error(
                    f"[HandledError] computing max block size: {e}",
                    self.name,
                    self.start,
                    e,
                    "compute_max_block_size",
                )
        return max_size

    def estimate_stack_size(self):
        """Estimate the stack size used by a function."""
        try:
            # Binary Ninja provides a stack adjustment value for functions
            # Need to convert OffsetWithConfidence to a plain integer
            stack_adjust = self.function.stack_adjustment
            if hasattr(stack_adjust, "value"):  # Handle OffsetWithConfidence objects
                return stack_adjust.value
            return stack_adjust
        except Exception as e:
            self.log_error(
                "Failed to estimate stack size",
                self.name,
                self.start,
                e,
                "estimate_stack_size",
            )
            return -1

    def collect_instruction_types(self):
        def iter_llil_tree(root_il):
            stack = [root_il]
            while stack:
                il_single_op = stack.pop()
                if not isinstance(il_single_op, LowLevelILInstruction):
                    continue
                yield il_single_op
                for il_operand in il_single_op.operands:
                    if isinstance(il_operand, LowLevelILInstruction):
                        stack.append(il_operand)
                    elif isinstance(il_operand, (list, tuple)):
                        for sub in il_operand:
                            if isinstance(sub, LowLevelILInstruction):
                                stack.append(sub)

        type_frequencies = {}
        try:
            if self.llil_func is None:
                return type_frequencies

            il_func = self.llil_func

            for top_il in il_func.instructions:
                for il in iter_llil_tree(top_il):
                    op = getattr(il, "operation", None)
                    if op is None:
                        continue

                    category = str(op)

                    if category in type_frequencies:
                        type_frequencies[category] += 1
                    else:
                        type_frequencies[category] = 1

        except Exception as e:
            self.log_error(
                "Failed to collect LLIL instruction types",
               self.name,
                self.start,
                e,
                "collect_instruction_types_llil",
            )

        return type_frequencies

    def _collect_low_level_with_type(self):
        llil = self.llil_func
        if not llil:
            return [], []

        start = self.start

        low_level = LowLevelNormalization()

        instrs_with_addr = []

        for il in llil.instructions:
            norm = low_level.normalize_instr_with_operands(il)

            # Clamp negative offsets to 0 for UInt32 compatibility.
            # Negative offsets (instruction before function start) may occur with
            # overlapping functions or tail-calls in obfuscated/malware binaries.
            # Multiple instructions at offset 0 indicates this anomaly and can be
            # queried to identify such samples easily than by checking logs.
            # Triggered by 590ecad54cd9e1c8681509420ad56edde8b064ffbf884ce6cd8dd28eebb95ae1
            offset = il.address - start
            if offset < 0:
                offset = 0

            instrs_with_addr.append((offset, norm))

        return instrs_with_addr

    def _collect_low_level_and_with_addr(self):
        llil = self.llil_func
        if not llil:
            return [], []

        start = self.start

        low_level = LowLevelNormalization()

        instrs = []
        instrs_with_addr = []

        for il in llil.instructions:
            norm = low_level.normalize_instruction_all_levels(il)

            instrs.append(norm)

            # Clamp negative offsets to 0 for UInt32 compatibility.
            # Negative offsets (instruction before function start) may occur with
            # overlapping functions or tail-calls in obfuscated/malware binaries.
            # Multiple instructions at offset 0 indicates this anomaly and can be
            # queried to identify such samples easily than by checking logs.
            # Triggered by 590ecad54cd9e1c8681509420ad56edde8b064ffbf884ce6cd8dd28eebb95ae1
            offset = il.address - start
            if offset < 0:
                offset = 0

            instrs_with_addr.append((offset, norm))

        return instrs, instrs_with_addr


    def analyze(self):
        registers_uses, total_reads, total_written = self.collect_register_usage()
        instr_low_level, body_llil_vector = self._collect_low_level_and_with_addr()
        instr_low_level_str = str(instr_low_level)
        instructions_low_level = calculate_sha256(instr_low_level_str)
        instructions_low_level_tlsh = calculate_tlsh(instr_low_level_str)

        instr_typed_llil = self._collect_low_level_with_type()
        instr_typed_low_level_str = str(instr_typed_llil)
        instructions_typed_low_level = calculate_sha256(instr_typed_low_level_str)
        instructions_typed_low_level_tlsh = calculate_tlsh(instr_typed_low_level_str)

        seed = 0xdeadbeef
        minhash_llil_skeleton = MinHasher(seed, self.llil_func, TokenKind.LLIL).calculateMinHash()
        minhash_llil_typed = MinHasher(seed, self.llil_func, TokenKind.TYPED_LLIL).calculateMinHash()

        low_level_json = {
            "function_address": self.start,
            "function_type": FunctionTypeAnalysis(self.function)
            .get_function_type()
            .name,
            "body_llil_vector": body_llil_vector,
            "sha256_llil": instructions_low_level,
            "tlsh_llil": instructions_low_level_tlsh,
            "minhash_llil_skeleton": minhash_llil_skeleton,
            "instructions_types_llil": list(self.collect_instruction_types()),
            "instruction_typed_llil": instructions_typed_low_level,
            "tlsh_instruction_typed_llil": instructions_typed_low_level_tlsh,
            "minhash_llil_typed": minhash_llil_typed,
            "control_flow_count_llil": self.count_control_flow_instructions(),
            "memory_access_pattern_llil": self.collect_memory_patterns(),
            "register_usage": registers_uses,
            "total_reg_reads": total_reads,
            "total_reg_written": total_written,
            "data_references_count": self.count_data_references(),
            "max_block_size": self.compute_max_block_size(),
            "num_calls": self.compute_num_calls(),
            "stack_size": self.estimate_stack_size(),
        }

        return low_level_json, self.errors