SystemTime conversions invite programmer error #52522
Labels
A-docs
Area: Documentation for any part of the project, including the compiler, standard library, and tools
C-enhancement
Category: An issue proposing an enhancement or a PR with one.
T-libs-api
Relevant to the library API team, which will review and decide on the PR/issue.
Yesterday, I found and reported a panic bug in
serde_json
which traces its origins to the mechanism for extracting usable information fromSystemTime
.Specifically, using the best method they believed to be available, it would panic when I tried to serialize metadata for files with negative
mtime
values. (I have one file with an mtime of-1
and another with an mtime so far in the future that it overflows into a large negative number if the Rust code is compiled for thei686-unknown-linux-musl
target.The current design of the API encourages users to assume that sources of
SystemTime
values use unsigned values internally (ie. that modifications to the system clock are the only source ofErr
with valid input), and, further more, in the bug I reported forserde_json
, it led @lambda to the incorrect conclusion that there is currently no way to losslessly serialize and deserializeSystemTime
values.If nothing else, the documentation should be improved in the following ways:
The documentation for both
UNIX_EPOCH
definitions should explicitly mention that the underlying OS may return validSystemTime
values prior to the epoch and code should be prepared for such an eventuality. (Perhaps with the concrete example ofext3
filesystems allowing negativemtime
values to be stored)The documentation for
SystemTime::duration_since
should use "may returnSystemTimeError
" rather than "may fail" to avoid the connotation that anErr
result is erroneous in any sense other than being an "until" rather than a "since".That is, "failure" connotes a response that should prompt either retry or error-propagation, while it is not necessary to re-run the operation with the arguments reversed in order to extract the
Duration
and, depending on the input, nothing may be wrong at all. (ie. theResult
discriminant is semantically equivalent to a sign bit in this case.)"and the error contains how far from self the time is" is too easy to overlook, given how important it is for robust software to handle this eventuality. It should explicitly mention
SystemTimeError::duration
to make it more eye-catching.Perhaps "Returns an Err if
earlier
is later thanself
. ADuration
representing how farself
is beforeearlier
can be retrieved via theduration()
function on the resultingSystemTimeError
.There are probably other ways to better tune the writing to guard against human error, but I don't want to be here all night trying to perfect this when you might think of the same improvements immediately, simply by virtue of having a different perspective.
The text was updated successfully, but these errors were encountered: