GP-932 renamed and corrected improper implementation and use of the

Datatype.isDynamicallySized method
This commit is contained in:
ghidra1 2021-05-10 18:48:32 -04:00
parent 92b7728cd7
commit b5160b253c
83 changed files with 320 additions and 390 deletions

View file

@ -947,7 +947,7 @@ public class DataTypeMergeManager implements MergeResolver {
} }
if (resolvedDt != null) { if (resolvedDt != null) {
return PointerDataType.getPointer(resolvedDt, return PointerDataType.getPointer(resolvedDt,
pointerDt.isDynamicallySized() ? -1 : pointerDt.getLength()); pointerDt.hasLanguageDependantLength() ? -1 : pointerDt.getLength());
} }
} }
return null; return null;

View file

@ -456,7 +456,7 @@ public class DataTypeUtils {
if (dataType instanceof Pointer) { if (dataType instanceof Pointer) {
Pointer pdt = (Pointer) dataType; Pointer pdt = (Pointer) dataType;
return new PointerDataType(copyToNamedBaseDataType(pdt.getDataType(), dtm), return new PointerDataType(copyToNamedBaseDataType(pdt.getDataType(), dtm),
pdt.isDynamicallySized() ? -1 : pdt.getLength(), dtm); pdt.hasLanguageDependantLength() ? -1 : pdt.getLength(), dtm);
} }
else if (dataType instanceof Array) { else if (dataType instanceof Array) {
Array adt = (Array) dataType; Array adt = (Array) dataType;

View file

@ -40,11 +40,6 @@ public class StackPieceDataType extends DataTypeImpl {
return var.getDataType().getName() + ":" + pieceLen + " (piece)"; return var.getDataType().getName() + ":" + pieceLen + " (piece)";
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -165,9 +165,4 @@ public abstract class AbstractLeb128DataType extends BuiltIn implements Dynamic
return false; return false;
} }
@Override
public boolean isDynamicallySized() {
return true;
}
} }

View file

@ -44,11 +44,6 @@ public class DwarfEncodingModeDataType extends BuiltIn {
super(CategoryPath.ROOT, "dwfenc", dtm); super(CategoryPath.ROOT, "dwfenc", dtm);
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -67,11 +67,6 @@ public class PcRelative31AddressDataType extends BuiltIn {
return name; return name;
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public int getLength() { public int getLength() {
return 4; return 4;

View file

@ -84,8 +84,17 @@ public class FdeTable {
DataType encodedDt = decoder.getDataType(prog); DataType encodedDt = decoder.getDataType(prog);
if (encodedDt.isDynamicallySized()) { if (encodedDt.getLength() <= 0) {
throw new ExceptionHandlerFrameException("Cannot build FDE structure with dynamically-encoded values"); throw new ExceptionHandlerFrameException(
"Cannot build FDE structure with Dynamic or Void value type: " +
encodedDt.getClass().getName());
}
if (encodedDt.hasLanguageDependantLength()) {
// Should avoid using value types whose size fluctuates with Data Organization
throw new ExceptionHandlerFrameException(
"Cannot build FDE structure with dynamically-sized value type: " +
encodedDt.getClass().getName());
} }
fdeTableEntry.deleteAll(); fdeTableEntry.deleteAll();

View file

@ -1418,7 +1418,7 @@ public class DWARFDataTypeImporter {
for (int i = ptrChainTypes.size() - 1; i >= 0; i--) { for (int i = ptrChainTypes.size() - 1; i >= 0; i--) {
Pointer origPtr = ptrChainTypes.get(i); Pointer origPtr = ptrChainTypes.get(i);
result = new PointerDataType(result, result = new PointerDataType(result,
origPtr.isDynamicallySized() ? -1 : origPtr.getLength(), dataTypeManager); origPtr.hasLanguageDependantLength() ? -1 : origPtr.getLength(), dataTypeManager);
} }
return result; return result;

View file

@ -34,11 +34,6 @@ class MSRichProductBuildNumberDataType extends DataTypeImpl {
this.compid = compid; this.compid = compid;
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -34,11 +34,6 @@ class MSRichProductIDDataType extends DataTypeImpl {
this.compid = compid; this.compid = compid;
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -34,7 +34,7 @@ class MSRichProductInfoDataType extends StructureDataType {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return false; return false;
} }

View file

@ -128,7 +128,7 @@ public class PERichTableDataType extends DynamicDataType {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return false; return false;
} }
@ -193,7 +193,7 @@ public class PERichTableDataType extends DynamicDataType {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return false; return false;
} }
@ -259,7 +259,7 @@ public class PERichTableDataType extends DynamicDataType {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return false; return false;
} }

View file

@ -34,11 +34,6 @@ class RichObjectCountDataType extends DataTypeImpl {
this.count = count; this.count = count;
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -35,7 +35,7 @@ class RichTableRecordDataType extends StructureDataType {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return false; return false;
} }

View file

@ -21,9 +21,9 @@ package ghidra.app.util.datatype.microsoft;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.docking.settings.SettingsDefinition; import ghidra.docking.settings.SettingsDefinition;
import ghidra.program.model.data.*; import ghidra.program.model.data.*;
import ghidra.program.model.lang.ProcessorContext;
import ghidra.program.model.mem.MemBuffer; import ghidra.program.model.mem.MemBuffer;
import ghidra.util.*; import ghidra.util.Conv;
import ghidra.util.DataConverter;
import ghidra.util.classfinder.ClassTranslator; import ghidra.util.classfinder.ClassTranslator;
/** /**
@ -76,11 +76,6 @@ public class GuidDataType extends BuiltIn {
return SIZE; return SIZE;
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public String getDescription() { public String getDescription() {
return NAME; return NAME;
@ -130,9 +125,10 @@ public class GuidDataType extends BuiltIn {
retVal += Conv.toHexString((short) (data[1] >> 16)) + delim; retVal += Conv.toHexString((short) (data[1] >> 16)) + delim;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
retVal += Conv.toHexString((byte) (data[2] >> i * 8)); retVal += Conv.toHexString((byte) (data[2] >> i * 8));
if (i == 1) if (i == 1) {
retVal += delim; retVal += delim;
} }
}
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
retVal += Conv.toHexString((byte) (data[3] >> i * 8)); retVal += Conv.toHexString((byte) (data[3] >> i * 8));
} }
@ -166,6 +162,7 @@ public class GuidDataType extends BuiltIn {
return NAME; return NAME;
} }
@Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {
return this; return this;

View file

@ -31,11 +31,6 @@ public class HTMLResourceDataType extends BuiltIn implements Dynamic {
super(null, "HTML-Resource", dtm); super(null, "HTML-Resource", dtm);
} }
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -36,6 +36,7 @@ public class ElfDataType extends FactoryStructureDataType {
super("ELF", dtm); super("ELF", dtm);
} }
@Override
public String getMnemonic(Settings settings) { public String getMnemonic(Settings settings) {
return "ELF"; return "ELF";
} }
@ -45,13 +46,6 @@ public class ElfDataType extends FactoryStructureDataType {
return "ELF Data Type"; return "ELF Data Type";
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
public boolean isDynamicallySized() {
return true;
}
@Override @Override
protected void populateDynamicStructure(MemBuffer buf, Structure struct) { protected void populateDynamicStructure(MemBuffer buf, Structure struct) {
try { try {

View file

@ -31,7 +31,6 @@ import ghidra.util.exception.DuplicateNameException;
* A datatype for creating portable executable data structures. * A datatype for creating portable executable data structures.
*/ */
public class PeDataType extends FactoryStructureDataType { public class PeDataType extends FactoryStructureDataType {
private final static long serialVersionUID = 1;
/** /**
* Constructs a new PE datatype. * Constructs a new PE datatype.
@ -54,14 +53,6 @@ public class PeDataType extends FactoryStructureDataType {
return "Windows Portable Executable Data Type"; return "Windows Portable Executable Data Type";
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
protected void populateDynamicStructure(MemBuffer buf, Structure struct) { protected void populateDynamicStructure(MemBuffer buf, Structure struct) {
try { try {

View file

@ -111,8 +111,8 @@ class ArrayDB extends DataTypeDB implements Array {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return getDataType().isDynamicallySized(); return getDataType().hasLanguageDependantLength();
} }
@Override @Override

View file

@ -189,9 +189,7 @@ abstract class CompositeDB extends DataTypeDB implements CompositeInternal {
} }
@Override @Override
public boolean isDynamicallySized() { public abstract boolean hasLanguageDependantLength();
return isPackingEnabled();
}
@Override @Override
public Object getValue(MemBuffer buf, Settings settings, int length) { public Object getValue(MemBuffer buf, Settings settings, int length) {
@ -285,27 +283,33 @@ abstract class CompositeDB extends DataTypeDB implements CompositeInternal {
/** /**
* This method throws an exception if the indicated data type is not a valid * This method throws an exception if the indicated data type is not a valid
* data type for a component of this composite data type. * data type for a component of this composite data type. If the DEFAULT
* datatype is specified when unsupported an Undefined1 will be returned
* in its place (e.g., packing enabled, Union).
* *
* @param dataType the data type to be checked. * @param dataType the data type to be checked.
* @return datatype to be used for insert/add
* @throws IllegalArgumentException if the data type is invalid. * @throws IllegalArgumentException if the data type is invalid.
*/ */
protected void validateDataType(DataType dataType) { protected DataType validateDataType(DataType dataType) {
if (isPackingEnabled() && dataType == DataType.DEFAULT) { if (dataType == DataType.DEFAULT) {
throw new IllegalArgumentException( if (isPackingEnabled() || (this instanceof Union)) {
"The DEFAULT data type is not allowed in an aligned composite data type."); return Undefined1DataType.dataType;
} }
if (dataType instanceof FactoryDataType) { return dataType;
throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type.");
} }
else if (dataType instanceof Dynamic) { if (dataType instanceof Dynamic) {
Dynamic dynamicDataType = (Dynamic) dataType; Dynamic dynamicDataType = (Dynamic) dataType;
if (!dynamicDataType.canSpecifyLength()) { if (!dynamicDataType.canSpecifyLength()) {
throw new IllegalArgumentException("The \"" + dataType.getName() + throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type."); "\" data type is not allowed in a composite data type.");
} }
} }
else if (dataType instanceof FactoryDataType || dataType.getLength() <= 0) {
throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type.");
}
return dataType;
} }
@Override @Override

View file

@ -2314,7 +2314,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
} }
else if (dt instanceof Pointer) { else if (dt instanceof Pointer) {
Pointer ptr = (Pointer) dt; Pointer ptr = (Pointer) dt;
int len = ptr.isDynamicallySized() ? -1 : ptr.getLength(); int len = ptr.hasLanguageDependantLength() ? -1 : ptr.getLength();
newDataType = createPointer(ptr.getDataType(), cat, (byte) len, handler); newDataType = createPointer(ptr.getDataType(), cat, (byte) len, handler);
} }
else if (dt instanceof StructureInternal) { else if (dt instanceof StructureInternal) {

View file

@ -155,7 +155,7 @@ class EnumDB extends DataTypeDB implements Enum {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return false; return false;
} }

View file

@ -87,7 +87,7 @@ class FunctionDefinitionDB extends DataTypeDB implements FunctionDefinition {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return false; return false;
} }

View file

@ -126,7 +126,7 @@ class PointerDB extends DataTypeDB implements Pointer {
return this; return this;
} }
// don't clone referenced data-type to avoid potential circular reference // don't clone referenced data-type to avoid potential circular reference
return new PointerDataType(getDataType(), isDynamicallySized() ? -1 : getLength(), dtm); return new PointerDataType(getDataType(), hasLanguageDependantLength() ? -1 : getLength(), dtm);
} }
@Override @Override
@ -148,7 +148,7 @@ class PointerDB extends DataTypeDB implements Pointer {
DataType dt = getDataType(); DataType dt = getDataType();
if (dt == null) { if (dt == null) {
displayName = PointerDataType.POINTER_NAME; displayName = PointerDataType.POINTER_NAME;
if (!isDynamicallySized()) { if (!hasLanguageDependantLength()) {
displayName += Integer.toString(getLength() * 8); displayName += Integer.toString(getLength() * 8);
} }
} }
@ -180,7 +180,7 @@ class PointerDB extends DataTypeDB implements Pointer {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
lock.acquire(); lock.acquire();
try { try {
checkIsValid(); checkIsValid();
@ -213,7 +213,7 @@ class PointerDB extends DataTypeDB implements Pointer {
try { try {
checkIsValid(); checkIsValid();
StringBuffer sbuf = new StringBuffer(); StringBuffer sbuf = new StringBuffer();
if (!isDynamicallySized()) { if (!hasLanguageDependantLength()) {
sbuf.append(Integer.toString(getLength() * 8)); sbuf.append(Integer.toString(getLength() * 8));
sbuf.append("-bit "); sbuf.append("-bit ");
} }
@ -291,10 +291,10 @@ class PointerDB extends DataTypeDB implements Pointer {
Pointer p = (Pointer) dt; Pointer p = (Pointer) dt;
DataType otherDataType = p.getDataType(); DataType otherDataType = p.getDataType();
if (isDynamicallySized() != p.isDynamicallySized()) { if (hasLanguageDependantLength() != p.hasLanguageDependantLength()) {
return false; return false;
} }
if (!isDynamicallySized() && (getLength() != p.getLength())) { if (!hasLanguageDependantLength() && (getLength() != p.getLength())) {
return false; return false;
} }
@ -447,7 +447,7 @@ class PointerDB extends DataTypeDB implements Pointer {
@Override @Override
public Pointer newPointer(DataType dataType) { public Pointer newPointer(DataType dataType) {
if (isDynamicallySized()) { if (hasLanguageDependantLength()) {
return new PointerDataType(dataType, dataMgr); return new PointerDataType(dataType, dataMgr);
} }
return new PointerDataType(dataType, getLength(), dataMgr); return new PointerDataType(dataType, getLength(), dataMgr);

View file

@ -119,7 +119,7 @@ class StructureDB extends CompositeDB implements StructureInternal {
checkDeleted(); checkDeleted();
if (validatePackAndNotify) { if (validatePackAndNotify) {
validateDataType(dataType); dataType = validateDataType(dataType);
dataType = resolve(dataType); dataType = resolve(dataType);
checkAncestry(dataType); checkAncestry(dataType);
} }
@ -178,12 +178,14 @@ class StructureDB extends CompositeDB implements StructureInternal {
checkDeleted(); checkDeleted();
if (validatePackAndNotify) { if (validatePackAndNotify) {
validateDataType(dataType);
dataType = resolve(dataType);
if (isInvalidFlexArrayDataType(dataType)) { if (isInvalidFlexArrayDataType(dataType)) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Unsupported flexType: " + dataType.getDisplayName()); "Unsupported flexType: " + dataType.getDisplayName());
} }
validateDataType(dataType);
dataType = resolve(dataType);
checkAncestry(dataType); checkAncestry(dataType);
} }
@ -262,7 +264,7 @@ class StructureDB extends CompositeDB implements StructureInternal {
if (ordinal == numComponents) { if (ordinal == numComponents) {
return add(dataType, length, name, comment); return add(dataType, length, name, comment);
} }
validateDataType(dataType); dataType = validateDataType(dataType);
dataType = resolve(dataType); dataType = resolve(dataType);
checkAncestry(dataType); checkAncestry(dataType);
@ -819,6 +821,11 @@ class StructureDB extends CompositeDB implements StructureInternal {
} }
} }
@Override
public boolean hasLanguageDependantLength() {
return isPackingEnabled();
}
@Override @Override
public void clearComponent(int ordinal) { public void clearComponent(int ordinal) {
lock.acquire(); lock.acquire();
@ -1047,7 +1054,7 @@ class StructureDB extends CompositeDB implements StructureInternal {
lock.acquire(); lock.acquire();
try { try {
checkDeleted(); checkDeleted();
validateDataType(dataType); dataType = validateDataType(dataType);
dataType = resolve(dataType); dataType = resolve(dataType);
checkAncestry(dataType); checkAncestry(dataType);
@ -1121,7 +1128,7 @@ class StructureDB extends CompositeDB implements StructureInternal {
throw new IndexOutOfBoundsException(ordinal); throw new IndexOutOfBoundsException(ordinal);
} }
validateDataType(dataType); dataType = validateDataType(dataType);
DataTypeComponent origDtc = getComponent(ordinal); DataTypeComponent origDtc = getComponent(ordinal);
if (origDtc.isBitFieldComponent()) { if (origDtc.isBitFieldComponent()) {
@ -1182,7 +1189,7 @@ class StructureDB extends CompositeDB implements StructureInternal {
try { try {
checkDeleted(); checkDeleted();
validateDataType(dataType); dataType = validateDataType(dataType);
DataTypeComponent origDtc = getComponentAt(offset); DataTypeComponent origDtc = getComponentAt(offset);
if (origDtc.isBitFieldComponent()) { if (origDtc.isBitFieldComponent()) {

View file

@ -61,8 +61,8 @@ class TypedefDB extends DataTypeDB implements TypeDef {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return getDataType().isDynamicallySized(); return getDataType().hasLanguageDependantLength();
} }
@Override @Override

View file

@ -130,7 +130,7 @@ class UnionDB extends CompositeDB implements UnionInternal {
private DataTypeComponent doAdd(DataType dataType, int length, String name, String comment, private DataTypeComponent doAdd(DataType dataType, int length, String name, String comment,
boolean validateAlignAndNotify) throws DataTypeDependencyException { boolean validateAlignAndNotify) throws DataTypeDependencyException {
validateDataType(dataType); dataType = validateDataType(dataType);
dataType = adjustBitField(dataType); dataType = adjustBitField(dataType);
@ -178,7 +178,7 @@ class UnionDB extends CompositeDB implements UnionInternal {
lock.acquire(); lock.acquire();
try { try {
checkDeleted(); checkDeleted();
validateDataType(dataType); dataType = validateDataType(dataType);
dataType = adjustBitField(dataType); dataType = adjustBitField(dataType);
@ -471,6 +471,12 @@ class UnionDB extends CompositeDB implements UnionInternal {
} }
} }
@Override
public boolean hasLanguageDependantLength() {
// Assume any component may have a language-dependent length
return true;
}
@Override @Override
protected void fixupComponents() { protected void fixupComponents() {
boolean changed = false; boolean changed = false;

View file

@ -81,14 +81,6 @@ public class AIFFDataType extends BuiltIn implements Dynamic {
return false; return false;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -85,14 +85,6 @@ public class AUDataType extends BuiltIn implements Dynamic {
return false; return false;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -91,11 +91,6 @@ public abstract class AbstractComplexDataType extends BuiltIn {
return "The data type for a complex number: a + bi"; return "The data type for a complex number: a + bi";
} }
@Override
public boolean isDynamicallySized() {
return false;
}
private static double toDouble(Object obj) { private static double toDouble(Object obj) {
if (obj instanceof Double) { if (obj instanceof Double) {
return (Double) obj; return (Double) obj;

View file

@ -232,7 +232,7 @@ public abstract class AbstractDataType implements DataType {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return false; // not applicable return false; // not applicable
} }

View file

@ -47,14 +47,6 @@ public abstract class AbstractFloatDataType extends BuiltIn {
return name; return name;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
/** /**
* *
* @see ghidra.program.model.data.DataType#getDescription() * @see ghidra.program.model.data.DataType#getDescription()
@ -125,7 +117,7 @@ public abstract class AbstractFloatDataType extends BuiltIn {
@Override @Override
public String getCTypeDeclaration(DataOrganization dataOrganization) { public String getCTypeDeclaration(DataOrganization dataOrganization) {
return isDynamicallySized() ? null : name; return hasLanguageDependantLength() ? null : name;
} }
private static TreeMap<Integer, AbstractFloatDataType> floatTypes; // fixed-size float types private static TreeMap<Integer, AbstractFloatDataType> floatTypes; // fixed-size float types

View file

@ -58,11 +58,6 @@ abstract class AbstractImageBaseOffsetDataType extends BuiltIn {
return getScalarDataType().getLength(); return getScalarDataType().getLength();
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public String getRepresentation(MemBuffer buf, Settings settings, int length) { public String getRepresentation(MemBuffer buf, Settings settings, int length) {
Address addr = (Address) getValue(buf, settings, length); Address addr = (Address) getValue(buf, settings, length);

View file

@ -65,14 +65,6 @@ public abstract class AbstractIntegerDataType extends BuiltIn implements ArraySt
this.signed = signed; this.signed = signed;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
/** /**
* Return the Format settings definition included in the settings * Return the Format settings definition included in the settings
* definition array * definition array

View file

@ -195,11 +195,6 @@ abstract public class AbstractStringDataType extends BuiltIn
StringDataInstance.DEFAULT_CHARSET_NAME); StringDataInstance.DEFAULT_CHARSET_NAME);
} }
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
public int getLength() { public int getLength() {
return -1; return -1;

View file

@ -78,14 +78,6 @@ public class AlignmentDataType extends BuiltIn implements Dynamic {
return new AlignmentDataType(dtm); return new AlignmentDataType(dtm);
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
public String getDescription() { public String getDescription() {
return "Consumes alignment/repeating bytes."; return "Consumes alignment/repeating bytes.";

View file

@ -88,8 +88,8 @@ public class ArrayDataType extends DataTypeImpl implements Array {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return dataType.isDynamicallySized(); return dataType.hasLanguageDependantLength();
} }
@Override @Override

View file

@ -43,6 +43,7 @@ public class BadDataType extends BuiltIn implements Dynamic {
* *
* @see ghidra.program.model.data.DataType#getMnemonic(Settings) * @see ghidra.program.model.data.DataType#getMnemonic(Settings)
*/ */
@Override
public String getMnemonic(Settings settings) { public String getMnemonic(Settings settings) {
return getName(); return getName();
} }
@ -51,21 +52,16 @@ public class BadDataType extends BuiltIn implements Dynamic {
* *
* @see ghidra.program.model.data.DataType#getLength() * @see ghidra.program.model.data.DataType#getLength()
*/ */
@Override
public int getLength() { public int getLength() {
return -1; return -1;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
public boolean isDynamicallySized() {
return false;
}
/** /**
* *
* @see ghidra.program.model.data.DataType#getDescription() * @see ghidra.program.model.data.DataType#getDescription()
*/ */
@Override
public String getDescription() { public String getDescription() {
return "** Bad Data Type **"; return "** Bad Data Type **";
} }
@ -74,6 +70,7 @@ public class BadDataType extends BuiltIn implements Dynamic {
* *
* @see ghidra.program.model.data.DataType#getValue(ghidra.program.model.mem.MemBuffer, ghidra.docking.settings.Settings, int) * @see ghidra.program.model.data.DataType#getValue(ghidra.program.model.mem.MemBuffer, ghidra.docking.settings.Settings, int)
*/ */
@Override
public Object getValue(MemBuffer buf, Settings settings, int length) { public Object getValue(MemBuffer buf, Settings settings, int length) {
return getDescription(); return getDescription();
} }
@ -87,10 +84,12 @@ public class BadDataType extends BuiltIn implements Dynamic {
* *
* @see ghidra.program.model.data.DataType#getRepresentation(MemBuffer, Settings, int) * @see ghidra.program.model.data.DataType#getRepresentation(MemBuffer, Settings, int)
*/ */
@Override
public String getRepresentation(MemBuffer buf, Settings settings, int length) { public String getRepresentation(MemBuffer buf, Settings settings, int length) {
return getDescription(); return getDescription();
} }
@Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {
return this; return this;
@ -98,14 +97,17 @@ public class BadDataType extends BuiltIn implements Dynamic {
return new BadDataType(dtm); return new BadDataType(dtm);
} }
@Override
public boolean canSpecifyLength() { public boolean canSpecifyLength() {
return true; return true;
} }
@Override
public int getLength(MemBuffer buf, int maxLength) { public int getLength(MemBuffer buf, int maxLength) {
return -1; return -1;
} }
@Override
public DataType getReplacementBaseType() { public DataType getReplacementBaseType() {
return null; return null;
} }

View file

@ -28,8 +28,6 @@ import ghidra.program.model.mem.MemoryAccessException;
*/ */
public class BooleanDataType extends AbstractIntegerDataType { public class BooleanDataType extends AbstractIntegerDataType {
private final static long serialVersionUID = 1;
private static SettingsDefinition[] SETTINGS_DEFS = {}; private static SettingsDefinition[] SETTINGS_DEFS = {};
public static final BooleanDataType dataType = new BooleanDataType(); public static final BooleanDataType dataType = new BooleanDataType();
@ -52,8 +50,9 @@ public class BooleanDataType extends AbstractIntegerDataType {
@Override @Override
public String getDecompilerDisplayName(DecompilerLanguage language) { public String getDecompilerDisplayName(DecompilerLanguage language) {
if (language == DecompilerLanguage.JAVA_LANGUAGE) if (language == DecompilerLanguage.JAVA_LANGUAGE) {
return "boolean"; return "boolean";
}
return name; return name;
} }
@ -67,11 +66,6 @@ public class BooleanDataType extends AbstractIntegerDataType {
return 1; // TODO: Size should probably be based upon data organization return 1; // TODO: Size should probably be based upon data organization
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public String getDescription() { public String getDescription() {
return "Boolean"; return "Boolean";

View file

@ -99,7 +99,7 @@ public class CharDataType extends AbstractIntegerDataType implements DataTypeWit
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -111,9 +111,7 @@ public abstract class CompositeDataTypeImpl extends GenericDataType implements C
} }
@Override @Override
public boolean isDynamicallySized() { public abstract boolean hasLanguageDependantLength();
return true; // assume dynamically sized component datatype may be present
}
@Override @Override
public boolean isPartOf(DataType dataTypeOfInterest) { public boolean isPartOf(DataType dataTypeOfInterest) {
@ -142,23 +140,33 @@ public abstract class CompositeDataTypeImpl extends GenericDataType implements C
/** /**
* This method throws an exception if the indicated data type is not a valid * This method throws an exception if the indicated data type is not a valid
* data type for a component of this composite data type. * data type for a component of this composite data type. If the DEFAULT
* datatype is specified when unsupported an Undefined1 will be returned
* in its place (e.g., packing enabled, Union).
* *
* @param dataType the data type to be checked. * @param dataType the data type to be checked.
* @return datatype to be used for insert/add
* @throws IllegalArgumentException if the data type is invalid. * @throws IllegalArgumentException if the data type is invalid.
*/ */
protected void validateDataType(DataType dataType) { protected DataType validateDataType(DataType dataType) {
if (dataType instanceof FactoryDataType) { if (dataType == DataType.DEFAULT) {
throw new IllegalArgumentException("The \"" + dataType.getName() + if (isPackingEnabled() || (this instanceof Union)) {
"\" data type is not allowed in a composite data type."); return Undefined1DataType.dataType;
} }
else if (dataType instanceof Dynamic) { return dataType;
}
if (dataType instanceof Dynamic) {
Dynamic dynamicDataType = (Dynamic) dataType; Dynamic dynamicDataType = (Dynamic) dataType;
if (!dynamicDataType.canSpecifyLength()) { if (!dynamicDataType.canSpecifyLength()) {
throw new IllegalArgumentException("The \"" + dataType.getName() + throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type."); "\" data type is not allowed in a composite data type.");
} }
} }
else if (dataType instanceof FactoryDataType || dataType.getLength() <= 0) {
throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type.");
}
return dataType;
} }
/** /**

View file

@ -38,10 +38,11 @@ public interface DataType {
static final long NO_LAST_CHANGE_TIME = 0L; static final long NO_LAST_CHANGE_TIME = 0L;
/** /**
* Indicates if this data-type is dynamically sized based upon DataOrganization. * Indicates if the length of this data-type is determined based
* @return true if dynamically sized * upon the {@link DataOrganization} obtained from the associated {@link DataTypeManager}.
* @return true length is language/compiler-specification dependent, else false
*/ */
public boolean isDynamicallySized(); public boolean hasLanguageDependantLength();
/** /**
* Indicates if type has not yet been defined. * Indicates if type has not yet been defined.

View file

@ -54,14 +54,6 @@ public class DefaultDataType extends DataTypeImpl {
return 1; return 1;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
/** /**
* *
* @see ghidra.program.model.data.DataType#getDescription() * @see ghidra.program.model.data.DataType#getDescription()

View file

@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -43,7 +42,7 @@ public class DoubleDataType extends AbstractFloatDataType {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -50,14 +50,6 @@ public abstract class DynamicDataType extends BuiltIn implements Dynamic {
return false; return false;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
/** /**
* Gets the number of component data types in this data type. * Gets the number of component data types in this data type.
* @param buf a membuffer to be used by dataTypes that change depending on * @param buf a membuffer to be used by dataTypes that change depending on

View file

@ -73,11 +73,6 @@ public class EnumDataType extends GenericDataType implements Enum {
return ENUM_SETTINGS_DEFINITIONS; return ENUM_SETTINGS_DEFINITIONS;
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public long getValue(String valueName) throws NoSuchElementException { public long getValue(String valueName) throws NoSuchElementException {
Long value = nameMap.get(valueName); Long value = nameMap.get(valueName);

View file

@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -30,7 +29,17 @@ public interface FactoryDataType extends BuiltInDataType {
* Returns the appropriate DataType which corresponds to the specified * Returns the appropriate DataType which corresponds to the specified
* memory location. * memory location.
* @param buf memory location * @param buf memory location
* @return fabricated datatype based upon memory data
*/ */
DataType getDataType(MemBuffer buf); DataType getDataType(MemBuffer buf);
/**
* All implementations must return a length of -1.
* @return length of -1
*/
@Override
default int getLength() {
return -1;
}
} }

View file

@ -24,7 +24,6 @@ import ghidra.util.exception.DuplicateNameException;
* a Structure and create a new Dynamic structure each time they are used. * a Structure and create a new Dynamic structure each time they are used.
*/ */
public abstract class FactoryStructureDataType extends BuiltIn implements FactoryDataType { public abstract class FactoryStructureDataType extends BuiltIn implements FactoryDataType {
private final static long serialVersionUID = 1;
/** /**
* Constructs a new DynamicStructureDataType with the given name * Constructs a new DynamicStructureDataType with the given name
@ -41,7 +40,7 @@ public abstract class FactoryStructureDataType extends BuiltIn implements Factor
* @see ghidra.program.model.data.DataType#getLength() * @see ghidra.program.model.data.DataType#getLength()
*/ */
@Override @Override
public int getLength() { public final int getLength() {
return -1; return -1;
} }

View file

@ -67,14 +67,6 @@ public class FileTimeDataType extends BuiltIn {
return 8; return 8;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public String getMnemonic(Settings settings) { public String getMnemonic(Settings settings) {
return "FileTime"; return "FileTime";

View file

@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -43,7 +42,7 @@ public class FloatDataType extends AbstractFloatDataType {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -97,11 +97,11 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct
Parameter[] parameters = function.getParameters(); Parameter[] parameters = function.getParameters();
ArrayList<ParameterDefinition> paramList = new ArrayList<ParameterDefinition>(); ArrayList<ParameterDefinition> paramList = new ArrayList<ParameterDefinition>();
for (int i = 0; i < parameters.length; i++) { for (Parameter parameter : parameters) {
if (formalSignature && parameters[i].isAutoParameter()) { if (formalSignature && parameter.isAutoParameter()) {
continue; continue;
} }
paramList.add(getParameterDefinition(parameters[i], formalSignature)); paramList.add(getParameterDefinition(parameter, formalSignature));
} }
params = paramList.toArray(new ParameterDefinition[paramList.size()]); params = paramList.toArray(new ParameterDefinition[paramList.size()]);
@ -150,11 +150,6 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct
} }
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public void setReturnType(DataType type) { public void setReturnType(DataType type) {
returnType = ParameterDefinitionImpl.validateDataType(type, dataMgr, true); returnType = ParameterDefinitionImpl.validateDataType(type, dataMgr, true);
@ -350,8 +345,7 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct
return; return;
} }
} }
for (int i = 0; i < params.length; i++) { for (ParameterDefinition param : params) {
ParameterDefinition param = params[i];
if (param.getDataType() == oldDt) { if (param.getDataType() == oldDt) {
try { try {
param.setDataType(newDt); param.setDataType(newDt);
@ -391,9 +385,9 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct
if (returnType == dt) { if (returnType == dt) {
returnType = DataType.DEFAULT; returnType = DataType.DEFAULT;
} }
for (int i = 0; i < params.length; i++) { for (ParameterDefinition param : params) {
if (params[i].getDataType() == dt) { if (param.getDataType() == dt) {
params[i].setDataType(DataType.DEFAULT); param.setDataType(DataType.DEFAULT);
} }
} }
} }

View file

@ -66,14 +66,6 @@ public class GifDataType extends BuiltIn implements Dynamic, Resource {
return false; return false;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -34,10 +34,10 @@ public class IntegerDataType extends AbstractIntegerDataType {
} }
/** /**
* @see ghidra.program.model.data.DataType#isDynamicallySized() * @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/ */
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -80,14 +80,6 @@ public class JPEGDataType extends BuiltIn implements Dynamic, Resource {
return false; return false;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -42,10 +42,10 @@ public class LongDataType extends AbstractIntegerDataType {
} }
/** /**
* @see ghidra.program.model.data.DataType#isDynamicallySized() * @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/ */
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -48,7 +47,7 @@ public class LongDoubleDataType extends AbstractFloatDataType {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -42,10 +42,10 @@ public class LongLongDataType extends AbstractIntegerDataType {
} }
/** /**
* @see ghidra.program.model.data.DataType#isDynamicallySized() * @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/ */
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -15,15 +15,15 @@
*/ */
package ghidra.program.model.data; package ghidra.program.model.data;
import ghidra.docking.settings.Settings;
import ghidra.program.model.mem.MemBuffer;
import ghidra.util.Msg;
import ghidra.util.classfinder.*;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.TimeZone; import java.util.TimeZone;
import ghidra.docking.settings.Settings;
import ghidra.program.model.mem.MemBuffer;
import ghidra.util.Msg;
import ghidra.util.classfinder.ClassTranslator;
/** /**
* A datatype to interpret the Mac OS timestamp * A datatype to interpret the Mac OS timestamp
* convention, which is based on the number of * convention, which is based on the number of
@ -57,26 +57,23 @@ public class MacintoshTimeStampDataType extends BuiltIn {
super(null, "MacTime", dtm); super(null, "MacTime", dtm);
} }
@Override
public String getDescription() { public String getDescription() {
return "The stamp follows the Macintosh time-measurement scheme " return "The stamp follows the Macintosh time-measurement scheme "
+ "(that is, the number of seconds measured from January 1, 1904)."; + "(that is, the number of seconds measured from January 1, 1904).";
} }
@Override
public int getLength() { public int getLength() {
return 4; return 4;
} }
/** @Override
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
public boolean isDynamicallySized() {
return false;
}
public String getMnemonic(Settings settings) { public String getMnemonic(Settings settings) {
return "MacTime"; return "MacTime";
} }
@Override
public String getRepresentation(MemBuffer buf, Settings settings, int length) { public String getRepresentation(MemBuffer buf, Settings settings, int length) {
if (macStartDate == null) { if (macStartDate == null) {
return "unparsed date"; return "unparsed date";
@ -93,10 +90,12 @@ public class MacintoshTimeStampDataType extends BuiltIn {
return ""; return "";
} }
@Override
public Object getValue(MemBuffer buf, Settings settings, int length) { public Object getValue(MemBuffer buf, Settings settings, int length) {
return getRepresentation(buf, settings, length); return getRepresentation(buf, settings, length);
} }
@Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {
return this; return this;

View file

@ -85,14 +85,6 @@ public class MissingBuiltInDataType extends DataTypeImpl implements Dynamic {
return -1; return -1;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
public boolean canSpecifyLength() { public boolean canSpecifyLength() {
return true; return true;

View file

@ -79,7 +79,7 @@ public class ParameterDefinitionImpl implements ParameterDefinition {
dataType.getName()); dataType.getName());
} }
dataType = dataType.clone(dtMgr != null ? dtMgr : dataType.getDataTypeManager()); dataType = dataType.clone(dtMgr != null ? dtMgr : dataType.getDataTypeManager());
if (!dataType.isDynamicallySized() && dataType.getLength() < 0) { if (dataType.getLength() < 0) {
throw new IllegalArgumentException(kind + throw new IllegalArgumentException(kind +
" type must be specified with fixed-length data type: " + dataType.getName()); " type must be specified with fixed-length data type: " + dataType.getName());
} }
@ -94,7 +94,7 @@ public class ParameterDefinitionImpl implements ParameterDefinition {
"Parameter type may not specify the void datatype - empty parameter list should be used"); "Parameter type may not specify the void datatype - empty parameter list should be used");
} }
} }
else if (!(dataType instanceof Composite) && dataType.getLength() == 0) { else if (dataType.getLength() == 0) {
throw new IllegalArgumentException(kind + throw new IllegalArgumentException(kind +
" type must be specified with fixed-length data type: " + dataType.getName()); " type must be specified with fixed-length data type: " + dataType.getName());
} }

View file

@ -57,14 +57,6 @@ public class PngDataType extends BuiltIn implements Dynamic, Resource {
return -1; return -1;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
public boolean canSpecifyLength() { public boolean canSpecifyLength() {
return false; return false;

View file

@ -31,8 +31,6 @@ import ghidra.util.DataConverter;
*/ */
public class PointerDataType extends BuiltIn implements Pointer { public class PointerDataType extends BuiltIn implements Pointer {
private final static long serialVersionUID = 1;
public final static PointerDataType dataType = new PointerDataType(); public final static PointerDataType dataType = new PointerDataType();
public final static int MAX_POINTER_SIZE_BYTES = 8; public final static int MAX_POINTER_SIZE_BYTES = 8;
@ -156,7 +154,7 @@ public class PointerDataType extends BuiltIn implements Pointer {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return length <= 0; return length <= 0;
} }
@ -460,10 +458,10 @@ public class PointerDataType extends BuiltIn implements Pointer {
Pointer p = (Pointer) dt; Pointer p = (Pointer) dt;
DataType otherDataType = p.getDataType(); DataType otherDataType = p.getDataType();
if (isDynamicallySized() != p.isDynamicallySized()) { if (hasLanguageDependantLength() != p.hasLanguageDependantLength()) {
return false; return false;
} }
if (!isDynamicallySized() && (getLength() != p.getLength())) { if (!hasLanguageDependantLength() && (getLength() != p.getLength())) {
return false; return false;
} }
if (referencedDataType == null) { if (referencedDataType == null) {

View file

@ -54,14 +54,6 @@ public class SegmentedCodePointerDataType extends BuiltIn {
return 4; return 4;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public String getDescription() { public String getDescription() {
return "Code address from 16 bit segment and 16 bit offset"; return "Code address from 16 bit segment and 16 bit offset";
@ -98,8 +90,9 @@ public class SegmentedCodePointerDataType extends BuiltIn {
public String getRepresentation(MemBuffer buf, Settings settings, int length) { public String getRepresentation(MemBuffer buf, Settings settings, int length) {
Object obj = getValue(buf, settings, length); Object obj = getValue(buf, settings, length);
if (obj == null) if (obj == null) {
return "??"; return "??";
}
return obj.toString(); return obj.toString();
} }

View file

@ -18,7 +18,6 @@ package ghidra.program.model.data;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.docking.settings.SettingsDefinition; import ghidra.docking.settings.SettingsDefinition;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.ProcessorContext;
import ghidra.program.model.mem.MemBuffer; import ghidra.program.model.mem.MemBuffer;
import ghidra.util.DataConverter; import ghidra.util.DataConverter;
import ghidra.util.classfinder.ClassTranslator; import ghidra.util.classfinder.ClassTranslator;
@ -60,7 +59,7 @@ public class ShiftedAddressDataType extends BuiltIn {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -42,10 +42,10 @@ public class ShortDataType extends AbstractIntegerDataType {
} }
/** /**
* @see ghidra.program.model.data.DataType#isDynamicallySized() * @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/ */
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -203,6 +203,11 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
return structLength; return structLength;
} }
@Override
public boolean hasLanguageDependantLength() {
return isPackingEnabled();
}
@Override @Override
public void delete(int ordinal) { public void delete(int ordinal) {
if (ordinal < 0 || ordinal >= numComponents) { if (ordinal < 0 || ordinal >= numComponents) {
@ -373,16 +378,6 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
return super.getPreferredComponentLength(dataType, length); return super.getPreferredComponentLength(dataType, length);
} }
@Override
protected void validateDataType(DataType dataType) {
// TODO: need tests - questionable if transitioning to/from no-packing works properly
if (isPackingEnabled() && dataType == DataType.DEFAULT) {
throw new IllegalArgumentException(
"The DEFAULT data type is not allowed in an aligned composite data type.");
}
super.validateDataType(dataType);
}
@Override @Override
public final DataTypeComponentImpl insertAtOffset(int offset, DataType dataType, int length) { public final DataTypeComponentImpl insertAtOffset(int offset, DataType dataType, int length) {
return insertAtOffset(offset, dataType, length, null, null); return insertAtOffset(offset, dataType, length, null, null);
@ -410,7 +405,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
} }
} }
validateDataType(dataType); dataType = validateDataType(dataType);
dataType = dataType.clone(dataMgr); dataType = dataType.clone(dataMgr);
checkAncestry(dataType); checkAncestry(dataType);
@ -487,13 +482,15 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
String componentName, String comment, boolean packAndNotify) String componentName, String comment, boolean packAndNotify)
throws IllegalArgumentException { throws IllegalArgumentException {
validateDataType(dataType);
dataType = dataType.clone(dataMgr);
if (isFlexibleArray && isInvalidFlexArrayDataType(dataType)) { if (isFlexibleArray && isInvalidFlexArrayDataType(dataType)) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Unsupported flexType: " + dataType.getDisplayName()); "Unsupported flexType: " + dataType.getDisplayName());
} }
dataType = validateDataType(dataType);
dataType = dataType.clone(dataMgr);
checkAncestry(dataType); checkAncestry(dataType);
DataTypeComponentImpl dtc; DataTypeComponentImpl dtc;
@ -566,7 +563,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
if (index == numComponents) { if (index == numComponents) {
return add(dataType, length, componentName, comment); return add(dataType, length, componentName, comment);
} }
validateDataType(dataType); dataType = validateDataType(dataType);
dataType = dataType.clone(dataMgr); dataType = dataType.clone(dataMgr);
checkAncestry(dataType); checkAncestry(dataType);
@ -1311,7 +1308,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
throw new IndexOutOfBoundsException(index); throw new IndexOutOfBoundsException(index);
} }
validateDataType(dataType); dataType = validateDataType(dataType);
DataTypeComponentImpl origDtc = (DataTypeComponentImpl) getComponent(index); DataTypeComponentImpl origDtc = (DataTypeComponentImpl) getComponent(index);
if (origDtc.isBitFieldComponent()) { if (origDtc.isBitFieldComponent()) {
@ -1354,7 +1351,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
"Offset " + offset + " is beyond end of structure (" + getLength() + ")."); "Offset " + offset + " is beyond end of structure (" + getLength() + ").");
} }
validateDataType(dataType); dataType = validateDataType(dataType);
DataTypeComponentImpl origDtc = (DataTypeComponentImpl) getComponentAt(offset); DataTypeComponentImpl origDtc = (DataTypeComponentImpl) getComponentAt(offset);
if (origDtc.isBitFieldComponent()) { if (origDtc.isBitFieldComponent()) {

View file

@ -104,8 +104,8 @@ public class TypedefDataType extends GenericDataType implements TypeDef {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return dataType.isDynamicallySized(); return dataType.hasLanguageDependantLength();
} }
@Override @Override

View file

@ -39,14 +39,6 @@ public abstract class Undefined extends BuiltIn {
return undefinedTypes; return undefinedTypes;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
/** /**
* Get an Undefined data-type instance of the requested size * Get an Undefined data-type instance of the requested size
* @param size data type size, sizes greater than 8 will cause an Undefined1[size] (i.e., Array) to be returned. * @param size data type size, sizes greater than 8 will cause an Undefined1[size] (i.e., Array) to be returned.
@ -74,10 +66,12 @@ public abstract class Undefined extends BuiltIn {
* its various forms, else false. * its various forms, else false.
*/ */
public static boolean isUndefined(DataType dataType) { public static boolean isUndefined(DataType dataType) {
if (dataType instanceof DefaultDataType) if (dataType instanceof DefaultDataType) {
return true; return true;
if (dataType instanceof Undefined) }
if (dataType instanceof Undefined) {
return true; return true;
}
return isUndefinedArray(dataType); return isUndefinedArray(dataType);
} }

View file

@ -170,7 +170,7 @@ public class UnionDataType extends CompositeDataTypeImpl implements UnionInterna
DataTypeComponent doAdd(DataType dataType, int length, String componentName, String comment) DataTypeComponent doAdd(DataType dataType, int length, String componentName, String comment)
throws IllegalArgumentException { throws IllegalArgumentException {
validateDataType(dataType); dataType = validateDataType(dataType);
dataType = adjustBitField(dataType); dataType = adjustBitField(dataType);
@ -190,7 +190,7 @@ public class UnionDataType extends CompositeDataTypeImpl implements UnionInterna
@Override @Override
public DataTypeComponent insert(int ordinal, DataType dataType, int length, public DataTypeComponent insert(int ordinal, DataType dataType, int length,
String componentName, String comment) throws IllegalArgumentException { String componentName, String comment) throws IllegalArgumentException {
validateDataType(dataType); dataType = validateDataType(dataType);
int oldAlignment = getAlignment(); int oldAlignment = getAlignment();
@ -248,6 +248,12 @@ public class UnionDataType extends CompositeDataTypeImpl implements UnionInterna
return unionLength; return unionLength;
} }
@Override
public boolean hasLanguageDependantLength() {
// Assume any component may have a language-dependent length
return true;
}
@Override @Override
public Union clone(DataTypeManager dtm) { public Union clone(DataTypeManager dtm) {
if (dataMgr == dtm) { if (dataMgr == dtm) {

View file

@ -43,10 +43,10 @@ public class UnsignedIntegerDataType extends AbstractIntegerDataType {
} }
/** /**
* @see ghidra.program.model.data.DataType#isDynamicallySized() * @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/ */
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -43,10 +43,10 @@ public class UnsignedLongDataType extends AbstractIntegerDataType {
} }
/** /**
* @see ghidra.program.model.data.DataType#isDynamicallySized() * @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/ */
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -43,10 +43,10 @@ public class UnsignedLongLongDataType extends AbstractIntegerDataType {
} }
/** /**
* @see ghidra.program.model.data.DataType#isDynamicallySized() * @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/ */
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -43,10 +43,10 @@ public class UnsignedShortDataType extends AbstractIntegerDataType {
} }
/** /**
* @see ghidra.program.model.data.DataType#isDynamicallySized() * @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/ */
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -23,7 +23,6 @@ import ghidra.program.model.mem.MemBuffer;
* a function has no return value. * a function has no return value.
*/ */
public class VoidDataType extends BuiltIn { public class VoidDataType extends BuiltIn {
private final static long serialVersionUID = 1;
/** A statically defined DefaultDataType used when an Undefined byte is needed.*/ /** A statically defined DefaultDataType used when an Undefined byte is needed.*/
public static VoidDataType dataType = new VoidDataType(); public static VoidDataType dataType = new VoidDataType();
@ -40,6 +39,7 @@ public class VoidDataType extends BuiltIn {
* *
* @see ghidra.program.model.data.DataType#getMnemonic(Settings) * @see ghidra.program.model.data.DataType#getMnemonic(Settings)
*/ */
@Override
public String getMnemonic(Settings settings) { public String getMnemonic(Settings settings) {
return "void"; return "void";
} }
@ -48,21 +48,16 @@ public class VoidDataType extends BuiltIn {
* *
* @see ghidra.program.model.data.DataType#getLength() * @see ghidra.program.model.data.DataType#getLength()
*/ */
@Override
public int getLength() { public int getLength() {
return 0; return 0;
} }
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
public boolean isDynamicallySized() {
return false;
}
/** /**
* *
* @see ghidra.program.model.data.DataType#getDescription() * @see ghidra.program.model.data.DataType#getDescription()
*/ */
@Override
public String getDescription() { public String getDescription() {
return "void datatype"; return "void datatype";
} }
@ -71,6 +66,7 @@ public class VoidDataType extends BuiltIn {
* *
* @see ghidra.program.model.data.DataType#getRepresentation(MemBuffer, Settings, int) * @see ghidra.program.model.data.DataType#getRepresentation(MemBuffer, Settings, int)
*/ */
@Override
public String getRepresentation(MemBuffer buf, Settings settings, int length) { public String getRepresentation(MemBuffer buf, Settings settings, int length) {
return ""; return "";
} }
@ -79,10 +75,12 @@ public class VoidDataType extends BuiltIn {
* *
* @see ghidra.program.model.data.DataType#getValue(ghidra.program.model.mem.MemBuffer, ghidra.docking.settings.Settings, int) * @see ghidra.program.model.data.DataType#getValue(ghidra.program.model.mem.MemBuffer, ghidra.docking.settings.Settings, int)
*/ */
@Override
public Object getValue(MemBuffer buf, Settings settings, int length) { public Object getValue(MemBuffer buf, Settings settings, int length) {
return null; return null;
} }
@Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {
return this; return this;

View file

@ -78,11 +78,6 @@ public class WAVEDataType extends BuiltIn implements Dynamic {
return false; return false;
} }
@Override
public boolean isDynamicallySized() {
return true;
}
@Override @Override
public DataType clone(DataTypeManager dtm) { public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) { if (dtm == getDataTypeManager()) {

View file

@ -23,8 +23,6 @@ import ghidra.util.StringUtilities;
public class WideChar16DataType extends BuiltIn implements ArrayStringable, DataTypeWithCharset { public class WideChar16DataType extends BuiltIn implements ArrayStringable, DataTypeWithCharset {
private final static long serialVersionUID = 1;
/** A statically defined WideCharDataType instance.*/ /** A statically defined WideCharDataType instance.*/
public final static WideChar16DataType dataType = new WideChar16DataType(); public final static WideChar16DataType dataType = new WideChar16DataType();
@ -41,11 +39,6 @@ public class WideChar16DataType extends BuiltIn implements ArrayStringable, Data
return 2; return 2;
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public String getDescription() { public String getDescription() {
return "Wide-Character (16-bit/UTF16)"; return "Wide-Character (16-bit/UTF16)";

View file

@ -24,8 +24,6 @@ import ghidra.util.StringUtilities;
public class WideChar32DataType extends BuiltIn implements ArrayStringable, DataTypeWithCharset { public class WideChar32DataType extends BuiltIn implements ArrayStringable, DataTypeWithCharset {
private final static long serialVersionUID = 1;
/** A statically defined WideCharDataType instance.*/ /** A statically defined WideCharDataType instance.*/
public final static WideChar32DataType dataType = new WideChar32DataType(); public final static WideChar32DataType dataType = new WideChar32DataType();
@ -42,11 +40,6 @@ public class WideChar32DataType extends BuiltIn implements ArrayStringable, Data
return 4; return 4;
} }
@Override
public boolean isDynamicallySized() {
return false;
}
@Override @Override
public String getDescription() { public String getDescription() {
return "Wide-Character (32-bit/UTF32)"; return "Wide-Character (32-bit/UTF32)";

View file

@ -26,8 +26,6 @@ public class WideCharDataType extends BuiltIn implements ArrayStringable, DataTy
final static SettingsDefinition[] DEFAULT_WIDE_CHAR_SETTINGS = new SettingsDefinition[] { final static SettingsDefinition[] DEFAULT_WIDE_CHAR_SETTINGS = new SettingsDefinition[] {
EndianSettingsDefinition.DEF, RenderUnicodeSettingsDefinition.RENDER }; EndianSettingsDefinition.DEF, RenderUnicodeSettingsDefinition.RENDER };
private final static long serialVersionUID = 1;
/** A statically defined WideCharDataType instance.*/ /** A statically defined WideCharDataType instance.*/
public final static WideCharDataType dataType = new WideCharDataType(); public final static WideCharDataType dataType = new WideCharDataType();
@ -45,7 +43,7 @@ public class WideCharDataType extends BuiltIn implements ArrayStringable, DataTy
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
return true; return true;
} }

View file

@ -272,7 +272,9 @@ public class VariableUtilities {
} }
dataType = Undefined.getUndefinedDataType(defaultSize); dataType = Undefined.getUndefinedDataType(defaultSize);
} }
else if (dataType.isDynamicallySized()) { else if (dataType.hasLanguageDependantLength()) {
// A clone is done to ensure that any affects of the data organization
// are properly reflected in the sizing of the datatype
dataType = dataType.clone(program.getDataTypeManager()); dataType = dataType.clone(program.getDataTypeManager());
} }
else if (dataType instanceof FunctionDefinition || (dataType instanceof TypeDef && else if (dataType instanceof FunctionDefinition || (dataType instanceof TypeDef &&

View file

@ -43,7 +43,7 @@ public class TestDoubleDataType implements DataType {
} }
@Override @Override
public boolean isDynamicallySized() { public boolean hasLanguageDependantLength() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View file

@ -0,0 +1,67 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ghidra.program.model.listing;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import generic.jar.ResourceFile;
import generic.test.AbstractGenericTest;
import ghidra.framework.Application;
import ghidra.program.database.ProgramDB;
import ghidra.program.model.data.*;
import ghidra.program.model.lang.*;
import ghidra.program.util.DefaultLanguageService;
public class VariableUtilitiesTest extends AbstractGenericTest {
private ProgramDB program;
@Before
public void setUp() throws Exception {
Language language = getLanguage("Toy:BE:64:default");
CompilerSpec compilerSpec = language.getDefaultCompilerSpec();
program = new ProgramDB("Test", language, compilerSpec, this);
}
private Language getLanguage(String languageName) throws Exception {
ResourceFile ldefFile = Application.getModuleDataFile("Toy", "languages/toy.ldefs");
if (ldefFile != null) {
LanguageService languageService = DefaultLanguageService.getLanguageService(ldefFile);
Language language = languageService.getLanguage(new LanguageID(languageName));
return language;
}
throw new LanguageNotFoundException("Unsupported test language: " + languageName);
}
@Test
public void testCheckDataType() throws Exception {
DataType dt = new TypedefDataType("Foo", new PointerDataType()); // point size will be 8 in program
assertEquals(4, dt.getLength());
dt = VariableUtilities.checkDataType(dt, false, -1, program);
assertEquals(8, dt.getLength());
dt = new ArrayDataType(new PointerDataType(), 5, -1); // point size will be 8 in program
assertEquals(20, dt.getLength());
dt = VariableUtilities.checkDataType(dt, false, -1, program);
assertEquals(40, dt.getLength());
}
}

View file

@ -1,6 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<compiler_spec> <compiler_spec>
<data_organization>
<absolute_max_alignment value="0" /> <!-- no maximum alignment -->
<machine_alignment value="8" />
<default_alignment value="1" />
<default_pointer_alignment value="4" />
<pointer_size value="4" />
<wchar_size value="2" />
<short_size value="2" />
<integer_size value="4" />
<long_size value="4" />
<long_long_size value="8" />
<float_size value="4" />
<double_size value="8" />
<long_double_size value="8" />
<size_alignment_map>
<entry size="1" alignment="1" />
<entry size="2" alignment="2" />
<entry size="4" alignment="4" />
<entry size="8" alignment="4" />
</size_alignment_map>
</data_organization>
<global> <global>
<range space="ram"/> <range space="ram"/>
</global> </global>

View file

@ -1,6 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<compiler_spec> <compiler_spec>
<data_organization>
<absolute_max_alignment value="0" />
<machine_alignment value="2" />
<default_alignment value="1" />
<default_pointer_alignment value="8" />
<pointer_size value="8" />
<wchar_size value="2" />
<short_size value="2" />
<integer_size value="4" />
<long_size value="4" />
<long_long_size value="8" />
<float_size value="4" />
<double_size value="8" />
<long_double_size value="8" />
<size_alignment_map>
<entry size="1" alignment="1" />
<entry size="2" alignment="2" />
<entry size="4" alignment="4" />
<entry size="8" alignment="8" />
</size_alignment_map>
</data_organization>
<global> <global>
<range space="ram"/> <range space="ram"/>
</global> </global>