It sounds to me raw pointers not being Send + Sync is weird. Here is why:

It is safe to send or share them. unsafe is to dereference them. And this is unsafe even when not shared between threads.

One can circumvent that very easily with a few casts.

Why is AtomicPtr: Send + Sync then? One may store a pointer to a local variable on an AtomicPtr shared between threads and then another thread could load such pointer and dereference it and… Well, read item 1.

You are right. The lack of these impls for raw pointers doesn’t make any code more sound, because unsafe is already required to dereference them.

The reasons why pointers implement neither of these traits is basically as a lint. The majority of people writing rust almost never think about Send and Sync because they almost never have to. And a very substantial portion of people using raw pointers are going to be doing so for FFI purposes.

It’s possible that those pointers obtained through C APIs cannot be safely used across threads in the manner that the rust code wants to use them. Hence, when somebody writes a struct around some FFI pointer:

struct CApiThing {
ptr: *mut c_void,
}

the fact that CApiThing does not automatically impl Send or Sync can prevent some footguns, and forces the author to explicitly think about it before providing these impls.