Ответ 1
Является ли это законным C++? Если да, что он должен делать?
Это хорошо сформированная программа, но она демонстрирует Undefined Behavior, потому что она читает неинициализированную переменную. Это означает, что нет никаких ограничений на его поведение (он может юридически делать буквально все).
Как поймать эти "ошибки" во время компиляции?
Включите достаточное количество предупреждений и создайте с помощью "обработать предупреждения как ошибки". При наличии достаточного количества предупреждений gcc 5.4 улавливает его правильно. Обратите внимание, что в случае gcc это также требует оптимизации поворота, поскольку gcc делает некоторые анализы (например, неиспользуемые переменные) только при оптимизации.