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.

komentarze obsługiwane przez Disqus