• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    XCHAOSANSI C/C99 (specifikace), GNU C (gcc, glibc), Tiny C (tcc) a POSIX - ne nutně C++,g++,libstdc++ nebo Win32 API
    XCHAOS
    XCHAOS --- ---
    "The order of evaluation of function arguments is undefined in both C and C++"

    Níže popsané chování je s gcc, v clangu to jde zleva doprava.

    Jinak skutečně, vyhodnocování zprava doleva dá ty výsledky, co to vypisuje. A prevence je přeložit to jako

    gcc hello--.c -Wall -ohello--

    a skutečně to varuje

    warning: operation on ‘a’ may be undefined [-Wsequence-point]
    XCHAOS
    XCHAOS --- ---
    XCHAOS: "ověřit", ne uvěřit
    XCHAOS
    XCHAOS --- ---
    Tak jsem si definitivně ujasnil, že jsem pořád začátečník.

    Tohle je striktně vzato prapůvodně C++ funkčnost, v původním K&R céčku operátory ++ a -- pokud vím nebyly. Akorát pokud je nepřetěžujete, tak se dávno používají i v čistém C, takže je to zrovna věc, kterou bych zmínil klidně na první lekce nějakého kurzu céčka:

    #include <stdio.h>
    
    void main(void)
    {
     int a=1, b=1;
     printf("a==%d, b==%d\n",a,b);
     printf("a++==%d, ++b==%d\n",a++,++b);
     printf("a==%d, b==%d\n",a,b);
     printf("a--==%d, --b==%d\n",a--,--b);
     printf("a==%d, b==%d\n",a,b);
    }
    xchaos@utopia:~$ ./hello++
    a==1, b==1
    a++==1, ++b==2
    a==2, b==2
    a--==2, --b==1
    a==1, b==1

    Tohle se chová přesně dle očekávání a je to velmi edukativní pro začátečníky. Ale dovede mi někdo vysvětlit, proč se to chová jinak, pokud se identické výrazy sdruží jako parametry volání jediné funkce? Zejména tu 0 u třetího parametru! Ale i všechno ostatní. Vyhodnocování zprava doleva to zjevně není. Je hodně vtipný, že jsem pokládal za hotovou věc, co to vypíše a ověřoval si to vlastně jen z nudy, a zamýšlel jsem to do sbírky příkladů pro začátečníky. Jenže fskutečnosti vůbec a sám jsem i po 30 letech začátečník!

    Mohlo by to souviset asi s nějakýma automatickýma optimalizacema překladadače (?) ale sakra, nemá být základní syntaxe deterministická?
    #include <stdio.h>
    
    void main(void)
    {
     int a=1, b=1;
     printf("Hello++: a==%d, b==%d, a++==%d, ++b==%d, a==%d, b==%d, a--==%d, --b==%d, a==%d, b==%d\n",a,b,a++,++b,a,b,a--,--b,a,b);
    }
    xchaos@utopia:~$ ./hello++
    Hello++: a==1, b==1, a++==0, ++b==1, a==1, b==1, a--==1, --b==1, a==1, b==1
    XCHAOS
    XCHAOS --- ---
    mythological beliefs that programmers hold about the C language:

    C elegantly maps statements of source code to assembly
    A reader of a C program can visualize, directly, the mechanism by which their code is straightforwardly converted to assembly
    The only language in which an operating system can be written in is C
    C is important for writing high-performance scientific code
    algorithms and complex ideas are easy to communicate in C, and if not, you can use C++

    mx alex tax1a - 2020 (6): "mythological beliefs that programmers hold about …" - Infosec Exchange
    https://infosec.exchange/@atax1a/116127957491058640

    Po pravdě, nevím. To s tím přepisem do strojového kódu současných procesorů fakt nedokážu uvěřit :-)
    MARASAN
    MARASAN --- ---
    CVE-2026-0915: GNU C Library Fixes A Security Issue Present Since 1996 - Phoronix
    https://www.phoronix.com/news/Glibc-Security-Fix-For-1996-Bug
    XCHAOS
    XCHAOS --- ---
    switch(1) {
        case 0:
            if (false) {
                case 1:
                    printf("Hello\n");
            } else {
                case 2:
                    printf("World\n");
            }
    }
    => Hello
    XCHAOS
    XCHAOS --- ---
    tahle šílenost je použitá například v některých implementacích printf():
    vfprintf.c\stdio\src - musl - musl - an implementation of the standard library for Linux-based systems
    https://git.musl-libc.org/cgit/musl/tree/src/stdio/vfprintf.c#n597

    aby bylo jasné - já si nemyslím, že by se takhle v C mělo programovat, ale samozřejmě pamatuju na časy, kdy goto byl normální nástroj flow control (v BASICu dokonce jediný) a je vtipné, jak se to vyvíjí. Dnes pokládám skok dovnitř scope za něco absolutně šíleného, ale z hlediska třeba programátorů v Rustu bude podobně šíleně působit ad-hoc správa paměti v C...
    XCHAOS
    XCHAOS --- ---
    A tohle je ještě horší :-)
    Shafik Yaghmour: "Cursed code of the day https://godbolt.org/z/1z8…" - Hachyderm.io
    https://hachyderm.io/@shafik/115833761917985895
    XCHAOS
    XCHAOS --- ---
    Do not try this at home:
    Pigeon's Device
    http://pigeonsnest.co.uk/stuff/pigeons-device.html
    XCHAOS
    XCHAOS --- ---
    Jan Wildeboer 😷:krulorange:: "Had to verify. And yes. Kernighan and Ritchie rea…" - social.wildeboer.net
    https://social.wildeboer.net/@jwildeboer/103509861237806820
    Vtípek v původním manuálu jazyka C
    XCHAOS
    XCHAOS --- ---
    Něco jako "nemáme rádi novoty", hmm.
    Dependable C
    https://dependablec.org/
    XCHAOS
    XCHAOS --- ---
    LOL
    URL in C - Susam Pal
    https://susam.net/url-in-c.html
    XCHAOS
    XCHAOS --- ---
    Ehm, přiznám se k jedné věci. Je to tak dávno, co jsem doopravdy programoval cokoliv podstatnějšího v C, že jsem prostě neznal valgrind :-) Neuvěřitelná vychytávka, hlavně když binárku zkompilujete s -g, takže vám prozradí i číslo řádku (sice zanalyzovat, odkud se neinicializovaná hodnota vzala, je občas nadlidský úkol, zvlášť když vám to valgrind prozradí, až když jste ten buffer odeslali do printf() :-) ... ale vlastně teď nechápu, jak jsem bez toho dřív mohl v C cokoliv napsat a používat.
    XCHAOS
    XCHAOS --- ---
    XCHAOS
    XCHAOS --- ---
    DANIELSOFT: ne, Rust je na rozdíl od C++ fakt bezpečnej, ta složitost tam má velmi konkrétní důvod, že zabraňuje kompileru vytvářet konstrukce s pointery, které v C nebo C++ jde normálně zkompilovat a které vedou k memory leakům nebo psaní po paměti. Ale to, že chápu smysl těch opatření v Rustu neznamená, že jsem schopnej se v tom naučit plyně programovat... možná tak před deseti lety..

    To C3 mi přijde jednoduchý v tom, že se zjevně víc drží původní C syntaxe, akorát v něm pole nesou informaci o své délce a tak. To působí hodně rozumně...
    DANIELSOFT
    DANIELSOFT --- ---
    XCHAOS: to bych si myslel, zkoušel jsem se dívat na rust a složitej mi docela přišel

    že by byl Rust nové C++ a Go nová Java?
    Kliknutím sem můžete změnit nastavení reklam