Topics: Analysis of if instructions - Slightly better error messages and Other improvements

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.

Analysis of if instructions

SA is now able to analyse if instructions. 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".

Other improvements

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.