Poznáte ten psychiatrický test, kde človek musí strkať rôzne tvarované kolíky do rôznych dierok?
Určite áno. A určite viete, ako to dopadne s človekom ktorý strká hranatý kolík do okrúhlej dierky, prípadne veľký kolík do malého otvoru. Väčšinou si vyslúži dlhší pobyt v zariadení pre takýchto ľudí určenom. A argumenty, že ten test je blbý a kolíky by mali byť gumené sú ocenené maximálne útrpným úsmevom.
Ale v programovaní je to tak trochu inak. V tejto profesii sa strkanie hranatých kolíkov do okrúhlych dierok považuje za normálne a tolerované. K tomu sa dá prirovnať priraďovanie signed a unsigned hodnôt. A priraďovanie 32 bitových hodnôt do 16 bitových premenných sa dá prirovnať strkaniu veľkého kolíka do malej dierky.
Pozrime sa na jeden malý úryvok kódu. Tento kód sa objavil v diskuzii na mikrozone. (prosím pôvodného autora kódu aby ďalšie slová nebral príliš osobne – nech sa poďakuje dalšiemu diskutujúcemu zmieňujúcemu „sviňu Ritchieho“, vďaka ktorému sa zrodila táto úvaha)
1. #include <stdio.h> // 2. 3. #define DELTA_DA_MINUS 20 // 4. 5. 6. int main(void) 7. { 8. volatile static uint16_t hodnota_da = 10; 9. static uint32_t kalibracia; 10. while(1) { 11. if (hodnota_da >= DELTA_DA_MINUS) hodnota_da -= DELTA_DA_MINUS; 12. kalibracia = 1000 * 226; 13. kalibracia = kalibracia*(uint32_t)hodnota_da; 14. kalibracia = kalibracia/1000; 15. if (kalibracia > 255) kalibracia = 255; 16. hodnota_da = (uint8_t)kalibracia; 17. } 18. }
Aké sú tam formálne chyby a (potenciálne) problémy?
- Riadok 8 – priradenie int do unsigned int
- Riadok 11 – porovnanie int a unsigned int
- Riadok 12 – 16-bitový výpočet vedúci k 32 bitovému výsledku
- Riadok 15 – porovnanie int a unsigned int, navyše 32-bitovej hodnoty so 16-bitovou, plus ich následné priradenie
- Riadok 16 – tak toto je úplná záhada – 32 bitová hodnota, precastovaná na 8 bitov a priradená do 16-bitovej premennej
Ak vynecháme tajomný riadok 16, tak tu máme šesť formálnych chýb (vrátane unikátu 3 chyby v jedinom riadku 15) – inými slovami, šesť hranatých kolíkov zatlčených do okrúhlych dierok, resp. veľkých kolíkov zatlčených do malých dierok.
Smutné je, že v ďalšej diskuzii nikto ani slovom nenaznačil tieto problémy. Skôr sa diskuzia ubrala tým smerom – ako to býva obvyklé – aké je to C a jeho autori zlé.
Asi sa treba zmieriť s tým, že programátorská profesia sa stáva stále viac útočiskom pre ľudí pre ktorých je zatĺkanie veľkých hranatých kolíkov do malých okrúhlych dierok niečím normálnym.
Je mi z toho smutno.