RecordFlux icon indicating copy to clipboard operation
RecordFlux copied to clipboard

Initialization of opaque fields with unknown size

Open jklmnn opened this issue 2 years ago • 2 comments

Context and Problem Statement

Currently the only way to initialize opaque fields in the spec is to either use a static aggregate or a function. While the static aggregate works well when the size is known sometimes it's required to zero-initialize an opaque field whose size is not known statically. In this case the only way to initialize this field is by using a function.

Use Cases

Zero-initialization of fields with a dynamic size that are modified later (e.g. a signature or hash).

Considered Options

O1

Using others to match whatever size the opaque field has with a static value.

Opaque_Field := [others => 0];

+ Close to Ada syntax + Allows custom values for all bytes Only allows a single value for all bytes

O2

Using a range assignment:

Opaque_Field := [1 .. 8 => 255, 9 .. Opaque_Field_Length => 0];

+ Close to Ada syntax + More flexible in terms of different initial values for different ranges Always requires the length to be known via a variable Additional non-overlap checks necessary

O3

Using an reset aspect:

Opaque_Field'Reset (Opaque_Field_Length, 0);

+ Consistent to other Reset aspects such as for messages and sequences Less flexible as it only allows a single value to be set Always requires the length to be known via a variable

Decision Outcome

O1

jklmnn avatar Jun 23 '22 11:06 jklmnn

@jklmnn Would you allow multiple ranges in O2? If so, could please you add an example for that? In that case, a drawback would also be additional checks necessary to ensure non-overlap.

senier avatar Jun 24 '22 09:06 senier

I updated O2.

jklmnn avatar Jun 24 '22 10:06 jklmnn