GP-943 Added support for zero-length arrays and

zero-length components.  NOTE: We still never return 0 for
DataType.getLength().  Added DataType.isZeroLength().
This commit is contained in:
ghidra1 2021-08-10 17:51:35 -04:00
parent 579e3bacf7
commit cfdec26da4
188 changed files with 7968 additions and 6645 deletions

View file

@ -234,8 +234,11 @@ public class DefaultCompositeMember extends CompositeMember {
// transform last member into flexible array
Structure struct = (Structure) memberDataType;
Array array = (Array) m.getDataType();
struct.setFlexibleArrayComponent(array.getDataType(), m.getName(), m.memberComment); // use unmodified comment
struct.delete(struct.getNumComponents() - 1);
// TODO: there may be a more direct approach since we now handle zero-length array instantiation
struct.delete(struct.getNumComponents() - 1); // delete placeholder component
struct.insertAtOffset(m.memberOffset,
new ArrayDataType(array.getDataType(), 0, 1, dataTypeManager), 0, m.getName(),
m.memberComment); // use unmodified comment
}
}
@ -286,7 +289,7 @@ public class DefaultCompositeMember extends CompositeMember {
return;
}
DataTypeComponent dtc = struct.getComponentAt(preferredSize);
DataTypeComponent dtc = struct.getComponentContaining(preferredSize);
if (dtc == null) {
return;
}
@ -1010,7 +1013,7 @@ public class DefaultCompositeMember extends CompositeMember {
}
else if (isStructureContainer()) {
Structure struct = (Structure) memberDataType;
// TODO: complicated by bitfields
// TODO: complicated by bitfields where multiple components may occupy same byte
struct.deleteAtOffset(newContainerMember.getOffset());
struct.insertAtOffset(newContainerMember.getOffset(), newContainerMember.getDataType(),
newContainerMember.getLength());

View file

@ -1285,7 +1285,7 @@ public class CppCompositeType {
}
private int getCompositeLength(Composite myComposite) {
if (!myComposite.isNotYetDefined()) {
if (!myComposite.isZeroLength()) {
return myComposite.getLength();
}
return 0;

View file

@ -331,7 +331,7 @@ public class CompositeMemberTest extends AbstractGhidraHeadlessIntegrationTest
"pack()\n" +
"Structure struct {\n" +
" 0 char 1 a \"\"\n" +
" char[0] 0 e \"\"\n" +
" 1 char[0] 0 e \"\"\n" +
"}\n" +
"Size = 1 Actual Alignment = 1", struct, true);
//@formatter:on
@ -371,14 +371,14 @@ public class CompositeMemberTest extends AbstractGhidraHeadlessIntegrationTest
" 0 int 4 a \"\"\n" +
" 4 int 4 b \"\"\n" +
" 8 int 4 c \"\"\n" +
" char[0] 0 d \"\"\n" +
" 12 char[0] 0 d \"\"\n" +
"}\n" +
"Size = 12 Actual Alignment = 4\n" +
"/union/union_s_1\n" +
"pack()\n" +
"Structure union_s_1 {\n" +
" 0 longlong 8 e \"\"\n" +
" char[0] 0 f \"\"\n" +
" 8 char[0] 0 f \"\"\n" +
"}\n" +
"Size = 8 Actual Alignment = 8\n", struct, true);
//@formatter:on
@ -408,7 +408,7 @@ public class CompositeMemberTest extends AbstractGhidraHeadlessIntegrationTest
"pack()\n" +
"Union union {\n" +
" 0 union_s_0 12 _s_0 \"\"\n" +
" 0 union_s_1 1 _s_1 \"\"\n" +
" 0 union_s_1 0 _s_1 \"\"\n" +
"}\n" +
"Size = 12 Actual Alignment = 4\n" +
"/union/union_s_0\n" +
@ -417,13 +417,13 @@ public class CompositeMemberTest extends AbstractGhidraHeadlessIntegrationTest
" 0 int 4 a \"\"\n" +
" 4 int 4 b \"\"\n" +
" 8 int 4 c \"\"\n" +
" char[0] 0 d \"\"\n" +
" 12 char[0] 0 d \"\"\n" +
"}\n" +
"Size = 12 Actual Alignment = 4\n" +
"/union/union_s_1\n" +
"pack()\n" +
"Structure union_s_1 {\n" +
" char[0] 0 f \"\"\n" +
" 0 char[0] 0 f \"\"\n" +
"}\n" +
"Size = 1 Actual Alignment = 1\n", struct, true);
//@formatter:on
@ -459,7 +459,7 @@ public class CompositeMemberTest extends AbstractGhidraHeadlessIntegrationTest
"pack()\n" +
"Structure union_s_0 {\n" +
" 0 char 1 a \"\"\n" +
" char[0] 0 flex \"\"\n" +
" 1 char[0] 0 flex \"\"\n" +
"}\n" +
"Size = 1 Actual Alignment = 1\n" +
"/union/union_s_1\n" +
@ -767,7 +767,7 @@ public class CompositeMemberTest extends AbstractGhidraHeadlessIntegrationTest
"pack()\n" +
"Union MoreComplicated_s_u_44 {\n" +
" 0 MoreComplicated_s_u_44_s_0 12 _s_0 \"\"\n" +
" 0 MoreComplicated_s_u_44_s_1 1 _s_1 \"\"\n" +
" 0 MoreComplicated_s_u_44_s_1 0 _s_1 \"\"\n" +
"}\n" +
"Size = 12 Actual Alignment = 4\n" +
"/MoreComplicated_s/MoreComplicated_s_u_44/MoreComplicated_s_u_44_s_0\n" +
@ -776,13 +776,13 @@ public class CompositeMemberTest extends AbstractGhidraHeadlessIntegrationTest
" 0 int 4 fromAddress \"\"\n" +
" 4 int 4 toAddress \"\"\n" +
" 8 int 4 seqNum \"\"\n" +
" char[0] 0 data \"\"\n" +
" 12 char[0] 0 data \"\"\n" +
"}\n" +
"Size = 12 Actual Alignment = 4\n" +
"/MoreComplicated_s/MoreComplicated_s_u_44/MoreComplicated_s_u_44_s_1\n" +
"pack()\n" +
"Structure MoreComplicated_s_u_44_s_1 {\n" +
" char[0] 0 buf \"\"\n" +
" 0 char[0] 0 buf \"\"\n" +
"}\n" +
"Size = 1 Actual Alignment = 1\n" +
"/MoreComplicated_s/MoreComplicated_s_u_8\n" +