Get desktop application:
View/edit binary Protocol Buffers messages
A union of all message types that can be sent via a binary log channel. NextID: 8
ID of the session this entry belongs to.
Event timestamp.
Session start event.
Result of executing a snapshot
Build information of the producer binary.
Session summary.
Memory checksum status after the snapshot failed (if any).
(message has no fields)
Used in:
,No checksum was present in the snapshot or the checksum was not computed.
The checksum matched.
The checksum did not match.
Corpus metadata.
Used in:
,Opaque version identifier.
Describes a specific endstate of executing a snapshot. NEXT ID: 6
Used in:
,Expected execution endpoint that defines this EndState.
semantically required
The expected state of the registers to exist at `endpoint`.
semantically required
The expected memory state to exist at `endpoint`. Only differences from the starting state need to be mentioned here. Same constraints as for Snapshot.memory_bytes below wrt Snapshot.mappings.
can be missing
Set of platforms for which we've observed this EndState to occur for this snapshot. Empty set means that this EndState is provisional and can be removed once a real one is observed. The representation is a bit vector where PlatformId enum values are the bit indexes -- more compact than `repeated PlatformId` as the number of PlatformId values grows and assuming most end-states are the same for all platforms, so normally this will have all bits set. Make it repeated if we run out of bits in one int64.
can be missing
Summary information of registers that are not fully recorded at the end of snapshot execution. This is serialized from a RegisterChecksum struct for the same architecture as the snapshot.
can be missing
Describes an execution endpoint of a snapshot.
Used in:
Endpoint is the first occurence of the given event.
Event is reaching this instruction address.
Event is occurrence of a signal matching this description.
A more specific cause of the signal.
Used in:
for SIG_TRAP, SIG_FPE, SIG_ILL, or SIG_BUS
for SIG_SEGV
for SIG_SEGV
for SIG_SEGV
for SIG_SEGV
for SIG_SEGV
Supported signals that could be an endpoint. Note that all these singlas fill-in siginfo_t::si_addr.
Used in:
SIGSEGV
SIGTRAP
SIGFPE
SIGILL
SIGBUS
Describes a signal that snapshot's execution causes.
Used in:
The signal.
semantically required
Cause of sig_num.
semantically required
The siginfo_t::si_addr value: the address that causes the signal. Might need to become semantically optional if add support for signals that do not fill si_addr.
semantically required
Value of the instruction address aka pointer when the signal occured. Might be the same as sig_address or not.
semantically required
The hostname of the machine the test ran on.
The platform the test generated instructions for. This may not be the same as the actual platform of the machine.
The version of hashtest that was run.
Is this machine good or bad, or did something go wrong trying to test it?
The beginning and end of the testing period.
Test statistics.
CPU statistics.
Used in:
This should never occur, included so we absolutely notice a missing or mangled message.
The test completed successfully.
Data corruption was detected.
This particular CPU platform is currently not supported.
Describes a single contiguous range of byte values in memory.
Used in:
,Where `byte_values` start.
semantically required
The memory byte values to exist at start_address. This may represent data or instructions.
semantically required
Describes a single contiguous page-aligned memory mapping.
Used in:
,Start address and size of this mapping that define the [start_address, start_address + num_bytes) address range. Both values must be multiples of the page size.
semantically required
semantically required
Permissions to be set on the address range: an | of PermissionBits.
semantically required
Bits for the possible permissions on memory to be binary-or-ed.
Identifiers for all possible platform microarchitectures we run snapshots on. Grow or subdivide further if there are new machine types we can run on or if there are further differences in CPU's behavior.
Ids up to 40 are reserved for proprietary platforms.
The proto defintion matches the class definition of Player::Result. Please refer to Player::Result for details.
Used in:
semantically required
Index of the (partially) matched element of Snapshot::expected_end_states(). Maybe missing depending on outcome.
Actual end-state reached. This may be missing depending on outcome, please refer to Player::Result for gory details. Inside the player, we may not store the actual endstate if a snapshot ends as expected because we can use an index to one of the expected endstates. Outside the player, we may store the full endstate regardless because we do not have access to the expected endstates.
CPU time used in playing the snapshot. This is an overestimate with unavoidable overheads in the player.
CPU number where the snapshot ran.
Snapshot playback outcome code.
Used in:
Describes the state of CPU registers. This is available from silifuzz/util/ucontext/ucontext.h
Used in:
,Serialized bytes of the GRegSet struct.
semantically required
Serialized bytes of the FPRegSet struct.
semantically required
RunnerOutput represents the result of a single runner execution.
Semantically required.
An optional failed snapshot execution result.
Memory checksum status after the snapshot failed (if any).
Overall execution result.
Used in:
Status code for this execution. Semantically required.
An optional human-readable message.
Used in:
Runner executed successfully.
Runner crashed due to an unhandled signal.
Runner failed to mmap a memory mapping.
Runner detected overlapping memory mappings.
Runner detected a checksum mismatch before running any tests.
One of the snapshots failed to execute. Inspect `failed_snapshot_execution` for details.
Proto representation of a snapshot: instructions and the necessary data for execution of some relatively short snippet of binary code (single threaded user-space code) with a well-defined end state. IMPORTANT: In C++ code work with the Snapshot class from silifuzz/common/snapshot.h, not with this proto. We envision adding more fields to describe useful information about the snapshot to help analyze and mutate it (such as disassembly). TBD: Do it via additional fields here or via new message(s) that include this one -- it may be renamed to SnapshotToPlay. NEXT ID: 10
Snapshot identifier. The identifier is a printable string e.g. hex of an MD5 hash that identifies a snapshot instance and is globally unique. Possible ways to produce an id include MD5(Snapshot), NewGlobalID or UUID. A special value "has_not_been_set" has been designated for snapshots that have not had any ID assigned.
semantically required.
Architecture this snapshot is meant for, i.e. its target architecture.
semantically required
Metadata about this snapshot. Not necessary for playing or transforming the snapshot, so could be stripped and/or stored separately as needed.
can be missing
All the memory mappings that exist at the start of the snapshot. Must be disjoint.
>=1 is semantically required
All the memory mapping permissions that must not exist during playback of the snapshot. I.e. the specified address ranges must not have the specified permissions (but can have other permissions) if mapped at all. These are necessary to guarantee reproduction of a SIGSEGV Endpoint. Must be disjoint and not conflict with memory_mappings.
can be missing
All the memory state that exists at the start of the snapshot. Must be disjoint. Each entry must be inside the union of the memory_mappings, but any of the memory_mappings elements does not need to be fully written by the union of memory_bytes, but the following must hold: IMPORTANT: memory_bytes must cover all the areas that the snapshot will a) write into or b) read-from and then depend on for its outcome. Note that snapshot parsing code can't check for these conditions. Having such regions in memory_mappings with appropriate permissions is insufficient. This is because without a memory_bytes specification, the values of those bytes at the start of snapshot's execution can be arbitraty. So for case b) this can lead to the snapshot arriving at a different end-state. While for case a) it's possible that those bytes will already have the values that snapshot is going to write in a given execution of the snapshot. Hence if we were recording what snapshot did based on that run, we'd incorrectly not notice those writes, while on a later run they would manifest as unexpected changes. An easy way to satisfy these conditions is to make memory_bytes cover all of memory_mappings with r or w permissions.
>=1 is semantically required
The state of the registers at the start of the snapshot.
semantically required
The possible expected end-states of executing the snapshot.
>=1 is semantically required
Trace data for the snapshot.
can be missing
Supported architectures of snapshots.
Used in:
A proto to store snapshot execution result identified by a snapshot ID and a play result. NextID: 6
Used in:
,ID of the snapshot.
semantically required.
Machine hostname where the snapshot was executed. Should not contain the domain name part (e.g. just abc123)
semantically required
Execution result from Player.
Time when this result was recorded. NOTE that this field must be preserved for compatibility with older text-formatted results. TODO(ksteuck): Revisit once the old data has gone beyond the analysis horizon (Q2 2025-ish).
Memory checksum status after the snapshot failed (if any).
A convenience wrapper for Snapshot.id useful for data processing pipelines.
Same as Snapshot.id
semantically required
Metadata about a Snapshot. We use an "enum selector plus appropriately optional detail fields" format instead of a hierarchy of one_of-s because this proto is not for human or wide code consumption and for many snapshot origin types there are no extra details, so the one_of messages would be empty. NEXT ID: 9
Used in:
semantically required
Free-form origin.
How snapshot originated. NEXT ID: 14
Used in:
When origin is unknown or unimportant, e.g. snapshot was made by some test-generation logic.
Snapshot was made by ifuzz.
Snapshot was made by fuzzing {Unicorn,Bochs,etc} with libFuzzer.
Special value to direct the consumers to use SnapshotMetadata.origin_string value instead.
Describes a single Snapshot for the purposes of sharding. See PartitionCorpus() for details.
Id of the snapshot.
Snapshot memory mappings.
Opaque sort key.
Metadata obtained from tracing a snapshot.
Used in:
Set of platforms for which we've observed this trace. The representation is a bit vector is the same as EndState.platforms
semantically required
Number of instructions executed before the Snapshot was stopped.
Human-readable trace of all instructions executed before reaching some terminal state. The exact format varies between architectures and versions. Do not rely on this field to determine the dynamic length of the Snapshot, use `num_instructions` instead.