On Saturday, 16 August 2025 at 11:56:43 UTC, Brother Bill wrote:
>It is obvious that reading or writing to invalid memory can result in "undefined behavior".
But is merely pointing to invalid memory "harmful"?
The documentation states that going one past the last element of a slice is acceptable.
But is it also safe to go 10, 100 or 1000 items past the last element of a slice?
Creating a pointer that points out-of-bounds does not, by itself, result in undefined behavior.
However, such a pointer would not be considered a safe value, because dereferencing it would result in undefined behavior.
The way D prevents undefined behavior in @safe
code is by preventing the creation of unsafe values. For example, you cannot perform pointer arithmetic, or convert an integer to a pointer, because the pointers resulting from these operations may point out of bounds. However, once an unsafe value has been created, there is no safeguard to prevent it from being used in @safe
code.
This means that if you want to avoid undefined behavior, you must be very careful not to create unsafe values in @system
code and pass them as inputs to @safe
code--either directly as function arguments, or indirectly via struct/class/module variables.