[Not really OT] Crowdstrike Analysis: It was a NULL pointer from the memory unsafe C++ language.

Quirin Schroll qs.il.paperinik at gmail.com
Sat Jul 27 00:22:19 UTC 2024


On Friday, 26 July 2024 at 16:11:28 UTC, Walter Bright wrote:
> On 7/26/2024 3:21 AM, Richard (Rikki) Andrew Cattermole wrote:
>> If the MMU is throwing an exception something has gone 
>> terribly wrong elsewhere and having a programming language 
>> force you to check for null is a reasonable precaution against 
>> this.
>
> ```
> assert(p != null); // throws an unrecoverable exception
> ```
>
> Array bounds errors also throw an unrecoverable exception

 From what I've seen, the best argument against adding something 
to the type system to assist the programmer with handling null 
correctly where it may occur is that new, expensive analysis and 
possibly new control-flow statements are needed so that in cases 
where something nullable has been definitely ruled out of being 
null, the compiler won't complain anymore about the programmer 
failing to handle null.

The difference between an array index and a possibly null pointer 
is that almost all the time almost all the possible values for 
the array index are invalid, so it's quite obvious that out of 
bounds access must be accounted for, but also static analysis 
can't really make sure an index is in bounds. For null, however, 
it's a single value that's problematic. That a variable has a 
value different from one known iffy one is rather easy to express 
in a type system. What helps is that some core language 
constructs (`new`) return non-null values, but as soon as the 
value is created, the type system forgets its non-nullness.

It's not about having defined semantics or undefined behavior, 
the semantics and behavior are defined. A type system that 
distinguishes nullable and non-nullable reference types helps 
programmers keeping track of when they have to handle null and 
when they don't, and whether a function expects null arguments or 
not. When all reference types can be null everywhere, but won't 
be in practice, it teaches programmers not to think of them. But 
the worst offender are `ref` parameters. They can be null, too, 
(or `*null` if you're pedantic), but practically no function 
taking a reference expects and handles the case where the 
reference is null — or even documents that assumption. Even 
seeing `&var is null` probably looks to most like an obvious case 
of a vacuously `false` expression. The reason why null references 
are allowed is because a reference can easily become null by 
accident in `@safe` code, which means they need to have defined 
behavior. But that's only because pointers aren't distinguished 
if they can be null or not. Most references are initialized by 
obvious non-null expressions, only a pointer dereference is the 
an exception.


More information about the Digitalmars-d mailing list