{"record":{"id":"991265efb45ab7d4","repo":"NationalSecurityAgency/ghidra","slug":"address-selection-column-must-have-address-addres","errorCode":null,"errorMessage":"Address-selection column must have Address, AddressRange, or AddressSetView type","messagePattern":"Address-selection column must have Address, AddressRange, or AddressSetView type","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/ProposedUtils/src/main/java/docking/widgets/table/DefaultEnumeratedColumnProgramTableModel.java","lineNumber":39,"sourceCode":"import ghidra.program.util.ProgramLocation;\nimport ghidra.program.util.ProgramSelection;\n\npublic class DefaultEnumeratedColumnProgramTableModel<C extends Enum<C> & EnumeratedTableColumn<C, R>, R>\n\t\textends DefaultEnumeratedColumnTableModel<C, R>\n\t\timplements EnumeratedColumnProgramTableModel<R> {\n\tprotected final C selColumn;\n\n\tprivate Program program;\n\n\tpublic DefaultEnumeratedColumnProgramTableModel(PluginTool tool, String name, Class<C> colType,\n\t\t\tC selColumn) {\n\t\tsuper(tool, name, colType);\n\t\tif (selColumn != null) {\n\t\t\tClass<?> valueClass = selColumn.getValueClass();\n\t\t\tif (!Address.class.isAssignableFrom(valueClass) &&\n\t\t\t\t!AddressRange.class.isAssignableFrom(valueClass) &&\n\t\t\t\t!AddressSetView.class.isAssignableFrom(valueClass)) {\n\t\t\t\tthrow new IllegalArgumentException(\n\t\t\t\t\t\"Address-selection column must have Address, AddressRange, \" +\n\t\t\t\t\t\t\"or AddressSetView type\");\n\t\t\t}\n\t\t}\n\t\tthis.selColumn = selColumn;\n\t}\n\n\t@Override\n\tpublic ProgramLocation getProgramLocation(int row, int column) {\n\t\tClass<?> columnClass = getColumnClass(column);\n\t\tif (!Address.class.isAssignableFrom(columnClass) &&\n\t\t\t!ProgramLocation.class.isAssignableFrom(columnClass)) {\n\t\t\treturn null;\n\t\t}\n\t\tObject value = getValueAt(row, column);\n\t\tif (value instanceof Address) {\n\t\t\treturn new ProgramLocation(program, (Address) value);\n\t\t}","sourceCodeStart":21,"sourceCodeEnd":57,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/ProposedUtils/src/main/java/docking/widgets/table/DefaultEnumeratedColumnProgramTableModel.java#L21-L57","documentation":"Thrown by the DefaultEnumeratedColumnProgramTableModel constructor when the designated selection column (selColumn) has a value class that is not Address, AddressRange, or AddressSetView. The selection column drives getProgramSelection(), which only knows how to assemble an AddressSet from those three types, so any other column type would silently break program selection.","triggerScenarios":"Passing a selColumn enum constant whose getValueClass() returns String, Integer, Boolean, or any custom type. Designating a display-only column (e.g. a name or size column) as the selection column. Using the same enum for both data display and selection when the value class is not address-oriented.","commonSituations":"New table model subclasses that copy an existing constructor call and point selColumn at the wrong enum constant. Reusing an enumerated column that previously held addresses but was changed to hold a label or scalar type. Passing selColumn by index/ordinal confusion.","solutions":["Point selColumn at the enum constant whose getValueClass() returns Address, AddressRange, or AddressSetView.","If no such column exists, pass selColumn=null to disable program selection entirely.","Add or designate an address-producing column in the enum and give it a getValueOf that returns an Address/AddressRange/AddressSetView."],"exampleFix":"// before\nnew DefaultEnumeratedColumnProgramTableModel<>(\n    tool, \"MyTable\", MyCol.class, MyCol.NAME); // NAME.getValueClass() == String\n\n// after\nnew DefaultEnumeratedColumnProgramTableModel<>(\n    tool, \"MyTable\", MyCol.class, MyCol.ADDRESS); // ADDRESS.getValueClass() == Address","handlingStrategy":"validation","validationCode":"Class<?> vc = selColumn != null ? selColumn.getValueClass() : null;\nboolean ok = selColumn == null ||\n    Address.class.isAssignableFrom(vc) ||\n    AddressRange.class.isAssignableFrom(vc) ||\n    AddressSetView.class.isAssignableFrom(vc);\nif (!ok) selColumn = null; // or pick the address column\nnew DefaultEnumeratedColumnProgramTableModel<>(tool, name, colType, selColumn);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Designate exactly one enum constant as the address-producing selection column.","Pass null for selColumn when no address-typed column exists.","Keep a unit test asserting the selection column's getValueClass() is address-oriented."],"tags":["ghidra","table-model","address-selection","validation"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}