languages
Yes, the compiler can catch uninitialized variables within the scope
of a subroutine. It obviously can't follow all flows, but due to the
global analysis phase it can get quite close (using the REF/DEF
model). There are a few pathological cases that can skip by it (such
as conditional initialization of a variable) but in practice these
are so rare to not be an issue.
SAS/C has a concept that I introduced for the Amiga of __asm
specifications for routines. You can declare an external routine as
__asm and then give the register conventions for the calling
sequence. This combined with the registerized parameters in general
for code (using the -rr option on the compiler) can lead to some
quite good code. Also, the assembler will output line number
information that the debugger understands so that you can debug your
assembler code at the SOURCE level – a strange concept I might add.