Comment Re:That seems a bit disconnected (Score 1) 101
That's not wrong, it's also not right either. For example, C has no way of distinguishing between a pointer to an array, a pointer to a single datum and a pointer to an object which might not exist (i.e.one that can hold NULL)
It's true that the contract for whether or not a pointer is nullable cannot be enforced within the language, but if such a contract does exist in a codebase, and you don't follow it, I'm not entirely sure that's a logic error.
As for what C does and does not know about a pointer- it knows as much as you tell it.
int *[] is not the same as int **.
int * is not the same as int **
This can get a bit funky across function boundaries, but the function definitions restore the types, even if they have to be cast.
i.e.,
int arr[10];
fn((int **)&arr);
void fn(int *arr[10]);
The "object which might not exist" sounds like you're talking about an optional.
I don't think it's fair to say, "C can't tell if your pointer is null, so a blind dereference of it is safe*". C would say, "you're free to blindly dereference this pointer if you want, but caveat emptor. A compiler that supports optionals knows what you're doing right now is unsafe and won't let you do it, a C compiler assumes you know.
For some domains, this is absolutely necessary.
I would rate your claims "broadly true, but broadly missing the point."