Rzutowanie typów całkowitych wymaga dyscypliny
Kolejny niewinny fragment kodu (semantyka nie jest szczególnie istotna więc opisywanie jej sobie daruję):
for(unsigned i = 1; i < currPfx.size() - s2.size() + 1; ++ i) { num = 10 * num + currPfx[i]; }
(zmienne currPfx i s2 to pewne string-i).
Wygląda niewinnie, nieprawdaż? Dla specyficznych danych zrzucało core. W wywołaniu currPfx[i]. W związku z tym, że i lądowało daleko poza zakresem poprawnych indeksów dla currPfx (uprzedzając pytanie: s2 zawsze miało długość co najmniej 1).
Pomogła zmiana na
int count = currPfx.size() - s2.size() + 1; for(int i = 1; i < count; ++ i) { num = 10 * num + currPfx[i]; }
Generowane przez niektóre kompilatory ostrzeżenia 'comparison between signed and unsigned' warto jednak oglądać...
- «Ryzykowne słowo exception
- Uwaga z ciągami zapisów do strumienia»
- ↑C++ - sztuczki i niebezpieczeństwa