Я получаю тот же результат, используя gcc / gcov 3.4.6.
Для оператора switch он обычно должен генерировать две ветви для каждого оператора case. Один из них, если дело истинно и должно быть выполнено, а другое - это ветвь «падения», которая переходит к следующему делу.
В вашей ситуации похоже, что gcc делает "ветвь" ветвления для последнего случая, что не имеет смысла, так как нечего попадать.
Вот выдержка из кода сборки, сгенерированного gcc (я изменил некоторые метки для удобства чтения):
cmpl $2, -4(%ebp)
je CASE2
cmpl $2, -4(%ebp)
jg L7
cmpl $1, -4(%ebp)
je CASE1
addl $1, LPBX1+16
adcl $0, LPBX1+20
jmp DEFAULT
L7:
cmpl $3, -4(%ebp)
je CASE3
addl $1, LPBX1+32
adcl $0, LPBX1+36
jmp DEFAULT
Я признаю, что я не очень разбираюсь в сборке x86 и не понимаю, как использовать метку L7, но она может иметь отношение к дополнительной ветке. Может быть, кто-то с большим знанием о gcc может объяснить, что здесь происходит.
Похоже, что это может быть проблемой со старой версией gcc / gcov, обновление до более новой версии gcc / gcov может решить эту проблему, особенно если учесть другой пост, где результаты выглядят корректно.