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.