In the function `int walCheckpoint(...)` in file `wal.c` at line 1820
there is the following comment

/* Thread-sanitizer reports that the following is an unsafe read,
** as some other thread may be in the process of updating the value
** of the aReadMark[] slot. The assumption here is that if that is
** happening, the other client may only be increasing the value,
** not decreasing it. So assuming either that either the "old" or
** "new" version of the value is read, and not some arbitrary value
** that would never be written by a real client, things are still
** safe. */
u32 y = pInfo->aReadMark[i];

> assuming either that either the "old" or  "new" version of the value is read, 
> and not some arbitrary value that would never be written by a real client

This  assumption is false according to cpprefeference [1].
Specifically, what happens here is a data race which is undefined
behavior.

I do not know whether the code is unsafe in practice. It is possible
that it is deemed safe because synchronization happens elsewhere or
because common compilers on common architectures do not exhibit
undefined behavior in this case. Either way, the comment lacks detail
because it does not agree with the standard.

Even if the code is safe in practice today, it should still avoid
undefined behavior in order to avoid future problems.

[1] https://en.cppreference.com/w/c/language/memory_model
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to