Programski jezik C3 zvanično napušta korišćenje neoznačenih brojeva za definisanje veličina i dužina nizova u memoriji. Ova velika promena poznata kao szmageddon ispravlja decenijsku zabludu da su unsigned tipovi prirodniji izbor za brojanje elemenata. Autori jezika su nakon pet godina priznali da su potpisani celi brojevi daleko bezbednije i logičnije rešenje za sistemsko programiranje.
Korišćenje neoznačenih tipova poput usz često dovodi do kritičnih grešaka u kodu koje je teško uočiti na prvi pogled. Najpoznatiji primer je beskonačna petlja pri odbrojavanju unazad jer uslov nikada ne može postati manji od nule. Takođe automatska promocija tipova često pretvara negativne brojeve u ogromne pozitivne vrednosti što potpuno kvari logiku poređenja u programima.
Pouke iz jezika Java i Go o bezbednosti koda
Moderni jezici kao što su Java i Go odavno koriste potpisane brojeve za veličine kako bi eliminisali čitave klase bagova. Granice kod neoznačenih brojeva su previše blizu nuli što programere stavlja u opasnu zonu pri svakom oduzimanju ili radu sa offsetima. Na današnjim 64-bitnim sistemima opseg potpisanih brojeva je više nego dovoljan za bilo koji realni niz podataka koji se može smestiti u memoriju.
Problem sa unsigned tipovima postaje posebno vidljiv kod operacija deljenja i ostatka pri radu sa prstenastim baferima. Čak i iskusni programeri često prave greške u računanju indeksa koje kompajler ne može da detektuje kao neispravne. Prelazak na signed logiku omogućava da overflow rezultuje negativnim brojem što je mnogo lakše dijagnostikovati nego neočekivano veliku pozitivnu vrednost.
Šta donosi szmageddon i novi sz standard
Nova verzija C3 jezika uvodi tip sz kao podrazumevani standard za sve operacije sa indeksima i dužinama objekata. Uporedo sa ovom promenom potpuno se ukidaju i prikrivene implicitne konverzije između potpisanih i nepotpisanih tipova podataka. Rezultat je znatno čistiji kod koji zahteva manje eksplicitnog kastovanja i drastično smanjuje broj skrivenih logičkih propusta u aplikacijama.
Autori priznaju da je decenijska navika korišćenja neoznačenih veličina u jezicima kao što su C i Rust stvorila lažni osećaj ispravnosti. Svaka promena koda tokom ovog prelaza pokazala je da logika postaje jasnija a programi robusniji kada se koriste potpisani brojevi. Iako je proces prilagođavanja bio izazovan on postavlja nove temelje za bezbedniji razvoj sistemskog softvera u budućnosti.