One thing that puzzles is me is why some of these checks aren't just part of the warnings that a compiler emits. I get that you wouldn't want to enable them all the time, but usually comparing a variable to itself is not what you want.
I completely agree that having these warnings in the compiler is much better than a standalone analysis tool, because they're less likely to be ignored. But I think it may have been a bit of a shift of mindset for the compiler developers to put more effort into warnings and diagnosing dubious code rather than simply being a code generator for correct code.
Everything that is outsourced for an external tool, just happens not to be used by the majority.
Clearly the introduction of clang and its sanitizers has changed a bit the mindset, however they are still used by a minority.
As per CppCon 2016, 1% of the audience confirmed they were using some kind of validation tool.
NaN === NaN // -> false
This check is sometimes used to check if a number is NaN. a.x = x;
a.y = y;
a.y = z; <==
But those heuristics will usually also emit false-positives. This is why pretty much all static analyzers have an easy way to suppress warnings for a certain line (usually through a "magic comment"), but suppressing compiler warnings for a single line is much more cumbersome, since it has to be done through the preprocessor.