Jak neviditelné znaky můžou zkazit den

PHP, JavaScript, Kvalita kódu

Některé znaky v jiných abecedách mohou vypadat, jako běžně používané znaky v programovacích jazycích. A díky své podobnosti mohou i pokročilejšímu programátorovi pěkně pokazit den.

Jak neviditelné znaky můžou zkazit den

Mezery či jiné znaky s nulovou šířkou, středník či dvojtečka s plnou šířkou a mnoho dalších znaků často vypadá stejně, jako jejich alternativy běžně používané v programovacích jazycích. V kódu níže jsou hned 2 znaky, které nejdou vidět. PHP Linter ale zahlásil chybu na řádku 31.

// Kód vypadá v pořádku, ale hlásí chybu - (31 řádek je v této ukázce řádek 10)
// Unexpected '$this' in ./app/Http/Controllers/HomeController.php on line 31
public function __construct( CategoryService $categoryService, BreadcrumbService $breadcrumbService, NewsService $newsService ) { $this->categoryService = $categoryService; $this->breadcrumbService = $breadcrumbService; // <- toto není středník $this->news​Service = $newsService; // <- zero-width mezeru lze odhalit díky zvýraznění }

Zvýraznění znaků v editoru

Ať už se znak do kódu dostane jako žertík od kolegů, nebo kopírováním z externích zdrojů, hledání může být náročné. Naštěstí ale existují pluginy do editorů, které tyto znaky znázorní. Pro Sublime Text to je Highlight Dodgy Chars a pro VS Code Highlight Bad Chars nebo Highlight Dodgy Characters.

Mě se to nestane, testy a CI pipeline to odhalí

Někdo si může říct, že testy a pipeline to vždy odhalí a kód s těmito znaky se nedostane do produkce. Osobně ale můžu oponovat, protože mě se přesně tato situace stala. A kód se i přes testy dostal do produkce a způsobilo to problémy.

Jednalo se o logistický systém pro správu zásilek. Od managementu jsem dostal Excelovskou tabulku s novým zněním SMS zpráv, které se mají odesílat zákazníkům. Jednotlivé zprávy jsem zkopíroval do kódu, uložil, spustil testy a předal na release. Testy problém neodhalily, protože problém nastal až na SMS bráně operátora, který zprávy s těmito znaky odmítl přijmout. Chybu jsme hledali dlouho a až výše zmíněné pluginy pomohly tento problém odhalit.


Máte také zkušenosti s podobnými zákeřnými znaky? Podělte se v komentářích

K tomuto článku již není možné přidávat další komentáře