J. Cole Smith

75 papers Journal 73Unranked 1
YearRankTypeTitle / Venue / Authors
2024 J jnl
Networks
Alexey A. Bochkarev, J. Cole Smith
2023 J jnl
Networks
Di H. Nguyen, Yongjia Song, J. Cole Smith
2023 J jnl
INFORMS J. Comput.
Alexey A. Bochkarev, J. Cole Smith
2022 J jnl
Math. Program.
Leonardo Lozano, J. Cole Smith
2022 J jnl
Networks
Robert M. Curry, J. Cole Smith
2022 J jnl
Eur. J. Oper. Res.
Di H. Nguyen, J. Cole Smith
2021 J jnl
Networks
S. Raghavan, J. Cole Smith
2021 J jnl
Networks
S. Raghavan, J. Cole Smith
2021 J jnl
Oper. Res.
Tim Holzmann, J. Cole Smith
2020 J jnl
Eur. J. Oper. Res.
J. Cole Smith, Yongjia Song
2020 J jnl
Oper. Res.
Leonardo Lozano, David Bergman, J. Cole Smith
2019 J jnl
INFORMS J. Comput.
J. Cole Smith
2018 J jnl
Comput. Oper. Res.
I. Esra Büyüktahtakin, J. Cole Smith, Joseph C. Hartman
2018 J jnl
Eur. J. Oper. Res.
Tim Holzmann, J. Cole Smith
2017 J jnl
INFORMS J. Comput.
Leonardo Lozano, J. Cole Smith
2017 J jnl
Oper. Res.
Leonardo Lozano, J. Cole Smith
2017 J jnl
Networks
Z. Caner Taskin, J. Cole Smith
2017 J jnl
Oper. Res. Lett.
Leonardo Lozano, J. Cole Smith, Mary E. Kurz
2016 J jnl
J. Glob. Optim.
Yen Tang, Jean-Philippe P. Richard, J. Cole Smith
2016 J jnl
Discret. Optim.
Mehdi Hemmati, J. Cole Smith
2016 J jnl
Comput. Ind. Eng.
Robert M. Curry, J. Cole Smith
2016 J jnl
Networks
Jorge A. Sefair, J. Cole Smith
2016 J jnl
J. Glob. Optim.
Warren P. Adams, Suvrajeet Sen, J. Cole Smith
2015 J jnl
Discret. Optim.
Sibel B. Sonuc, J. Cole Smith, Illya V. Hicks
2015 J jnl
J. Sched.
Bita Tadayon, J. Cole Smith
2015 J jnl
Networks
Burak Büke, J. Cole Smith, Sadie Thomas
2014 J jnl
Comput. Optim. Appl.
Mehdi Hemmati, J. Cole Smith, My T. Thai
2014 J jnl
J. Optim. Theory Appl.
Bita Tadayon, J. Cole Smith
2014 J jnl
INFORMS J. Comput.
Behnam Behdani, J. Cole Smith
2014 J jnl
Math. Program.
Kelly M. Sullivan, J. Cole Smith, David P. Morton
2014 J jnl
Networks
Kelly M. Sullivan, J. Cole Smith
2013 J jnl
Ann. Oper. Res.
Siqian Shen, J. Cole Smith
2013 J jnl
IEEE Trans. Mob. Comput.
YoungSang Yun, Ye Xia, Behnam Behdani, J. Cole Smith
2013 J jnl
Networks
John Penuel, J. Cole Smith, Siqian Shen
2012 J jnl
Comput. Optim. Appl.
J. Cole Smith, Elif Ulusal, Illya V. Hicks
2012 J jnl
Comput. Oper. Res.
Behnam Behdani, YoungSang Yun, J. Cole Smith, Ye Xia
2012 J jnl
Discret. Optim.
Siqian Shen, J. Cole Smith, Roshan Goli
2012 J jnl
Optim. Lett.
Hanif D. Sherali, J. Cole Smith
2012 J jnl
Ann. Oper. Res.
Z. Caner Taskin, J. Cole Smith, H. Edwin Romeijn
2012 J jnl
Networks
Siqian Shen, J. Cole Smith
2011 J jnl
J. Probl. Solving
Mehdi Hemmati, J. Cole Smith
2010 conf
CDC
YoungSang Yun, Ye Xia, Behnam Behdani, J. Cole Smith
2010 J jnl
Manag. Sci.
Siqian Shen, J. Cole Smith, Shabbir Ahmed
2010 J jnl
Oper. Res.
Z. Caner Taskin, J. Cole Smith, H. Edwin Romeijn, James F. Dempsey
2009 J jnl
INFORMS J. Comput.
Enock Chisonge Mofya, J. Cole Smith
2009 J jnl
Optim. Methods Softw.
Dale Henderson, J. Cole Smith
2009 J jnl
Discret. Optim.
Z. Caner Taskin, J. Cole Smith, Shabbir Ahmed, Andrew J. Schaefer
2009 J jnl
Networks
April K. Andreas, J. Cole Smith
2009 J jnl
Math. Program.
Hanif D. Sherali, J. Cole Smith
2008 J jnl
J. Glob. Optim.
April K. Andreas, J. Cole Smith, Simge Küçükyavuz
2008 J jnl
INFORMS J. Comput.
April K. Andreas, J. Cole Smith
2008 J jnl
Interfaces
Leo Lopes, Meredith Aronson, Gary Carstensen, J. Cole Smith
2008 J jnl
Networks
J. Cole Smith
2007 J jnl
Eur. J. Oper. Res.
Benjamin Armbruster, J. Cole Smith, Kihong Park
2007 J jnl
Optim. Lett.
Hanif D. Sherali, J. Cole Smith
2007 J jnl
Oper. Res. Lett.
J. Cole Smith, Churlzu Lim, J. Neil Bearden
2007 J jnl
J. Glob. Optim.
J. Cole Smith, Churlzu Lim, Fransisca Sudargho
2006 J jnl
Int. Trans. Oper. Res.
J. Cole Smith, Barbara M. P. Fraticelli, Chase Rainwater
2006 J jnl
Math. Program.
Hanif D. Sherali, J. Cole Smith
2006 J jnl
J. Comb. Optim.
Enock Chisonge Mofya, J. Cole Smith
2006 J jnl
Decis. Anal.
Churlzu Lim, J. Neil Bearden, J. Cole Smith
2005 J jnl
Discret. Appl. Math.
Hanif D. Sherali, J. Cole Smith
2005 J jnl
Networks
Jennifer A. Horne, J. Cole Smith
2005 J jnl
INFORMS J. Comput.
J. Cole Smith, Sheldon H. Jacobson
2005 J jnl
Networks
Jennifer A. Horne, J. Cole Smith
2005 J jnl
Discret. Optim.
Hanif D. Sherali, J. Cole Smith
2004 J jnl
Networks
J. Cole Smith, Andrew J. Schaefer, Joyce W. Yen
2004 J jnl
Eur. J. Oper. Res.
J. Cole Smith
2003 J jnl
J. Sched.
Kenneth R. Baker, J. Cole Smith
2002 J jnl
Transp. Sci.
Hanif D. Sherali, J. Cole Smith, Antonio A. Trani
2001 J jnl
Eur. J. Oper. Res.
Hanif D. Sherali, J. Cole Smith, Shokri Z. Selim
2001 J jnl
Manag. Sci.
Hanif D. Sherali, J. Cole Smith
2001
J. Cole Smith
2000 J jnl
INFORMS J. Comput.
Hanif D. Sherali, J. Cole Smith, Youngho Lee
2000 J jnl
Transp. Sci.
Hanif D. Sherali, J. Cole Smith, Antonio A. Trani, Srinivas Sale
tests/unit/test_decompile_medium_level.py
← Index tests/unit/test_decompile_medium_level.py python
# tests/unit/test_decompile_medium_level.py
"""Unit tests (mocked BN) for bninja/analysis/medium_level.py
   and bninja/analysis/medium_level_normalization.py."""
# tests/unit/test_decompile_medium_level.py
import sys
from unittest.mock import MagicMock, patch

# Installa gli stubs BN
from tests.unit.conftest_binja_stubs import install_binja_stubs
install_binja_stubs()

# ── Definisci MockMLILInstruction PRIMA di importare il modulo ──
class MockMLILInstruction:
    def __init__(self, operation, address=0, operands=None):
        self.operation = operation
        self.address = address
        self.operands = operands or []

# ── Patcha il modulo BN in modo che isinstance() funzioni ──
sys.modules["binaryninja"].MediumLevelILInstruction = MockMLILInstruction
sys.modules["binaryninja"].SSAVariable = type("SSAVariable", (), {})
sys.modules["binaryninja"].Variable = type("Variable", (), {})
sys.modules["binaryninja"].ILIntrinsic = type("ILIntrinsic", (), {})

# Ora importa il modulo — vede già i tipi corretti
from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
    MediumLevelNormalization,
)	

class MockMLILFunction:
    def __init__(self, instructions):
        self._instructions = instructions

    @property
    def instructions(self):
        return iter(self._instructions)

    @property
    def basic_blocks(self):
        # one block containing all instructions, good enough for MinHasher
        block = MagicMock()
        block.__iter__ = lambda self_: iter([])  # not used by MediumLevelAnalysis
        return [block]


class MockFunction:
    def __init__(self, name="func", start=0x1000, mlil=None):
        self.name = name
        self.start = start
        self.mlil = mlil



class TestMediumLevelNormalization:
    def setup_method(self):
        from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
            MediumLevelNormalization,
        )
        self.norm = MediumLevelNormalization()

    def test_normalize_skeleton_single_instruction(self):
        il = MockMLILInstruction(operation=42, operands=[])
        result = self.norm.normalize_instruction_all_levels(il)
        assert result == [42]

    def test_normalize_skeleton_nested(self):
        inner = MockMLILInstruction(operation=7, operands=[])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [1, 7]

    def test_normalize_skeleton_with_list_operand(self):
        inner_a = MockMLILInstruction(operation=10, operands=[])
        inner_b = MockMLILInstruction(operation=11, operands=[])
        outer = MockMLILInstruction(operation=2, operands=[[inner_a, inner_b]])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [2, 10, 11]

    def test_normalize_skeleton_none(self):
        result = self.norm.normalize_instruction_all_levels(None)
        # collect on None should leave ops empty
        assert result == []

    def test_normalize_typed_appends_leaf_types(self):
        # operand is a plain int -> "CONST"
        il = MockMLILInstruction(operation=3, operands=[42])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [3, "CONST"]

    def test_normalize_typed_bool_before_int(self):
        # bool must be detected before int (since bool is an int subclass)
        il = MockMLILInstruction(operation=4, operands=[True])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [4, "BOOL"]

    def test_normalize_typed_float(self):
        il = MockMLILInstruction(operation=5, operands=[1.5])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [5, "FLOAT_CONST"]

    def test_normalize_typed_str(self):
        il = MockMLILInstruction(operation=6, operands=["hello"])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [6, "STR"]

    def test_normalize_typed_unknown_falls_back_to_typename(self):
        class Weird:
            pass
        il = MockMLILInstruction(operation=8, operands=[Weird()])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [8, "WEIRD"]

    def test_normalize_typed_nested_mlil(self):
        inner = MockMLILInstruction(operation=99, operands=[7])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instr_with_operands(outer)
        assert result == [1, 99, "CONST"]

    def test_normalize_typed_list_mixed(self):
        inner = MockMLILInstruction(operation=50, operands=[])
        il = MockMLILInstruction(operation=2, operands=[[inner, 99]])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [2, 50, "CONST"]


class TestMediumLevelAnalysis:
    def _make_analysis(self, instructions=None, mlil=True, start=0x1000):
        from redb.extractors.decompiler.bninja.analysis.medium_level import (
            MediumLevelAnalysis,
        )
        mlil_func = MockMLILFunction(instructions or []) if mlil else None
        func = MockFunction(name="testfunc", start=start, mlil=mlil_func)
        bv = MagicMock()
        return MediumLevelAnalysis(func, bv, MagicMock())

    def test_collect_returns_empty_when_no_mlil(self):
        a = self._make_analysis(mlil=False)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk == [] and sk_addr == [] and ty == [] and ty_addr == []

    def test_collect_skeleton_and_typed_basic(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()

        assert sk == [[1], [2]]
        assert ty == [[1], [2, "CONST"]]
        assert sk_addr == [(0, [1]), (4, [2])]
        assert ty_addr == [(0, [1]), (4, [2, "CONST"])]

    def test_collect_negative_offset_clamped_to_zero(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x900, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        _, sk_addr, _, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk_addr[0][0] == 0
        assert ty_addr[0][0] == 0

    def test_log_error_records_entry(self):
        a = self._make_analysis()
        a.log_error("boom", "fname", 0x1234, ValueError("x"), "loc")
        assert len(a.errors) == 1
        err = a.errors[0]
        assert err["function_name"] == "fname"
        assert err["function_address"] == "4660"  # hex 0x1234
        assert err["error_location"] == "loc"
        assert err["error_message"] == "boom"
        assert err["error_type"] == "ValueError"
        assert "timestamp" in err

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_returns_expected_keys(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = [1, 2, 3]

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        result, errors = a.analyze()

        expected_keys = {
            "function_address",
            "body_mlil_skeleton_vector",
            "sha256_mlil_skeleton",
            "tlsh_mlil_skeleton",
            "minhash_mlil_skeleton",
            "body_mlil_typed_vector",
            "sha256_mlil_typed",
            "tlsh_mlil_typed",
            "minhash_mlil_typed",
        }
        assert set(result.keys()) == expected_keys
        assert result["function_address"] == 0x1000
        assert result["minhash_mlil_skeleton"] == [1, 2, 3]
        assert result["minhash_mlil_typed"] == [1, 2, 3]
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_empty_mlil(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []
        a = self._make_analysis(mlil=False)
        result, errors = a.analyze()
        assert result["body_mlil_skeleton_vector"] == []
        assert result["body_mlil_typed_vector"] == []
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_sha256_differs_skeleton_vs_typed(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[42]),
            MockMLILInstruction(operation=2, address=0x1004, operands=["foo"]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[True]),
        ]
        a = self._make_analysis(instructions=instrs)
        result, _ = a.analyze()
        # skeleton ignores operand leaves, typed includes them -> different hashes
        assert result["sha256_mlil_skeleton"] != result["sha256_mlil_typed"]


class TestMinHasherMLILKinds:
    def _make_func(self, instrs):
        # MinHasher iterates basic_blocks then over each block
        block = MagicMock()
        block.__iter__ = lambda self_: iter(instrs)
        f = MagicMock()
        f.basic_blocks = [block]
        return f

    def test_mlil_skeleton_uses_medium_normalizer(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=i, operands=[]) for i in range(5)
        ]
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        result = hasher.calculateMinHash()
        # 5 instructions -> 3 trigrams -> non-empty signature
        assert result != []

    def test_typed_mlil_differs_from_skeleton(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=1, operands=[42]),
            MockMLILInstruction(operation=2, operands=["s"]),
            MockMLILInstruction(operation=3, operands=[True]),
            MockMLILInstruction(operation=4, operands=[1.5]),
        ]
        func = self._make_func(instrs)
        skel = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL).calculateMinHash()
        typed = MinHasher(seed=42, il_function=func, kind=TokenKind.TYPED_MLIL).calculateMinHash()
        # Same seed, same instructions, but typed has extra leaf tokens
        # -> hashes should generally differ
        assert skel != typed

    def test_mlil_too_few_instructions(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [MockMLILInstruction(operation=1, operands=[])] * 2
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        assert hasher.calculateMinHash() == []

    def test_unsupported_kind_raises(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import MinHasher
        func = self._make_func([])
        hasher = MinHasher(seed=42, il_function=func, kind="bogus")
        with pytest.raises(ValueError):
            hasher.calculateMinHash()