Weihua Li

103 papers Journal 79Unranked 24
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Ind. Electron.
Haiyang Wan, Runhui Feng, Yue Chen, Xiaoxin Wang, Han Chen, Tucan Chen, Weihua Li, Zhuyun Chen, Zhuangjian Liu, Jian Jiao, Raye Chen-Hua Yeow
2026 J jnl
IEEE Trans Autom. Sci. Eng.
Jipu Li, Ke Yue, Zhuyun Chen, Jingyan Xia, Weihua Li, Xiaoge Zhang
2026 J jnl
J. Ind. Inf. Integr.
Jiaxian Chen, Yujie Xu, Jie Tang, Xuemiao Xu, Ruqiang Yan, Zhixin Yang, Weihua Li
2026 J jnl
Adv. Eng. Informatics
Jiaxian Chen, Shuhan Deng, Guolin He, Zhuyun Chen, Weihua Li
2026 J jnl
IEEE Internet Things J.
Yuan Zheng, Guolin He, Wei Feng, Weihua Li
2026 J jnl
Knowl. Based Syst.
Zhuyun Chen, Hongqi Lin, Youpeng Gao, Jingke He, Zehao Li, Weihua Li, Qiang Liu
2026 J jnl
IEEE Commun. Surv. Tutorials
Jianhua Tang, Jiao Chen, Jiayi He, Fangfang Chen, Zuohong Lv, Guangjie Han, Zuozhu Liu, Howard H. Yang, Weihua Li
2026 J jnl
Appl. Soft Comput.
Ke Yue, Jipu Li, Shuhan Deng, Zhuyun Chen, Chee Keong Kwoh, Weihua Li
2026 J jnl
IEEE Trans. Cybern.
Hao Lan, Zhuyun Chen, Shuhan Deng, Ruyi Huang, Fugee Tsung, Weihua Li
2026 J jnl
Reliab. Eng. Syst. Saf.
Junyu Qi, Hamid Reza Karimi, Yannick Uhlmann, Zhuyun Chen, Weihua Li, Gernot Schullerus
2025 J jnl
J. Intell. Manuf.
Shuai Ma, Jiewu Leng, Pai Zheng, Zhuyun Chen, Bo Li, Weihua Li, Qiang Liu, Xin Chen
2025 J jnl
J. Intell. Manuf.
Jiaxian Chen, Dongpeng Li, Ruyi Huang, Zhuyun Chen, Weihua Li
2025 J jnl
IEEE Trans. Instrum. Meas.
Zhuyun Chen, Zehao Li, Youpeng Gao, Hongqi Lin, Weihua Li, Qiang Liu
2025 J jnl
IEEE Trans. Instrum. Meas.
Jiaxian Chen, Dongpeng Li, Ruyi Huang, Zhuyun Chen, Weihua Li
2025 J jnl
Expert Syst. Appl.
Haiyang Wan, Weihua Li, Xing Luo, Weichao Luo, Jian Jiao, Jipu Li, Bin Zhang, Zhuyun Chen
2025 J jnl
CoRR
Jiao Chen, Ruyi Huang, Zuohong Lv, Jianhua Tang, Weihua Li
2025 J jnl
IEEE Trans. Netw. Sci. Eng.
Jiao Chen, Jiayi He, Jianhua Tang, Weihua Li, Zihang Yin
2025 conf
I2MTC
Xu Tan, Jiaxian Chen, Guolin He, Shupeng Tan, Yan Shao, Weihua Li
2025 J jnl
IEEE Trans. Instrum. Meas.
Jipu Li, Ke Yue, Zhaoqian Wu, Fei Jiang, Zhi Zhong, Shaohui Zhang, Weihua Li
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Huibin Lin, Xiaofeng Huang, Zhuyun Chen, Guolin He, Ciyang Xi, Weihua Li
2025 J jnl
IEEE Internet Things J.
Yuan Zheng, Weihua Li, Guolin He, Zhuyun Chen, Chen Zheng
2025 J jnl
IEEE Trans. Cybern.
Yuan Zheng, Weihua Li, Guolin He, Kang Ding, Zhuyun Chen
2025 J jnl
CoRR
Jiao Chen, Weihua Li, Jianhua Tang
2025 J jnl
Big Data Cogn. Comput.
Chaofan Ling, Junpei Zhong, Weihua Li, Ran Dong, Mingjun Dai
2025 J jnl
IEEE Robotics Autom. Lett.
Kai Wu, Rongkang Chen, Qi Chen, Weihua Li
2025 conf
CASE
Dongpeng Li, Pai Zheng, Weihua Li
2025 J jnl
IEEE Trans. Instrum. Meas.
Ke Yue, Jipu Li, Zhuyun Chen, Junbin Chen, Weihua Li
2024 J jnl
IEEE Trans. Instrum. Meas.
Kai Wu, Yuan Lu, Ruyi Huang, Bernd Kuhlenkötter, Weihua Li
2024 J jnl
Eng. Appl. Artif. Intell.
Jingyan Xia, Zhuyun Chen, Jiaxian Chen, Guolin He, Ruyi Huang, Weihua Li
2024 J jnl
Expert Syst. Appl.
Shuai Ma, Jiewu Leng, Zhuyun Chen, Bo Li, Xing Li, Ding Zhang, Weihua Li, Qiang Liu
2024 J jnl
Reliab. Eng. Syst. Saf.
Ke Yue, Jipu Li, Shuhan Deng, Chee Keong Kwoh, Zhuyun Chen, Weihua Li
2024 J jnl
Expert Syst. Appl.
Ronghui Zhang, Jingtao Peng, Wanting Gou, Yuhang Ma, Junzhou Chen, Hongyu Hu, Weihua Li, Guodong Yin, ZhiWu Li
2024 conf
I2MTC
Hao Lan, Shuhan Deng, Ruyi Huang, Zhuyun Chen, Weihua Li
2024 J jnl
Expert Syst. Appl.
Jipu Li, Xiaoge Zhang, Ke Yue, Junbin Chen, Zhuyun Chen, Weihua Li
2024 J jnl
IEEE Multim.
Dongxin Fu, Shaowu Zheng, Pengcheng Xie, Weihua Li
2024 J jnl
IEEE Trans. Instrum. Meas.
Jingyan Xia, Ruyi Huang, Jipu Li, Zhuyun Chen, Weihua Li
2024 J jnl
IEEE Access
Gang Chen, Junlin Yuan, Yiyue Zhang, Hanyue Zhu, Ruyi Huang, Fengtao Wang, Weihua Li
2024 conf
I2MTC
Yuan Zheng, Weihua Li, Zhuyun Chen, Huibin Lin, Guolin He
2024 J jnl
Adv. Eng. Informatics
Fei Jiang, Weiqi Lin, Zhaoqian Wu, Shaohui Zhang, Zhuyun Chen, Weihua Li
2024 J jnl
IEEE Internet Things J.
Jiaxian Chen, Kairu Wen, Jingyan Xia, Ruyi Huang, Zhuyun Chen, Weihua Li
2024 conf
I2MTC
Jiaxian Chen, Dongpeng Li, Ruyi Huang, Zhuyun Chen, Weihua Li
2024 conf
ECCV Workshops (8)
Shaowu Zheng, Ruyi Huang, Yuan Ji, Ming Ye, Weihua Li
2024 conf
I2MTC
Ke Yue, Jipu Li, Zhuyun Chen, Junbin Chen, Weihua Li
2024 J jnl
IEEE Trans. Instrum. Meas.
Haiyang Wan, Weihua Li, Jian Jiao, Chuanpeng Ji, Weidong Xu, Yi He, Zhuyun Chen
2024 J jnl
CoRR
Jiao Chen, Jiayi He, Fangfang Chen, Zuohong Lv, Jianhua Tang, Weihua Li, Zuozhu Liu, Howard H. Yang, Guangjie Han
2024 conf
ECCV Workshops (8)
Shaowu Zheng, Ming Ye, Yuan Ji, Ruyi Huang, Weihua Li
2023 J jnl
IEEE Trans. Instrum. Meas.
Weihua Li, Jingke He, Huibin Lin, Ruyi Huang, Guolin He, Zhuyun Chen
2023 J jnl
IEEE Trans. Cybern.
Zhuyun Chen, Yixiao Liao, Jipu Li, Ruyi Huang, Lei Xu, Gang Jin, Weihua Li
2023 J jnl
IEEE Trans. Instrum. Meas.
Xiaoqing Yang, Guolin He, Kang Ding, Yuanzheng Li, Xiaoxi Ding, Weihua Li
2023 J jnl
Reliab. Eng. Syst. Saf.
Jingyan Xia, Ruyi Huang, Zhuyun Chen, Guolin He, Weihua Li
2023 J jnl
Reliab. Eng. Syst. Saf.
Jiaxian Chen, Dongpeng Li, Ruyi Huang, Zhuyun Chen, Weihua Li
2023 J jnl
CoRR
Chaofan Ling, Weihua Li, Junpei Zhong
2023 J jnl
IEEE Trans. Instrum. Meas.
Yong Xu, Hui Tao, Weihua Li, Yong Zhong
2023 conf
ICDL
Chaofan Ling, Weihua Li, Jingqiang Zeng, Junpei Zhong
2023 J jnl
Adv. Eng. Informatics
Jipu Li, Ruyi Huang, Zhuyun Chen, Guolin He, Konstantinos C. Gryllias, Weihua Li
2023 J jnl
Adv. Eng. Informatics
Zhuyun Chen, Jingyan Xia, Jipu Li, Junbin Chen, Ruyi Huang, Gang Jin, Weihua Li
2023 J jnl
Appl. Soft Comput.
Rugen Wang, Zhuyun Chen, Weihua Li
2023 conf
I2MTC
Kairu Wen, Ruyi Huang, Dongpeng Li, Zhuyun Chen, Weihua Li
2023 J jnl
IEEE Trans. Netw. Sci. Eng.
Jiao Chen, Jianhua Tang, Weihua Li
2023 J jnl
Sensors
Weidong Xu, Jingke He, Weihua Li, Yi He, Haiyang Wan, Wu Qin, Zhuyun Chen
2023 J jnl
IEEE Trans. Instrum. Meas.
Ke Yue, Jipu Li, Zhuyun Chen, Ruyi Huang, Weihua Li
2023 J jnl
IEEE Trans. Instrum. Meas.
Ke Yue, Jipu Li, Junbin Chen, Ruyi Huang, Weihua Li
2023 J jnl
IEEE Internet Things J.
Bo Yin, Jianhua Tang, Miaowen Wen, Weihua Li
2023 conf
ICSRS
Jingkang Liang, Zhuyun Chen, Junbin Chen, Jipu Li, Ruyi Huang, Weihua Li
2023 conf
ITSC
Shaowu Zheng, Chong Xie, Ruyi Huang, Shanhu Yu, Ming Ye, Weihua Li
2023 J jnl
IEEE Trans. Instrum. Meas.
Weihua Li, Hao Lan, Junbin Chen, Ke Feng, Ruyi Huang
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Shaowu Zheng, Yun Xie, Minghao Li, Chong Xie, Weihua Li
2022 J jnl
IEEE Trans. Instrum. Meas.
Zhongze Liu, Kang Ding, Huibin Lin, Zhuyun Chen, Weihua Li
2022 J jnl
IEEE Trans. Instrum. Meas.
Jipu Li, Ruyi Huang, Junbin Chen, Jingyan Xia, Zhuyun Chen, Weihua Li
2022 J jnl
IEEE Trans. Instrum. Meas.
Fei Jiang, Kang Ding, Guolin He, Huibin Lin, Zhuyun Chen, Weihua Li
2022 J jnl
IEEE Trans. Instrum. Meas.
Junbin Chen, Jipu Li, Ruyi Huang, Ke Yue, Zhuyun Chen, Weihua Li
2022 J jnl
IEEE Instrum. Meas. Mag.
Weihua Li, Xuefeng Chen
2022 conf
I2MTC
Ke Yue, Jipu Li, Junbin Chen, Weihua Li
2022 J jnl
CoRR
Chaofan Ling, Junpei Zhong, Weihua Li
2022 J jnl
CoRR
Chaofan Ling, Junpei Zhong, Weihua Li
2021 conf
I2MTC
Jipu Li, Ruyi Huang, Jingyan Xia, Zhuyun Chen, Weihua Li
2021 J jnl
IEEE Trans. Ind. Informatics
Weihua Li, Zhuyun Chen, Guolin He
2021 J jnl
IEEE Trans. Instrum. Meas.
Botao An, Shibin Wang, Ruqiang Yan, Weihua Li, Xuefeng Chen
2021 J jnl
IEEE Trans. Instrum. Meas.
Ruyi Huang, Jipu Li, Yixiao Liao, Junbin Chen, Zhen Wang, Weihua Li
2021 J jnl
IEEE Multim.
Yun Xie, Shaowu Zheng, Weihua Li
2021 J jnl
IEEE Trans. Instrum. Meas.
Junbin Chen, Ruyi Huang, Kun Zhao, Wei Wang, Longcan Liu, Weihua Li
2020 J jnl
IEEE Trans. Ind. Informatics
Ruyi Huang, Jipu Li, Shuhua Wang, Guanghui Li, Weihua Li
2020 conf
I2MTC
Ruyi Huang, Zhen Wang, Jipu Li, Junbin Chen, Weihua Li
2020 J jnl
IEEE Trans. Instrum. Meas.
Ruyi Huang, Jipu Li, Weihua Li, Lingli Cui
2020 J jnl
IEEE Trans. Instrum. Meas.
Yixiao Liao, Ruyi Huang, Jipu Li, Zhuyun Chen, Weihua Li
2020 J jnl
IEEE Trans. Instrum. Meas.
Zhuyun Chen, Guolin He, Jipu Li, Yixiao Liao, Konstantinos C. Gryllias, Weihua Li
2020 conf
I2MTC
Botao An, Shibin Wang, Ruqiang Yan, Weihua Li, Xuefeng Chen
2020 J jnl
IEEE Trans. Ind. Informatics
Zhuyun Chen, Konstantinos C. Gryllias, Weihua Li
2019 conf
I2MTC
Ruyi Huang, Weihua Li, Lingli Cui
2019 J jnl
Comput. Ind.
Bin Zhang, Shaohui Zhang, Weihua Li
2019 J jnl
IEEE Access
Ruyi Huang, Yixiao Liao, Shaohui Zhang, Weihua Li
2019 J jnl
IEEE Access
Shaohui Zhang, Man Wang, Weihua Li, Jiesi Luo, Zusheng Lin
2019 conf
EUSIPCO
Zhuyun Chen, Chenyu Liu, Konstantinos C. Gryllias, Weihua Li
2018 conf
I2MTC
Xiaonan Liu, Wenjin Chen, Jie Liu, Weihua Li, Ruqiang Yan
2018 J jnl
J. Intell. Fuzzy Syst.
Yixiao Liao, Lei Zhang, Weihua Li
2017 J jnl
IEEE Trans. Instrum. Meas.
Zhuyun Chen, Weihua Li
2016 J jnl
IEEE Trans. Ind. Informatics
Weihua Li, Shaohui Zhang, Subhash Rakheja
2016 conf
I2MTC
Zhuyun Chen, Xueqiong Zeng, Weihua Li, Guanglan Liao
2015 conf
I2MTC
Weihua Li, Waiping Shan, Shenglong Weng
2013 conf
I2MTC
Weihua Li, Zhidong Huang, Huibin Lin, Kang Ding
2013 J jnl
IEEE Trans. Instrum. Meas.
Weihua Li, Shaohui Zhang, Guolin He
2006 conf
ICONIP (3)
Weihua Li, Tielin Shi, Kang Ding
2005 conf
ISNN (3)
Guanglan Liao, Tielin Shi, Weihua Li, Tao Huang
redb/extractors/decompiler/bninja/analysis/disassembly.py
← Index redb/extractors/decompiler/bninja/analysis/disassembly.py python
import re
import time

import binaryninja
from binaryninja.enums import (
    InstructionTextTokenType,
)

# Support both package and standalone imports
try:
    from ..function_type import FunctionTypeAnalysis
    from ..utils.hashes import calculate_sha256
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.function_type import FunctionTypeAnalysis
    from redb.extractors.decompiler.bninja.utils.hashes import calculate_sha256


class DisassemblyAnalysis:
    INVALID_STACK_SIZE = -1

    def __init__(self, arch, function, bv, logger):
        self.arch = arch
        self.function = function
        self.bv = bv
        self.logger = logger
        if self.function is not None and hasattr(self.function, "instructions"):
            self.instructions = self.function.instructions
        else:
            self.instructions = []
        self.errors = []
        return

    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 get_json(self):
        try:
            # Build disassembly string and normalized versions
            disassembly_builder = [[], []]  # Address and instruction text

            # Create a dictionary mapping addresses to instruction tokens
            instr_tokens_by_addr = {}
            for instr_tokens, addr in self.instructions:
                instr_tokens_by_addr[addr] = instr_tokens

            addresses = sorted(instr_tokens_by_addr.keys())
            for address in addresses:
                # Original disassembly with addresses
                # instr_tokens, address = instruction
                instr_tokens = instr_tokens_by_addr[address]
                disassembly_builder[0].append(address)
                disassembly_builder[1].append("".join(map(str, instr_tokens)))

            # Join with newlines
            disassembly_str = "\n".join(disassembly_builder[1])
            disassembly_with_addresses = "\n".join(
                f"{hex(address)}: {instr_text}"
                for address, instr_text in zip(
                    disassembly_builder[0], disassembly_builder[1], strict=False
                )
            )

            disassembly_json = {
                "disassembled_function_hash": calculate_sha256(disassembly_str),
                "disassembled_function": disassembly_with_addresses,
                "disassembled_function_no_addresses": disassembly_str,
                "disassembled_function_name": self.function.name,
                "disassembled_function_address": self.function.start,
                "instructions_count": len(instr_tokens_by_addr.keys()),
                "function_type": FunctionTypeAnalysis(self.function)
                .get_function_type()
                .name,
            }

            # Add additional metrics
            type_frequencies = self.collect_instruction_types()
            disassembly_json["instructions_types"] = list(type_frequencies.keys())
            disassembly_json["control_flow_count"] = (
                self.count_control_flow_instructions()
            )
            disassembly_json["memory_access_pattern"] = self.collect_memory_patterns()
            disassembly_json["register_usage"] = self.collect_register_usage()
            disassembly_json["data_references_count"] = self.count_data_references()
            disassembly_json["max_block_size"] = self.compute_max_block_size()
            disassembly_json["num_calls"] = self.compute_num_calls()
            disassembly_json["stack_size"] = self.estimate_stack_size()

            return disassembly_json, self.errors

        except Exception as e:
            self.log_error(
                "Failed to collect instruction types",
                self.function.name,
                self.function.start,
                e,
                "collect_instruction_types",
            )
            raise ValueError(e) from e

    def collect_instruction_types(self):
        """Collect instruction type frequencies from a function."""
        type_frequencies = {}

        try:
            # Iterate through all instructions in the function
            for instruction in self.instructions:
                instr_tokens = instruction[0]  # Get the instruction tokens

                # Extract the mnemonic from the instruction tokens
                mnemonic = None
                for token in instr_tokens:
                    if token.type == InstructionTextTokenType.InstructionToken:
                        mnemonic = token.text
                        break

                if not mnemonic:
                    continue

                # Use normalize_opcode to get standardized opcode
                normalized = self.normalize_opcode(mnemonic)

                # Get category from opcode_categories or use the instruction type directly
                category = self.arch.opcode_categories.get(normalized)
                if category:
                    self._increment_frequency(type_frequencies, category)

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

        return type_frequencies

    def normalize_opcode(self, opcode):
        return opcode.upper()

    def collect_memory_patterns(self):
        """Collect memory access patterns from a function."""
        patterns = []
        try:
            for instruction in self.instructions:
                instr_tokens = instruction[0]

                # We need to capture memory operands between BeginMemoryOperandToken and EndMemoryOperandToken
                in_memory_operand = False
                memory_operand_text = ""

                for token in instr_tokens:
                    if token.type == InstructionTextTokenType.BeginMemoryOperandToken:
                        in_memory_operand = True
                        memory_operand_text = ""
                    elif token.type == InstructionTextTokenType.EndMemoryOperandToken:
                        in_memory_operand = False

                        # Process the captured memory operand text
                        if memory_operand_text:
                            # Categorize memory access pattern
                            if (
                                "+" in memory_operand_text
                                and "*" in memory_operand_text
                            ):
                                if "MEM_SCALED_INDEX" not in patterns:
                                    patterns.append("MEM_SCALED_INDEX")
                            elif (
                                "+" in memory_operand_text or "-" in memory_operand_text
                            ):
                                if "MEM_BASE_OFFSET" not in patterns:
                                    patterns.append("MEM_BASE_OFFSET")
                            else:
                                if "MEM_DIRECT" not in patterns:
                                    patterns.append("MEM_DIRECT")

                            # Check for stack accesses
                            if any(
                                reg in memory_operand_text
                                for reg in ["SP", "BP", "ESP", "EBP", "RSP", "RBP"]
                            ):
                                if "MEM_STACK" not in patterns:
                                    patterns.append("MEM_STACK")
                            # Check for string operations
                            elif (
                                any(
                                    reg in memory_operand_text
                                    for reg in ["SI", "DI", "ESI", "EDI", "RSI", "RDI"]
                                )
                                and "MEM_STRING" not in patterns
                            ):
                                patterns.append("MEM_STRING")
                    elif in_memory_operand:
                        # Accumulate token text while inside a memory operand
                        memory_operand_text += token.text
        except Exception as e:
            self.log_error(
                "Failed to collect memory patterns",
                self.function.name,
                self.function.start,
                e,
                "collect_memory_patterns",
            )
        return patterns

    def collect_register_usage(self):
        """Collect register usage from a function."""
        registers = []
        try:
            # Define register groups we're interested in tracking
            register_groups = {
                "GPR": [
                    "RAX",
                    "RBX",
                    "RCX",
                    "RDX",
                    "R9",
                    "R10",
                    "R11",
                    "R12",
                    "R13",
                    "R14",
                    "R15",
                    "EAX",
                    "EBX",
                    "ECX",
                    "EDX",
                    "R9D",
                    "R10D",
                    "R11D",
                    "R12D",
                    "R13D",
                    "R14D",
                    "AX",
                    "BX",
                    "CX",
                    "DX",
                ],
                "GPR_INDEX": ["RSI", "RDI", "ESI", "EDI", "SI", "DI"],
                "GPR_STACK": ["RSP", "RBP", "ESP", "EBP", "SP", "BP"],
                "SIMD": ["XMM", "YMM", "ZMM"],
                "FPU": ["ST", "ST0", "ST1", "ST2", "ST3", "ST4", "ST5", "ST6", "ST7"],
                "FLAGS": ["FLAGS", "EFLAGS", "RFLAGS"],
                "CONTROL_REGISTER": ["CR0", "CR2", "CR3", "CR4", "CR8"],
                "DEBUG_REGISTER": ["DR0", "DR1", "DR2", "DR3", "DR6", "DR7"],
            }

            # Extract registers from instructions
            for instruction in self.instructions:
                instr_tokens = instruction[0]
                for token in instr_tokens:
                    if token.type == InstructionTextTokenType.RegisterToken:
                        reg = token.text.upper()
                        # Check which group this register belongs to
                        for group, regs in register_groups.items():
                            # if any(r in reg for r in regs) or any(reg.startswith(r) for r in regs):
                            if any(reg == r or reg.startswith(r) for r in regs):
                                if group not in registers:
                                    registers.append(group)
                                break
        except Exception as e:
            self.log_error(
                "Failed to collect register usage",
                self.function.name,
                self.function.start,
                e,
                "collect_register_usage",
            )
        return registers

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

            if self.function.mlil is None:
                return 0

            for block in self.function.mlil:
                for instr in block:
                    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,
                            (
                                binaryninja.mediumlevelil.MediumLevelILConstPtr,
                                binaryninja.mediumlevelil.MediumLevelILConst,
                            ),
                        ):
                            count += 1
                            logged = True

                    # Check full string for hardcoded addresses or symbol-like tokens
                    if re.search(r"\b0x[0-9A-Fa-f]{3,}\b", instr_str) and not logged:
                        count += 1
                        logged = True

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

                    # Only check for MediumLevelILConstPtr if src exists
                    if src is not None and isinstance(
                        src, binaryninja.mediumlevelil.MediumLevelILConstPtr
                    ):
                        addr = src.constant
                        # Check if address is in data sections
                        segment = self.bv.get_segment_at(addr)
                        if segment and segment.writable:
                            # print(f"[{function.name}] Matched data section reference in: {instr_str}")
                            count += 1
                            logged = True
        except Exception as e:
            self.logger.warning(
                f"Failed to use MLIL for counting data references in {self.function.name} at {self.function.start}: {e}"
            )
        return count

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

        for block in self.function.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.function.name,
                    self.function.start,
                    e,
                    "compute_max_block_size",
                )
        return max_size

    def count_control_flow_instructions(self):
        """Count the number of control flow instructions in a function."""
        count = 0
        try:
            for instruction in self.instructions:
                instr_tokens = instruction[0]
                if self.arch.is_control_flow_instruction(instr_tokens):
                    count += 1
        except Exception as e:
            self.log_error(
                "Failed to count control flow instructions",
                self.function.name,
                self.function.start,
                e,
                "count_control_flow_instructions",
            )
        return count

    def compute_num_calls(self) -> int:
        """Compute the number of call instructions in a function."""
        num_calls = 0
        try:
            for instruction in self.instructions:
                instr_tokens = instruction[0]
                # Extract the mnemonic
                for token in instr_tokens:
                    if token.type == InstructionTextTokenType.InstructionToken:
                        if token.text.upper() == "CALL":
                            num_calls += 1
                        break
        except Exception as e:
            self.log_error(
                "Failed to compute number of calls",
                self.function.name,
                self.function.start,
                e,
                "compute_num_calls",
            )
        return num_calls

    def _increment_frequency(self, frequencies, type_name):
        """Increment the frequency count for an instruction type."""
        if type_name in frequencies:
            frequencies[type_name] += 1
        else:
            frequencies[type_name] = 1

    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.function.name,
                self.function.start,
                e,
                "estimate_stack_size",
            )
            return self.INVALID_STACK_SIZE