This week brought a bunch of small improvements to the static analyser: better error messages, less crashes, more errors detected at compile- instead of run-time.
SA is now able to analyse
It follows both (true and false) branches and provides a trace (after taking true branch here... and
after taking false branch here... such and such error is detected) for the errors it throws.
This makes reasoning about the reports easier as the SA provides an explanation for how it found the error.
Slightly better error messages
Error trace messages are now a bit easier to decipher because they were made somewhat context-aware. For example, when the SA detects use-of-empty error but the register was at some point defined it will report "use of erased register" instead of "use of empty register" giving additional clues as to the nature of the error.
Context-awareness of error messages also manifests in other ways, like "swap with empty register" or "copy from empty register".
Negative register indexes are now detected and cause a compile-time error.
Reusing register names is not allowed and the new SA finally enforces this.
Missing operands now cause an error instead of a crash.