Thread overview
automatic NaN propogation detection?
Sep 25, 2021
Chris Katko
Sep 25, 2021
Elronnd
Sep 25, 2021
Tejas
September 25, 2021

Is there any automatic compiler-based or library methods for detecting NaNs? I mean, if the compiler is outputting code that it knows is going to be set in memory to NaN, why isn't it giving me at least a compiler warning? Is that some sort of "NP complete" can't-fix issue or something?

I mean, I can pass NaN to std.math.round() and it doesn't fire off an exception or anything. It compiles fine even though it's impossible-as-compiled to be correct. (Unless my absurd intention was to find the rounded value of NaN.) Instead, I'm stuck finding out where the NaN started, from a trail of destruction of values destroyed by NaN propogation. Why not stop it at its source?

Even dscanner won't flag this code!

import std.stdio;
import std.math;

int main()
	{
	float x;
	writeln(x);
	writeln(round(x));
	return 0;
	}
September 25, 2021
On Saturday, 25 September 2021 at 07:53:11 UTC, Chris Katko wrote:
> Is that some sort of "NP complete" can't-fix issue or something?

The general case is obviously unsolvable.  Trivial proof: float x = nan; if (undecidable) use x.  I'm sure your imagination can supply more realistic cases (but I promise they really do come up!)

However that doesn't mean we can't do flow analysis conservatively.  Similar caveats apply to @live, but that does not mean it is useless.  (Not saying @live isn't useless, just that this doesn't indicate that.)  The bigger problem is that it really is hard to tell if you 'meant' to use a nan somewhere or not.

And if you tried to apply such a semantic analysis pass to existing code, you would find it riddled with false positives, where a float was default-initialized to nan and the compiler was unable to convince itself the variable was overridden before being used in all paths.
September 25, 2021

On Saturday, 25 September 2021 at 08:18:49 UTC, Elronnd wrote:

>

(Not saying @live isn't useless, just that this doesn't indicate that.)

Must we continue hurting Walter's feelings :(