Randall S. Burd

77 papers A* 6A 8B 3C 1Misc 6Journal 28Unranked 25
YearRankTypeTitle / Venue / Authors
2026 conf
CHI Extended Abstracts
Christine Dodeye Ikponmwonba, Vidhi Shah, Sifan Yuan, Ivan Marsic, Randall S. Burd, Aleksandra Sarcevic
2025 J jnl
Comput. Vis. Image Underst.
Aydin Saribudak, Sifan Yuan, Chenyang Gao, Waverly Gestrich-Thompson, Zachary P. Milestone, Randall S. Burd, Ivan Marsic
2025 J jnl
Proc. ACM Hum. Comput. Interact.
Katherine Ann Zellner, Aleksandra Sarcevic, Maja Barnouw, Megan A. Krentsa, Travis M. Sullivan, Mary S. Kim, Randall S. Burd
2025 J jnl
J. Am. Medical Informatics Assoc.
Mary S. Kim, Beomseok Park, Genevieve J. Sippel, Aaron H. Mun, Wanzhao Yang, Kathleen H. McCarthy, Emely Fernandez, Marius George Linguraru, Aleksandra Sarcevic, Ivan Marsic, Randall S. Burd
2025 J jnl
J. Biomed. Informatics
Keyi Li, Mary S. Kim, Wenjin Zhang, Sen Yang, Genevieve J. Sippel, Aleksandra Sarcevic, Randall S. Burd, Ivan Marsic
2025 conf
ICCVW
Wanzhao Yang, Syed Anwar, Beomseok Park, Sifan Yuan, Aleksandra Sarcevic, Marius G. Linguranr, Randall S. Burd, Ivan Marsic
2025 J jnl
CoRR
Angela Mastrianni, Mary S. Kim, Travis M. Sullivan, Genevieve J. Sippel, Randall S. Burd, Krzysztof Z. Gajos, Aleksandra Sarcevic
2025 J jnl
Proc. ACM Hum. Comput. Interact.
Angela Mastrianni, Mary Suhyun Kim, Travis M. Sullivan, Genevieve J. Sippel, Randall S. Burd, Krzysztof Z. Gajos, Aleksandra Sarcevic
2025 A conf
Conference on Designing Interactive Systems
Aleksandra Sarcevic, Eleanor Wood, Katherine Ann Zellner, Christine Dodeye Ikponmwonba, Mary Suhyun Kim, Ivan Marsic, Randall S. Burd
2024 conf
CVPR Workshops
Wenjin Zhang, Keyi Li, Sen Yang, Sifan Yuan, Ivan Marsic, Genevieve J. Sippel, Mary S. Kim, Randall S. Burd
2024 J jnl
ACM Trans. Knowl. Discov. Data
Keyi Li, Sen Yang, Travis M. Sullivan, Randall S. Burd, Ivan Marsic
2023 J jnl
J. Biomed. Informatics
Keyi Li, Ivan Marsic, Aleksandra Sarcevic, Sen Yang, Travis M. Sullivan, Peyton E. Tempel, Zachary P. Milestone, Karen J. O'Connell, Randall S. Burd
2023 A conf
Conference on Designing Interactive Systems (Companion Volume)
Aleksandra Sarcevic, Carmen-Mai Riley, Waverly Gestrich-Thompson, Ivan Marsic, Karen J. O'Connell, Randall S. Burd
2023 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Chenyang Gao, Ivan Marsic, Aleksandra Sarcevic, Waverly Gestrich-Thompson, Randall S. Burd
2023 A conf
Conference on Designing Interactive Systems
Angela Mastrianni, Aleksandra Sarcevic, Hua Cui, Megan A. Krentsa, Travis M. Sullivan, Issa Zakeri, Ivan Marsic, Randall S. Burd
2023 J jnl
ACM Trans. Comput. Hum. Interact.
Angela Mastrianni, Aleksandra Sarcevic, Allison Hu, Lynn Almengor, Peyton E. Tempel, Sarah Gao, Randall S. Burd
2023 J jnl
Proc. ACM Hum. Comput. Interact.
Katherine Ann Zellner, Aleksandra Sarcevic, Megan A. Krentsa, Travis M. Sullivan, Randall S. Burd
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Swathi Jagannath, Neha Kamireddi, Katherine Ann Zellner, Randall S. Burd, Ivan Marsic, Aleksandra Sarcevic
2022 Misc conf
AMIA
Katherine Ann Zellner, Louis Jiorgio Villegas, Charles Neff, Waverly Gestrich-Thompson, Randall S. Burd, Ivan Marsic, Aleksandra Sarcevic
2022 J jnl
CoRR
Keyi Li, Sen Yang, Travis M. Sullivan, Randall S. Burd, Ivan Marsic
2022 J jnl
CoRR
Keyi Li, Sen Yang, Travis M. Sullivan, Randall S. Burd, Ivan Marsic
2021 conf
CSCW Companion
Katherine Ann Zellner, Matt Coates, Alex Lee, Swathi Jagannath, Aleksandra Sarcevic, Emily C. Alberto, Allison Harvey, Randall S. Burd, Ivan Marsic
2021 A conf
Conference on Designing Interactive Systems
Angela Mastrianni, Aleksandra Sarcevic, Lauren Chung, Issa Zakeri, Emily Alberto, Zachary P. Milestone, Ivan Marsic, Randall S. Burd
2021 J jnl
Medical Image Anal.
Yanyi Zhang, Ivan Marsic, Randall S. Burd
2021 J jnl
ACM Trans. Comput. Hum. Interact.
Leah Kulp, Aleksandra Sarcevic, Megan Cheng, Randall S. Burd
2020 A* conf
CHI
Leah Kulp, Aleksandra Sarcevic, Yinan Zheng, Megan Cheng, Emily Alberto, Randall S. Burd
2020 conf
ICHI
Jalal Abdulbaqi, Yue Gu, Zhichao Xu, Chenyang Gao, Ivan Marsic, Randall S. Burd
2020 conf
ICHI
Yanyi Zhang, Yue Gu, Ivan Marsic, Yinan Zheng, Randall S. Burd
2019 A* conf
CHI
Leah Kulp, Aleksandra Sarcevic, Megan Cheng, Yinan Zheng, Randall S. Burd
2019 conf
ICHI
Yue Gu, Ruiyu Zhang, Xinwei Zhao, Shuhong Chen, Jalal Abdulbaqi, Ivan Marsic, Megan Cheng, Randall S. Burd
2018 J jnl
J. Biomed. Informatics
Sen Yang, Aleksandra Sarcevic, Richard A. Farneth, Shuhong Chen, Omar Z. Ahmed, Ivan Marsic, Randall S. Burd
2018 conf
ICHI
Jingyuan Li, Sen Yang, Shuhong Chen, Fei Tao, Ivan Marsic, Randall S. Burd
2018 conf
ICHI
Sen Yang, Weiqing Ni, Xin Dong, Shuhong Chen, Richard A. Farneth, Aleksandra Sarcevic, Ivan Marsic, Randall S. Burd
2018 conf
ICHI
Sen Yang, Fei Tao, Jingyuan Li, Dawei Wang, Shuhong Chen, Omar Z. Ahmed, Ivan Marsic, Randall S. Burd
2017 conf
IPSN
Xinyu Li, Yanyi Zhang, Jianyu Zhang, Shuhong Chen, Yue Gu, Richard A. Farneth, Ivan Marsic, Randall S. Burd
2017 A* conf
KDD
Sen Yang, Xin Dong, Leilei Sun, Yichen Zhou, Richard A. Farneth, Hui Xiong, Randall S. Burd, Ivan Marsic
2017 J jnl
CoRR
Moliang Zhou, Sen Yang, Shuyu Lv, Xinyu Li, Shuhong Chen, Ivan Marsic, Randall S. Burd
2017 conf
IPSN
Yanyi Zhang, Xinyu Li, Jianyu Zhang, Shuhong Chen, Moliang Zhou, Richard A. Farneth, Ivan Marsic, Randall S. Burd
2017 J jnl
CoRR
Xinyu Li, Yanyi Zhang, Jianyu Zhang, Shuhong Chen, Ivan Marsic, Richard A. Farneth, Randall S. Burd
2017 conf
ICHI
Moliang Zhou, Sen Yang, Xinyu Li, Shuyu Lv, Shuhong Chen, Ivan Marsic, Richard A. Farneth, Randall S. Burd
2017 A conf
Conference on Designing Interactive Systems
Leah Kulp, Aleksandra Sarcevic, Richard A. Farneth, Omar Z. Ahmed, Dung Mai, Ivan Marsic, Randall S. Burd
2017 conf
ICHI
Yue Gu, Xinyu Li, Shuhong Chen, Hunagcan Li, Richard A. Farneth, Ivan Marsic, Randall S. Burd
2017 conf
ICHI
Sen Yang, Moliang Zhou, Shuhong Chen, Xin Dong, Omar Z. Ahmed, Randall S. Burd, Ivan Marsic
2017 J jnl
CoRR
Xinyu Li, Yanyi Zhang, Ivan Marsic, Randall S. Burd
2017 J jnl
IEEE Intell. Informatics Bull.
Sen Yang, Jingyuan Li, Xiaoyi Tang, Shuhong Chen, Ivan Marsic, Randall S. Burd
2017 J jnl
CoRR
Xinyu Li, Yanyi Zhang, Jianyu Zhang, Yueyang Chen, Shuhong Chen, Yue Gu, Moliang Zhou, Richard A. Farneth, Ivan Marsic, Randall S. Burd
2017 conf
ICDM Workshops
Shuhong Chen, Sen Yang, Moliang Zhou, Randall S. Burd, Ivan Marsic
2017 J jnl
CoRR
Shuhong Chen, Sen Yang, Moliang Zhou, Randall S. Burd, Ivan Marsic
2017 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Xinyu Li, Yanyi Zhang, Jianyu Zhang, Moliang Zhou, Shuhong Chen, Yue Gu, Yueyang Chen, Ivan Marsic, Richard A. Farneth, Randall S. Burd
2017 A* conf
ACM Multimedia
Xinyu Li, Yanyi Zhang, Jianyu Zhang, Yueyang Chen, Huangcan Li, Ivan Marsic, Randall S. Burd
2017 conf
ICHI
Sen Yang, Yichen Zhou, Yifeng Guo, Richard A. Farneth, Ivan Marsic, Randall S. Burd
2016 conf
IEEE RFID
Xinyu Li, Dongyang Yao, Xuechao Pan, Jonathan Johannaman, Jaewon Yang, Rachel Webman, Aleksandra Sarcevic, Ivan Marsic, Randall S. Burd
2016 Misc conf
AMIA
Aleksandra Sarcevic, Zhan Zhang, Ivan Marsic, Randall S. Burd, Leah Kulp
2016 Misc conf
SenSys
Xinyu Li, Yanyi Zhang, Ivan Marsic, Aleksandra Sarcevic, Randall S. Burd
2016 conf
S3@MobiCom
Xinyu Li, Yanyi Zhang, Mengzhu Li, Ivan Marsic, Jaewon Yang, Randall S. Burd
2016 conf
PervasiveHealth
Aleksandra Sarcevic, Brett J. Rosen, Leah J. Kulp, Ivan Marsic, Randall S. Burd
2016 A* conf
ICDM
Sen Yang, Moliang Zhou, Rachel Webman, Jaewon Yang, Aleksandra Sarcevic, Ivan Marsic, Randall S. Burd
2016 conf
UEMCON
Xinyu Li, Yanyi Zhang, Mengzhu Li, Shuhong Chen, Farneth R. Austin, Ivan Marsic, Randall S. Burd
2016 J jnl
IEEE Trans. Mob. Comput.
Siddika Parlak, Ivan Marsic, Aleksandra Sarcevic, Waheed U. Bajwa, Lauren J. Waterhouse, Randall S. Burd
2016 C conf
ICISP
Xinyu Li, Yanyi Zhang, Ivan Marsic, Randall S. Burd
2014 A* conf
CHI
Diana S. Kusunoki, Aleksandra Sarcevic, Nadir Weibel, Ivan Marsic, Zhan Zhang, Genevieve Tuveson, Randall S. Burd
2014 Misc conf
AMIA
Bradford Winters, Randall S. Burd, Jesse Cirimele, Leslie Wu, Aleksandra Sarcevic
2014 B conf
GROUP
Zhan Zhang, Aleksandra Sarcevic, Maria Yala, Randall S. Burd
2013 conf
PervasiveHealth
Diana S. Kusunoki, Aleksandra Sarcevic, Nadir Weibel, Randall S. Burd
2013 Misc conf
AMIA
Zhan Zhang, Aleksandra Sarcevic, Randall S. Burd
2013 A conf
CSCW
Diana S. Kusunoki, Aleksandra Sarcevic, Zhan Zhang, Randall S. Burd
2013 B conf
FG
Ishani Chakraborty, Ahmed M. Elgammal, Randall S. Burd
2012 conf
PervasiveHealth
Aleksandra Sarcevic, Nadir Weibel, James D. Hollan, Randall S. Burd
2012 J jnl
J. Biomed. Informatics
Siddika Parlak, Aleksandra Sarcevic, Ivan Marsic, Randall S. Burd
2012 J jnl
ACM Trans. Comput. Hum. Interact.
Aleksandra Sarcevic, Ivan Marsic, Randall S. Burd
2011 conf
BODYNETS
Siddika Parlak, Ivan Marsic, Randall S. Burd
2011 A conf
CSCW
Aleksandra Sarcevic, Leysia Palen, Randall S. Burd
2011 J jnl
Int. J. Medical Informatics
Aleksandra Sarcevic, Ivan Marsic, Lauren J. Waterhouse, David C. Stockwell, Randall S. Burd
2009 B conf
GROUP
Aleksandra Sarcevic, Randall S. Burd
2008 Misc conf
AMIA
Aleksandra Sarcevic, Randall S. Burd
2008 conf
CHI Extended Abstracts
Aleksandra Sarcevic, Michael E. Lesk, Ivan Marsic, Randall S. Burd
2008 A conf
CSCW
Aleksandra Sarcevic, Ivan Marsic, Michael E. Lesk, Randall S. Burd
redb/extractors/decompiler/bninja/analysis/cfg-old.py
← Index redb/extractors/decompiler/bninja/analysis/cfg-old.py python
from collections import deque
from enum import Enum

from binaryninja.enums import (
    BranchType,
    InstructionTextTokenType,
)

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


class CFGAnalysis:
    def __init__(self, function):
        self.function = function

    def determine_block_type(self, block) -> str:
        """Determine the type of a basic block."""
        # Check if it's a thunk function (usually just a jump or call)
        if len(block.disassembly_text) <= 2 and any(
            "jmp" in line.tokens[0].text.lower() for line in block.disassembly_text
        ):
            return "THUNK"

        # Check if it contains only data (no valid instructions)
        if all(not line.tokens for line in block.disassembly_text):
            return "DATA"

        # Default to code
        return "CODE"

    def extract_cyclomatic_complexity(self):
        """
        Cyclomatic complexity (McCabe’s metric) measures the number of linearly independent paths
        through a function’s control flow graph (CFG).
        The standard formula is:

            M = E - N + 2

        where:
            - E = number of edges in the CFG
            - N = number of nodes (basic blocks)
            - 2 accounts for the entry and exit nodes of a single connected graph
        """
        if self.function is None:
            return 0

        # number of basic blocks
        num_blocks = len(self.function.basic_blocks)
        # number of edges in the graph
        num_edges = sum(
            len(basic_block.outgoing_edges)
            for basic_block in self.function.basic_blocks
        )
        return num_edges - num_blocks + 2

    def extract_function_cfg(self):
        """Extract information about a function CFG and return it as a dictionary."""

        function = self.function
        function_data = {
            "function_address": self.function.start,
            "blocks": [],
            "measures": {
                "cyclomatic_complexity": self.extract_cyclomatic_complexity(),
            },
        }

        if self.function is None:
            return function_data

        # Get the map of the depth associated to every block
        depths = self.get_map_depth()

        # Get the map of the positions associated to every block
        id_maps = self.get_block_id_map()

        # Extract block data with graph structure information
        for block in function.basic_blocks:
            # dominators per every block translated
            dominators = sorted(self.extract_dominators(block, id_maps))

            # post dominators
            post_dominators = sorted(self.extract_post_dominators(block, id_maps))

            # Build block instructions string
            block_instructions = "\n".join(str(line) for line in block.disassembly_text)

            # Determine block type
            block_type = self.determine_block_type(block)

            # Extract successors directly from basic block
            successor_blocks = [edge.target.start for edge in block.outgoing_edges]
            # We ensure a canonical order and we sort the edges
            successor_blocks.sort()

            # Extract predecessors directly from basic block
            predecessor_blocks = [edge.source.start for edge in block.incoming_edges]
            # We ensure a canonical order and we sort the edges
            predecessor_blocks.sort()

            # Determine branch type from outgoing edges
            branch_type = self.determine_branch_type(block)

            instructions_count = len(block.disassembly_text)

            # Create block record
            block_json = {
                "function_address": self.function.start,
                "block_start_address": block.start,
                "block_end_address": block.end,
                "block_size": block.end - block.start,
                "instructions_count": instructions_count,
                "block_instructions_hash": calculate_sha256(block_instructions),
                "predecessor_blocks": predecessor_blocks,
                "successor_blocks": successor_blocks,
                "depth": depths[block.start],
                "position": id_maps[block.start],
                "branch_type": branch_type,
                "block_type": block_type,
                "flags": self.extract_block_flags(block),
                "dominators": dominators,
                "post_dominators": post_dominators,
            }
            function_data["blocks"].append(block_json)

        return function_data

    def extract_dominators(self, bb, id_maps):
        """Extract the dominators normalized"""
        dom_idx = [id_maps[d.start] for d in bb.dominators]
        return dom_idx

    def extract_post_dominators(self, bb, id_maps):
        """Extract the post-dominators normalized"""
        post_dom_idx = [id_maps[d.start] for d in bb.post_dominators]
        return post_dom_idx

    def determine_branch_type(self, block):
        """
        Determine the type of branch at the end of a basic block.
        This combines edge type information with instruction analysis.
        """
        # If no outgoing edges, it might be a return or terminal block
        if not block.outgoing_edges:
            # Check if the last instruction is a return
            for line in reversed(list(block.disassembly_text)):
                if line.tokens and any(
                    token.text.lower() in ["ret", "retn"] for token in line.tokens
                ):
                    return "RETURN"
            return "UNKNOWN"

        # Collect branch types from all outgoing edges
        branch_types = []
        for edge in block.outgoing_edges:
            edge_type = edge.type
            # Map edge type to our branch type enum
            if isinstance(edge_type, str):
                if edge_type == "IndirectCall":
                    branch_types.append("CALL")
                else:
                    branch_types.append("UNKNOWN")
            else:
                # Use our mapping for integer/enum values
                type_mapping = {
                    BranchType.UnconditionalBranch: "DIRECT",
                    BranchType.FalseBranch: "CONDITIONAL",
                    BranchType.TrueBranch: "CONDITIONAL",
                    BranchType.CallDestination: "CALL",
                    BranchType.FunctionReturn: "RETURN",
                    BranchType.SystemCall: "CALL",
                    BranchType.IndirectBranch: "INDIRECT",
                    BranchType.ExceptionBranch: "UNKNOWN",
                    BranchType.UnresolvedBranch: "UNKNOWN",
                    BranchType.UserDefinedBranch: "UNKNOWN",
                }
                branch_types.append(type_mapping.get(edge_type, "UNKNOWN"))

        # Determine overall branch type (prioritize CALL > RETURN > CONDITIONAL > DIRECT)
        if "CALL" in branch_types:
            return "CALL"
        elif "RETURN" in branch_types:
            return "RETURN"
        elif "CONDITIONAL" in branch_types:
            return "CONDITIONAL"
        elif "DIRECT" in branch_types:
            return "DIRECT"
        elif len(block.outgoing_edges) == 1:
            return "FALLTHROUGH"

        # If edge analysis was inconclusive, fall back to instruction analysis
        last_instr = None
        for line in reversed(list(block.disassembly_text)):
            if line.tokens:
                last_instr = line
                break

        if last_instr:
            mnemonic = None
            for token in last_instr.tokens:
                if token.type == InstructionTextTokenType.InstructionToken:
                    mnemonic = token.text.lower()
                    break

            if mnemonic:
                if mnemonic == "call":
                    return "CALL"
                elif mnemonic == "jmp":
                    return "DIRECT"
                elif mnemonic.startswith("j") and mnemonic != "jmp":
                    return "CONDITIONAL"
                elif mnemonic in ["ret", "retn"]:
                    return "RETURN"

        return "UNKNOWN"

    def get_map_depth(self):
        """
        Run a BFS on the basic blocks of the function to assign a depth to every block
        """

        depths = {}
        entry = self.function.get_basic_block_at(self.function.start)

        ### Simple BFS
        q = deque()
        q.append(entry)
        depths[entry.start] = 0

        while q:
            b = q.popleft()
            b_depth = depths[b.start]
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in depths:
                    depths[tgt.start] = b_depth + 1
                    q.append(tgt)

        return depths

    def get_block_id_map(self):
        """
        Assign a unique, sequential ID to each basic block of the function using a BFS starting from the entry block.
        """

        id_map = {}
        entry = self.function.get_basic_block_at(self.function.start)

        q = deque()
        q.append(entry)

        current_id = 0
        id_map[entry.start] = current_id

        while q:
            b = q.popleft()
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in id_map:
                    current_id += 1
                    id_map[tgt.start] = current_id
                    q.append(tgt)

        return id_map

    def extract_block_flags(self, block):
        """
        Get the flags for every basic block. Currently, we implemented these heuristics:
            - if a basic block is the entry node for a function
            - if a basic block is the exit block for a function
            - if a basic block is part of a natural loop
        """
        flags = []

        if block.start == self.function.start:
            flags.append(BlockFlags.EntryBlock.value)

        if any(edge.type == BranchType.FunctionReturn for edge in block.outgoing_edges):
            flags.append(BlockFlags.ExitBlock.value)

        # if this block is in its dominance frontier, then it's part of a natural loop
        if block in block.dominance_frontier:
            flags.append(BlockFlags.LoopBlock.value)

        return flags


class BlockFlags(Enum):
    # generally, the basic block identifying the entry point of the function
    EntryBlock = "EntryBlock"
    # any basic blocks that makes the control flow exiting from the current function
    ExitBlock = "ExitBlock"
    # any block is in a natural loop if it is in its own dominance frontier
    LoopBlock = "LoopBlock"


class BlockType(Enum):
    THUNK = "THUNK"
    DATA = "DATA"
    PADDING = "PADDING"
    CODE = "CODE"