Nie wpisuj znaku backspace do stringów
Ostatnio jeden z moich współpracowników zgłosił się z tajemniczym problemem. W programie bazodanowym, wykonując polecenie wyglądające jak najbardziej poprawnie, dostawał informację o błędzie składniowym. Wypisywany na ekran opis wyjątku prezentował SQLa wyglądającego idealnie jak trzeba. Wyglądało to mniej więcej tak:
Nieoczekiwany znak ',' w 1 wierszu, 13 kolumnie. Polecenie SQL: SELECT a,b,c FROM some_table
(13 kolumna wypadała ... po ostatnim polu pierwszego wiersza)
Brzydkie podejrzenia (coś maże po pamięci...) padły na bibliotekę obsługującą bazę danych - która jednak była już przecież od dawna z powodzeniem używana.
Dopiero bliższa analiza pozwoliła odkryć przyczyny kłopotu. Kolega generując listę pól w zapytaniu doklejał po każdym z nich przecinek. Na koniec chciał usunąć ostatni, niepotrzebny przecinek i w tym celu zastosował taką konstrukcję:
// Na fields mamy napis "a,b,c," fields += '\b';
czyli dopisał znak backspace! Oczywiście zmiana na
fields.erase(fields.size() - 2);
pomogła.
Ten problem ma też swoją poważniejszą odmianę - często w aplikacjach biznesowych polega się na rozmaitych logach, analizowanych w razie wystąpienia błędu. Jeśli w danych zaplącze się znak backspace, powrotu karetki itp, możemy długo szukać przyczyn problemu. Na to pomóc może jedynie pisanie własnych filtrów, odsiewających tego typu znaki przed zapisem do logu.