Przekroczenie zakresu tablicy o jeden, czy kilka elementów czasami, w najlepszym wypadku, nie spowoduje żadnych negatywnych skutków ubocznych, ale w najgorszym, w czasie testów właśnie tak będzie, nie będzie widać błędu, a w programie w "produkcji" w sytuacji krytycznej albo program zadziała błędnie albo wysypie się albo wysypie cały system. To autor-programista odpowiada za prawidłowe wartości indeksów tablic użytych w swoim programie..
Dla odprężenia dwie lektury:
https://pl.wikipedia.org/wiki/Sprawdzanie_zakresu
oraz: https://pl.wikipedia.org/wiki/Eliminacja_sprawdzania_zakresu
W językach c/c++ nie jest problem z eliminacją sprawdzania zakresów - jest to "dane" z automatu, ale raczej z włączeniem takiego sprawdzania. Dlatego u Ciebie program po kompilacji będazie działał "normalnie", a na SPOJU - gdzie jest włączone takie sprawdzanie, program się wywala z odpowiednim komunikatem błędu. Jeżeli spytasz jak to jest zrobione, odpowiem nie wiem, nie jestem ani twórcą, ani adminem systemu SPOJ. ALe u Ciebie program jest uruchamiany pod kontrolą "tylko" "gołego" i bezbronnego, jakiegoś - twojego systemu operacyjnego, a na spoju w specjalnym środowisku do sprawdzania i samego programu i poprawności odpowiedzi.
Do takich sprawdzań są gotowe biblioteki - ale na spoju, może to być zupełnie inaczej - np jakieś opracowanie autorskie. Zobacz płot elektryczny - pastuch np: https://slackbuilds.org/repository/13.1/libraries/electric-fence/
Więc to nie wina-zasługa wersji kompilatora, ale właśnie tak jakby systemu, w którym program jest uruchamiany i testowany. Gdzie system, to oczywiście nie wersja i rodzaj dystrybucji linuxa, czy jego odmiana system 32 bitowy lub 64 bitowy, tylko specjalnie przygotowane środowisko kompilowania, uruchomienia i testowania naszych programów.