mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-06 03:50:02 +02:00
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:
parent
579e3bacf7
commit
cfdec26da4
188 changed files with 7968 additions and 6645 deletions
|
@ -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());
|
||||
|
|
|
@ -1285,7 +1285,7 @@ public class CppCompositeType {
|
|||
}
|
||||
|
||||
private int getCompositeLength(Composite myComposite) {
|
||||
if (!myComposite.isNotYetDefined()) {
|
||||
if (!myComposite.isZeroLength()) {
|
||||
return myComposite.getLength();
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -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" +
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue