Nazim H. Madhavji

147 papers A* 8A 9B 12C 4Journal 39Unranked 69
YearRankTypeTitle / Venue / Authors
2025 conf
CCIOT
Sabbir M. Saleh, Md Nafiz Al Ifat, Nazim H. Madhavji, John Steinbacher
2025 B conf
ICSR
Haoran Wei, Nazim H. Madhavji, John Steinbacher
2025 A conf
ICSA
Haoran Wei, Nazim H. Madhavji, John Steinbacher
2025 J jnl
CoRR
Sabbir M. Saleh, Nazim H. Madhavji, John Steinbacher
2025 C conf
CloudCom
Sabbir M. Saleh, Md Nafiz Al Ifat, Nazim H. Madhavji, John Steinbacher
2025 J jnl
CoRR
Sabbir M. Saleh, Nazim H. Madhavji, John Steinbacher
2025 conf
CCIOT
Sabbir M. Saleh, Nazim H. Madhavji, John Steinbacher
2025 B conf
ENASE
Sabbir M. Saleh, Nazim H. Madhavji, John Steinbacher
2025 J jnl
CoRR
Sabbir M. Saleh, Nazim H. Madhavji, John Steinbacher
2025 A conf
ESEM
Haoran Wei, Nazim H. Madhavji, John Steinbacher
2025 J jnl
CoRR
Haoran Wei, Nazim H. Madhavji, John Steinbacher
2024 C conf
WEBIST
Sabbir M. Saleh, Nazim H. Madhavji, John Steinbacher
2024 conf
CCSW@CCS
Sabbir M. Saleh, Ibrahim Mohammed Sayem, Nazim H. Madhavji, John Steinbacher
2024 J jnl
CoRR
Sabbir M. Saleh, Ibrahim Mohammed Sayem, Nazim H. Madhavji, John Steinbacher
2024 conf
CIoT
Sabbir M. Saleh, Nazim H. Madhavji, John Steinbacher
2023 conf
ICIT
Yasmen Wahba, Nazim H. Madhavji, John Steinbacher
2023 J jnl
CoRR
Yasmen Wahba, Nazim H. Madhavji, John Steinbacher
2023 conf
CASCON
Haoran Wei, Nazim H. Madhavji, John Steinbacher
2022 conf
LOD (2)
Yasmen Wahba, Nazim H. Madhavji, John Steinbacher
2022 J jnl
CoRR
Yasmen Wahba, Nazim H. Madhavji, John Steinbacher
2022 conf
CASCON
Yasmen Wahba, Nazim H. Madhavji, John Steinbacher
2021 B conf
REFSQ
Mahtab EzzatiKarami, Nazim H. Madhavji
2021 J jnl
Inf. Softw. Technol.
Alessio Ferrari, Nazim H. Madhavji, Liliana Pasquale
2020 B conf
ENASE
Ibtehal Noorwali, Nazim H. Madhavji, Remo Ferrari
2020 conf
CASCON
Yasmen Wahba, Nazim H. Madhavji, John Steinbacher
2020 conf
CASCON
Elham Rahmani, Nazim H. Madhavji, Ibtehal Noorwali
2020 B ed.
REFSQ
Nazim H. Madhavji, Liliana Pasquale, Alessio Ferrari, Stefania Gnesi
2019 C conf
ICSOFT
Darlan Arruda, Nazim H. Madhavji, Ibtehal Noorwali
2019 conf
IEEE BigData
Darlan Arruda, Nazim H. Madhavji
2019 conf
CASCON
Nazim H. Madhavji, John Steinbacher, Andriy V. Miranskyy, Tony Erwin, Ahmed Ibrahim, Priyanka P. Naikade, William Pourmajidi, Lei Zhang, Yasmen Wahba
2019 B conf
REFSQ
Ibtehal Noorwali, Nazim H. Madhavji, Darlan Arruda, Remo Ferrari
2018 ed.
EmpiRE@RE
Maya Daneva, Sabrina Marczak, Eric Knauss, Nazim H. Madhavji
2018 conf
EmpiRE@RE
Ibtehal Noorwali, Nazim H. Madhavji
2018 conf
CASCON
Darlan Arruda, Nazim H. Madhavji, Colin A. Taylor
2018 ed.
REFSQ Workshops
Klaus Schmid, Paola Spoletini, Eya Ben Charrada, Yoram Chisik, Fabiano Dalpiaz, Alessio Ferrari, Peter Forbrig, Xavier Franch, Marite Kirikova, Nazim H. Madhavji, Cristina Palomares, Jolita Ralyté, Mehrdad Sabetzadeh, Pete Sawyer, Dirk van der Linden, Anna Zamansky
2018 J jnl
Inf. Softw. Technol.
Xavier Franch, Nazim H. Madhavji, Carlos Henrique C. Duarte
2018 B conf
REFSQ
Darlan Arruda, Nazim H. Madhavji
2017 conf
CASCON
Nikita Sokolov, Nazim H. Madhavji
2017 C conf
DATA
Darlan Arruda, Nazim H. Madhavji
2017 conf
IEEE BigData
Darlan Arruda, Nazim H. Madhavji
2017 conf
IEEE BigData
Darlan Arruda, Nazim H. Madhavji
2016 B conf
REFSQ
Md. Rashed Iqbal Nekvi, Ibtehal Noorwali, Nazim H. Madhavji
2016 conf
BIGDSE@ICSE
Ibtehal Noorwali, Darlan Arruda, Nazim H. Madhavji
2015 ed.
EmpiRE
Richard Berntsson-Svensson, Maya Daneva, Neil A. Ernst, Sabrina Marczak, Nazim H. Madhavji
2015 ed.
CESI@ICSE
Xavier Franch, Nazim H. Madhavji, Carlos Henrique C. Duarte
2015 conf
ICSE (2)
Xavier Franch, Nazim H. Madhavji, Carlos Henrique C. Duarte
2015 J jnl
ACM SIGSOFT Softw. Eng. Notes
Carlos Henrique C. Duarte, Xavier Franch, Nazim H. Madhavji
2015 conf
BIGDSE@ICSE
Nazim H. Madhavji, Andriy V. Miranskyy, Kostas Kontogiannis
2015 J jnl
IEEE Trans. Reliab.
Syed Shariyar Murtaza, Nazim H. Madhavji, Mechelle Gittens, Abdelwahab Hamou-Lhadj
2015 J jnl
ACM Trans. Manag. Inf. Syst.
Md. Rashed Iqbal Nekvi, Nazim H. Madhavji
2015 conf
RELAW
Maria Spichkova, Heinz W. Schmidt, Md. Rashed Iqbal Nekvi, Nazim H. Madhavji
2015 conf
CASCON
Craig Statchuk, Nazim H. Madhavji, Andriy V. Miranskyy, Frank Dehne
2015 conf
EmpiRE
Remo Ferrari, Ibtehal Noorwali, Nazim H. Madhavji
2015 conf
GTSE@ICSE
Syed Shariyar Murtaza, Abdelwahab Hamou-Lhadj, Nazim H. Madhavji, Mechelle Gittens
2014 J jnl
ACM SIGSOFT Softw. Eng. Notes
Xavier Franch, Nazim H. Madhavji, Bill Curtis, Larry Votta
2014 ed.
EmpiRE
Maya Daneva, Richard Berntsson-Svensson, Xavier Franch, Nazim H. Madhavji, Sabrina Marczak
2014 J jnl
J. Syst. Softw.
Syed Shariyar Murtaza, Abdelwahab Hamou-Lhadj, Nazim H. Madhavji, Mechelle Gittens
2014 ed.
CESI
Xavier Franch, Nazim H. Madhavji, P. C. Anitha, Andriy V. Miranskyy
2013 A* conf
ICSE
Xavier Franch, Nazim H. Madhavji, Bill Curtis, Larry Votta
2013 conf
RELAW
Quanjun Yin, Nazim H. Madhavji, Mahesh Pattani
2013 B conf
REFSQ
Ibtehal Noorwali, Nazim H. Madhavji
2012 B conf
REFSQ
Md. Rashed Iqbal Nekvi, Nazim H. Madhavji, Remo Ferrari, Brian Berenbach
2011 J jnl
Empir. Softw. Eng.
Zude Li, Nazim H. Madhavji, Syed Shariyar Murtaza, Mechelle Gittens, Andriy V. Miranskyy, David Godwin, Enzo Cialini
2011 A* conf
ICSE
Syed Shariyar Murtaza, Nazim H. Madhavji, Mechelle Gittens, Zude Li
2011 conf
IWSPM
Colin A. Taylor, Andriy V. Miranskyy, Nazim H. Madhavji
2011 conf
RELAW
Md. Rashed Iqbal Nekvi, Remo Ferrari, Brian Berenbach, Nazim H. Madhavji
2010 J jnl
Requir. Eng.
Remo Ferrari, James A. Miller, Nazim H. Madhavji
2010 J jnl
ACM SIGSOFT Softw. Eng. Notes
Zude Li, Mechelle Gittens, Syed Shariyar Murtaza, Nazim H. Madhavji
2010 J jnl
J. Syst. Softw.
James A. Miller, Remo Ferrari, Nazim H. Madhavji
2010 conf
CASCON
Syed Shariyar Murtaza, Mechelle Gittens, Zude Li, Nazim H. Madhavji
2010 A conf
RE
Remo Ferrari, Nazim H. Madhavji, Oliver Sudmann, Christian Henke, Jens Geisler, Wilhelm Schäfer
2010 B conf
REFSQ
Remo Ferrari, Oliver Sudmann, Christian Henke, Jens Geisler, Wilhelm Schäfer, Nazim H. Madhavji
2010 conf
Graph Transformations and Model-Driven Engineering
Josée Tassé, Nazim H. Madhavji, Amandeep Azad
2009 conf
ICSM
Zude Li, Mechelle Gittens, Syed Shariyar Murtaza, Nazim H. Madhavji, Andriy V. Miranskyy, David Godwin, Enzo Cialini
2009 conf
CASCON
Robert Begg, Nazim H. Madhavji
2009 A conf
RE
James A. Miller, Remo Ferrari, Nazim H. Madhavji
2009 B conf
REFSQ
Zude Li, Quazi Abidur Rahman, Remo Ferrari, Nazim H. Madhavji
2009 conf
ICSE Companion
James A. Miller, Remo Ferrari, Nazim H. Madhavji
2009 J jnl
ACM SIGSOFT Softw. Eng. Notes
Martin Glinz, Patrick Heymans, Anne Persson, Guttorm Sindre, Aybüke Aurum, Nazim H. Madhavji, Barbara Paech, Gil Regev, Roel J. Wieringa
2009 conf
LMSA@ICSE
Remo Ferrari, Nazim H. Madhavji, Mark Wilding
2008 J jnl
Inf. Softw. Technol.
Remo Ferrari, Nazim H. Madhavji
2008 conf
WICSA
James A. Miller, Remo Ferrari, Nazim H. Madhavji
2008 A conf
ISSRE
Syed Shariyar Murtaza, Mechelle Gittens, Nazim H. Madhavji
2008 conf
CASCON
Andriy V. Miranskyy, Nazim H. Madhavji, Mechelle Gittens, Matthew Davison, Mark Wilding, David Godwin, Colin A. Taylor
2008 J jnl
J. Syst. Softw.
Remo Ferrari, Nazim H. Madhavji
2007 conf
WER
Zude Li, Quazi Abidur Rahman, Nazim H. Madhavji
2007 conf
ESEC/SIGSOFT FSE
Andriy V. Miranskyy, Nazim H. Madhavji, Mechelle Gittens, Matthew Davison, Mark Wilding, David Godwin
2007 conf
WICSA
James A. Miller, Nazim H. Madhavji
2007 conf
WICSA
Remo Ferrari, Nazim H. Madhavji
2006 conf
ICSM
Yaqian Shen, Nazim H. Madhavji
2006 A* conf
KDD
Charles X. Ling, Victor S. Sheng, Tilmann F. W. Bruckhaus, Nazim H. Madhavji
2005 conf
WICSA
Zhenyu Wang, Khalid Sherdil, Nazim H. Madhavji
2005 A conf
RE
Andriy V. Miranskyy, Nazim H. Madhavji, Matthew Davison, Mark Reesor
2005 A* conf
ICDM
Charles X. Ling, Shengli Sheng, Tilmann F. W. Bruckhaus, Nazim H. Madhavji
2003 conf
ICSM
Nazim H. Madhavji, Josée Tassé
2002 conf
ICSM
Nazim H. Madhavji
2002 conf
ICSM
Vivek Nanda, Nazim H. Madhavji
2001 J jnl
Trans. SDPS
Martin K. Purvis, Peter Hwang, Maryam Purvis, Nazim H. Madhavji, Stephen Cranefield
2001 J jnl
IEEE Trans. Software Eng.
Kevin Strike, Khaled El Emam, Nazim H. Madhavji
2001 J jnl
Softw. Process. Improv. Pract.
Josée Tassé, Nazim H. Madhavji
2000 J jnl
IEEE Softw.
Xiamong Zhong, Nazim H. Madhavji, Khaled El Emam
2000 conf
EWSPT
Josée Turgeon, Nazim H. Madhavji
1997 conf
ICSM
Khaled El Emam, Dirk Höltje, Nazim H. Madhavji
1997 A conf
RE
Nazim H. Madhavji, Ted Thompson, Pericles Loucopoulos, William W. Agresti, Karel Vredenburg
1996 conf
Australian Software Engineering Conference
Nazim H. Madhavji
1996 conf
EWSPT
Josée Turgeon, Nazim H. Madhavji
1996 J jnl
Empir. Softw. Eng.
Khaled El Emam, Nazim H. Madhavji
1996 J jnl
Softw. Process. Improv. Pract.
Khaled El Emam, Barry Shostak, Nazim H. Madhavji
1996 J jnl
IEEE Softw.
Khaled El Emam, Nazim H. Madhavji
1996 conf
EWSPT
Silas F. Rahhal, Nazim H. Madhavji
1996 conf
EWSPT
Khalid Sherdil, Nazim H. Madhavji
1996 J jnl
IEEE Softw.
Tilmann F. W. Bruckhaus, Nazim H. Madhavji, Ingrid Janssen, John Henshaw
1996 conf
ISPW
Won-Kook Hong, Nazim H. Madhavji
1996 J jnl
Requir. Eng.
Khaled El Emam, Soizic Quintin, Nazim H. Madhavji
1995 A conf
RE
Khaled El Emam, Nazim H. Madhavji
1995 conf
EWSPT
Nazim H. Madhavji
1995 conf
EWSPT
Graciela Pérez, Khaled El Emam, Nazim H. Madhavji
1995 A conf
RE
Khaled El Emam, Nazim H. Madhavji
1994 conf
CASCON
Dirk Höltje, Nazim H. Madhavji, Tilmann F. W. Bruckhaus, Won-Kook Hong
1994 J jnl
IBM Syst. J.
George T. Heineman, John E. Botsford, Gianluigi Caldiera, Gail E. Kaiser, Marc I. Kellner, Nazim H. Madhavji
1994 conf
ISPW
Khalid Sherdil, Nazim H. Madhavji
1993 A* conf
ICSE
Rudolf K. Keller, Richard Lajoie, Nazim H. Madhavji, Tilmann F. W. Bruckhaus, Kamel Toubache, Won-Kook Hong, Khaled El Emam
1993 conf
CASCON
Khaled El Emam, Nadir Moukheiber, Nazim H. Madhavji
1993 conf
ISPW
Khaled El Emam, Nazim H. Madhavji, Kamel Toubache
1992 conf
EWSPT
Rudolf K. Keller, Nazim H. Madhavji
1992 conf
ICSM
Nazim H. Madhavji, Kamel Toubache, Won-Kook Hong
1992 conf
SDE
Hausi A. Müller, Scott R. Tilley, Mehmet A. Orgun, Brian Corrie, Nazim H. Madhavji
1992 J jnl
IEEE Trans. Software Eng.
Nazim H. Madhavji
1992 conf
Experimental Software Engineering Issues
Nazim H. Madhavji, John E. Botsford, Tilmann F. W. Bruckhaus, Khaled El Emam
1991 conf
ISPW
Nazim H. Madhavji, Kamel Toubache, Won-Kook Hong
1991 J jnl
IEEE Trans. Software Eng.
Nazim H. Madhavji, Wilhelm Schäfer
1991 conf
CASCON
Nazim H. Madhavji, Kamel Toubache, Ed Lynch
1991 A* conf
ICSE
Nazim H. Madhavji
1991 J jnl
Softw. Eng. J.
Nazim H. Madhavji
1990 conf
Programming Concepts and Methods
Jules Desharnais, Nazim H. Madhavji
1990 A* conf
ICSE
Nazim H. Madhavji, Volker Gruhn, Wolfgang Deiters, Wilhelm Schäfer
1989 J jnl
Softw. Eng. J.
Nazim H. Madhavji, Mingjun Zhang, Sami Boulos, Yuan Xiang Gu
1988 conf
ICCL
Nazim H. Madhavji, Jules Desharnais, Luc Pinsonneault, Kamel Toubache
1988 J jnl
IEEE Trans. Software Eng.
Nazim H. Madhavji
1988 conf
FSTTCS
Jules Desharnais, Nazim H. Madhavji
1986 J jnl
IEEE Softw.
Nazim H. Madhavji, Luc Pinsonneault, Kamel Toubache
1985 conf
SIGSMALL
Nazim H. Madhavji, Nikos Leoutsarakos
1985 A* conf
ICSE
Nazim H. Madhavji
1985 conf
TAPSOFT, Vol.2
Nazim H. Madhavji, Nikos Leoutsarakos, Dimitri Vouliouris
1984 J jnl
Commun. ACM
Nazim H. Madhavji
1982 conf
SIGPLAN Symposium on Compiler Construction
Nazim H. Madhavji, I. R. Wilson
1981 J jnl
Softw. Pract. Exp.
Nazim H. Madhavji, I. R. Wilson
redb/extractors/macho_extractors/macho_features.py
← Index redb/extractors/macho_extractors/macho_features.py python
import inspect
import json
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachO


class MachOFeaturesExtractor(MachOExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_features"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.MACHO_FEATURES.value

    def _extract_macho_features_for_arch(self, arch_name):
        """Extract basic MachO features for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get general info using new API
            general_info = self.macho.get_general_info()
            if not general_info:
                return None

            # Get header info for this specific architecture
            header_raw = self.macho.get_macho_header(arch=arch_name)
            header_formatted = self.macho.get_macho_header(arch=arch_name, formatted=True)

            if not header_raw or not header_formatted:
                return None

            # Get entry point using new API
            entry_point = None
            try:
                entry_point_info = self.macho.get_entry_point(arch=arch_name)
                if entry_point_info:
                    if isinstance(entry_point_info, dict):
                        entry_point = entry_point_info.get('entryoff') or entry_point_info.get('entry_address')
                    else:
                        entry_point = entry_point_info
            except Exception as e:
                self.log.debug(f"No entry point found: {e}")

            # Get UUID using new API
            uuid = None
            try:
                uuid_info = self.macho.get_uuid(arch=arch_name)
                if uuid_info:
                    uuid = str(uuid_info)
            except Exception as e:
                self.log.debug(f"No UUID found: {e}")

            # Get version info using new API with formatting
            version_info = None
            version_info_str = None
            try:
                version_info = self.macho.get_version_info(arch=arch_name)
                version_info_str = self.macho.get_version_info(arch=arch_name, formatted=True)
            except Exception as e:
                self.log.debug(f"No version info found: {e}")

            # Get segments using new API
            segments = self.macho.get_segments(arch=arch_name)
            number_of_segments = len(segments) if segments else 0

            # Get dylib info using new API
            dylib_names = self.macho.get_dylib_names(arch=arch_name)
            number_of_dylibs = len(dylib_names) if dylib_names else 0

            # Count imports using new API
            imported_functions = self.macho.get_imported_functions(arch=arch_name)
            number_of_imports = sum(len(funcs) for funcs in imported_functions.values()) if imported_functions else 0

            # Count exports using new API
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)
            number_of_exports = sum(len(symbols) for symbols in exported_symbols.values()) if exported_symbols else 0

            # Get unique load command types using new API
            load_commands_set = self.macho.get_load_commands_set(arch=arch_name, formatted=True)
            if isinstance(load_commands_set, set):
                load_commands_set = sorted(list(load_commands_set))

            # Get architectures for listing purposes
            architectures = self.macho.get_architectures()

            # Determine binary properties
            is_64bit = header_raw.get('magic') in [0xFEEDFACF, 0xCFFAEDFE]  # MH_MAGIC_64, MH_CIGAM_64
            is_signed = self._is_signed()
            
            # Create MachO dataclass
            macho_features = MachO(
                # Raw values from new API
                magic=header_raw.get('magic', 0),
                cputype=header_raw.get('cputype', 0),
                cpusubtype=header_raw.get('cpusubtype', 0),
                filetype=header_raw.get('filetype', 0),
                ncmds=header_raw.get('ncmds', 0),
                sizeofcmds=header_raw.get('sizeofcmds', 0),
                flags=header_raw.get('flags', 0),
                architecture=header_raw.get('cputype', 0),  # Use cputype as architecture
                architectures=[arch_info.get('cputype', 0) for arch_info in [self.macho.get_macho_header(arch=arch) for arch in architectures] if arch_info],
                # Human-readable values from formatted API
                magic_str=header_formatted.get('magic', ''),
                cputype_str=header_formatted.get('cputype', ''),
                cpusubtype_str=header_formatted.get('cpusubtype', ''),
                filetype_str=header_formatted.get('filetype', ''),
                flags_str=header_formatted.get('flags', '').split(', ') if header_formatted.get('flags') else [],
                architecture_str=header_formatted.get('cputype', ''),
                architectures_str=[arch_info.get('cputype', '') for arch_info in [self.macho.get_macho_header(arch=arch, formatted=True) for arch in architectures] if arch_info],
                # Additional properties
                is_64bit=is_64bit,
                is_signed=is_signed,
                number_of_load_commands=header_raw.get('ncmds', 0),
                load_commands_set=load_commands_set,
                number_of_segments=number_of_segments,
                number_of_dylibs=number_of_dylibs,
                number_of_imports=number_of_imports,
                number_of_exports=number_of_exports,
                entry_point=entry_point,
                uuid=uuid,
                version_info=version_info,
                version_info_str=version_info_str
            )
            
            return macho_features
            
        except Exception as e:
            self.log.error(f"Error extracting MachO features: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            if not self.macho:
                return None
            architectures = self.macho.get_architectures()
            if not architectures:
                return None

            # For FAT binaries, return features for all architectures
            # For single arch, return just the single result
            if len(architectures) > 1:
                # FAT binary - return list of features for each architecture
                results = []
                for arch_name in architectures:
                    features = self._extract_macho_features_for_arch(arch_name)
                    if features:
                        # Add architecture identifier to the result
                        if hasattr(features, '__dict__'):
                            # If it's a dataclass, we can access its dict
                            features.arch_identifier = arch_name
                        results.append(features)
                return results
            else:
                # Single architecture - return single result
                return self._extract_macho_features_for_arch(architectures[0])
        except Exception as e:
            self.log.error(f"Error extracting MachO features: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            if not self.macho:
                return None

            # Get architectures (macho is already parsed in __init__)
            try:
                architectures = self.macho.get_architectures()
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Extract features for this specific architecture
                macho_features = self._extract_macho_features_for_arch(arch_name)
                if not macho_features:
                    continue

                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific hash for {arch_name}: {e}")
                    arch_sha256 = self.sha256

                # Architecture field (kept in features table for ORDER BY)
                architecture = macho_features.cputype    # Raw CPU type value

                data.append([
                    arch_sha256,                          # sha256 (architecture-specific)
                    architecture,                         # architecture (raw CPU type)
                    # Raw values
                    macho_features.magic,                 # magic
                    macho_features.cputype,               # cputype
                    macho_features.cpusubtype,            # cpusubtype
                    macho_features.filetype,              # filetype
                    macho_features.ncmds,                 # ncmds
                    macho_features.sizeofcmds,            # sizeofcmds
                    macho_features.flags,                 # flags
                    # Human-readable values
                    macho_features.magic_str,             # magic_str
                    macho_features.cputype_str,           # cputype_str
                    macho_features.cpusubtype_str,        # cpusubtype_str
                    macho_features.filetype_str,          # filetype_str
                    macho_features.flags_str,             # flags_str
                    # Other fields
                    macho_features.is_64bit,              # is_64bit
                    macho_features.is_signed,             # is_signed
                    macho_features.entry_point if macho_features.entry_point else None,           # entry_point
                    macho_features.uuid if macho_features.uuid else None,  # uuid
                    json.dumps(macho_features.version_info) if macho_features.version_info else "{}",  # version_info
                    json.dumps(macho_features.version_info_str) if macho_features.version_info_str else "{}",  # version_info_str
                    macho_features.load_commands_set,     # load_commands_set
                    macho_features.number_of_segments,    # number_of_segments
                    macho_features.number_of_dylibs,      # number_of_dylibs
                    macho_features.number_of_imports,     # number_of_imports
                    macho_features.number_of_exports,     # number_of_exports
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256', 'architecture',
                # Raw values
                'magic', 'cputype', 'cpusubtype', 'filetype', 'ncmds', 'sizeofcmds', 'flags',
                # Human-readable values
                'magic_str', 'cputype_str', 'cpusubtype_str', 'filetype_str', 'flags_str',
                # Other fields
                'is_64bit', 'is_signed',
                'entry_point', 'uuid', 'version_info', 'version_info_str', 'load_commands_set',
                'number_of_segments', 'number_of_dylibs', 'number_of_imports', 'number_of_exports',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)', 'Nullable(UInt32)',
                # Raw values
                'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32',
                # Human-readable values
                'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)', 'Array(LowCardinality(String))',
                # Other fields
                'UInt8', 'UInt8',
                'Nullable(UInt64)', 'Nullable(String)', 'JSON', 'JSON', 'Array(Nullable(String))',
                'UInt32', 'UInt32', 'UInt32', 'UInt32', 'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)
        
        return None

    def get_clickhouse_table(self) -> str:
        return "redb_macho_features"