Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - linuxak

Stran: [1] 2 3 ... 8
1
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 15:36:35 »
Jenže na té adrese může být registr která má nenahraditelnou speciální funkci či význam. To je naprostý nesmysl to řešit tak jak říkáš. To může udělat jenom teoretik který k tomu prakticky nikdy nečmuch.
To je velmi neobvyklé, že by byl speciální registr nějakého mikrokontroléru na adrese 0, kdy jsi na to prakticky narazil a musel jsi to řešit? Neříkam, že neexistují architektury, kde to tak je, ale zajímalo by mě, kde jsi to prakticky potkal? Pokud se totiž něco takového stane, máš opravdu problém. Buď musíš do assembleru a provést zápis tam, nebo dělat v C něco hodně nestandarního a doufat, že se to nerozbije s novou verzí překladače.

2
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 14:50:34 »
Já když říkám že píšu v C, tak mluvím o syntaxi jazyka. Že ty v tom vidíš standard a nedokázal bys napsat driver který musí zapsat na adresu 0 protože bys měl panickou hrůzu že to je undefined behaviour, to je tvoje mínus. Já jsem pragmatik a flexi. Kde to jde tak píšu portabilní kód, kde to nejde tak platform specific. A jestli tomu říkáš že nepíšu v C, tak si tomu tak říkej, je mě to celkem šumák. Asi vlastně nemám dále co bych tady k diskuzi přispěl, jsem diskvalifikován se o C vůbec bavit, protože dělám embedded věci. Oukej.
Ale to se týká i embedded. I v embedded musíš řešit, že je dereference null pointeru undefined behavior. Dám ti praktický příklad. Jsou mikrokontroléry, které mají RAM v paměťové mapě od adresy 0, takže adresa 0 je naprosto validní pointer do RAM. Co s tím? Vyřeší se to tak, že se RAM zadefinuje od adresy 1 a adresa 0 se ignoruje, abychom se vyhnuli problémům s dereferencí null pointeru. Přijdeme o jeden bajt RAM na mikrokontroléru, ale to je nízká cena za vyřešení problémů s adresou 0 a undefined behavior.

3
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 14:18:41 »
Zápis přes pointer na adresu v paměti je naprosto standardní věc v C. To jenom ty zase musíš vytahovat nějaké speciality jako adresa 0 abys ukázal že jsi věčný troublemaker. Good job :D
Já jen cituji C standard, kde je explicitně uvedeno, že dereference null pointeru je undefined behavior. Rozumím tomu, že C standard nemáš přečtený a nevíš to. Nerozumím ale tomu, proč si pořád v opozici a snažíš se tvrdit, že zápis na jakoukoliv adresu přes pointer je v pohodě? Není to v pohodě, zápis na adresu 0 je dle C standardu undefined behavior. Ve chvíli, kdy to uděláš, tak od toho C standard dává ruce pryč a takový program může dělat cokoliv.

4
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 13:55:46 »
Píšu v C. Kde mám platform/compiler specific věci, tak použiju #ifdef a do poslední #else větve dám error "not implemented" a nechám toho kdo to někdy bude v budoucnu potřebovat, aby ty #else větve dopsal. Nebudu paralyzovat celý vývoj jenom kvůli tomu abych všem linuxákům vyhověl. Za to mě zákazník neplatí.
Nepíšeš v C. Ve chvíli, kdy uděláš dereferenci null pointeru nebo jiné undefined behavior, tak od toho C standard dává ruce pryč. Na některých platformách takové věci můžou dávat smysl, ale vždy musíš explicitně zdůraznit, že se jedná o platformově závislou věc, kterou musíš speciálně řešit, např. nějakými flagy překladače. Ty to tady prezentuješ jako něco normálního, ale děláš je pravý opak, pohybuješ se mimo C stadard a musíš to záplatovat nějakými ohýbáky.

5
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 13:43:10 »
To mě ale nezajímá, mě zajíma jaký bude strojový kód a co program dělá a jestli dělá to co chci.
V pořádku, ale neříkej potom, že píšeš v C. Nepíšeš totiž v C, ale v nějakém vrid dialektu, kdy jsou tvoje programy funkční jen s konkrétním nastavením překladače na konkrétní platformě.

6
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 13:34:11 »
Prostě si překladač nastavím jak potřebuju.
Můžeš prohlásit, že dereference pointeru není undefined behavior. Můžeš i zkusit donutit překladač, aby při dereferenci null pointeru dělal něco definovaného. Nemáš pak ale validní C program. Máš program, který je dle C standardu nefunkční, standard říká, že nedefinuje jeho chování.

7
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 13:10:54 »
To nema s GCC nic společného. Takhle se psalo jestě než nějaký GCC vůbec existoval. A ani to nemá nutně nic společného s adresou 0. Prostě obecně když mám pointer a přectu přes něj nebo zapíšu, tak čtu nebo zapisuju z nějaké adresy v paměti která odpovídá hodnotě pointeru. Tady nic nestandardního není.
Pořád tomu nerozumíš. Nevadí, zkusím to vysvětlit znovu. null pointer (adresa 0) se v C standardu ošetřuje speciálně. C standard explicitně říká, že dereference null pointeru je undefined behavior. Tozn. pokud máš v C programu čtení nebo zápis adresy 0, překladač s tím může udělat cokoliv (a taky dělá). Může to ignorovat, může vygenerovat neplatnou instrukci, může to dokonce i fyzicky provést. Jakékoliv chování, včetně všech zmíněných, je při dereferenci null pointeru legální.

8
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 12:07:34 »
A jak zapíšu do registru který je na adrese 0x00000000
Nezapíšeš. Protože gcc ti na tohle, v závislosti na optimalizacích, verzi překladače a fázi měsíce vygeneruje ud2 isntrukci. A proč? Protože může, je to undefined behavior, norma takové chování povoluje.

https://godbolt.org/z/bGqsEqsYc

Tak překladač má být správně nastaven podle toho co dělám...
Kód: [Vybrat]
-O2 -fno-delete-null-pointer-checks
https://godbolt.org/z/TTfc87sxb

Kód: [Vybrat]
test():
        mov     DWORD PTR ds:0, 1
        ret
-fno-delete-null-pointer-checks je nestandardní gcc rozšíření. Otázka zněla, jak ve standardním C zapsat na adresu 0. Odpověd je, že to ve standardním C NELZE, protože dereference null pointeru je dle C standardu undefined behavior.

9
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 10:27:29 »
A jak zapíšu do registru který je na adrese 0x00000000
Nezapíšeš. Protože gcc ti na tohle, v závislosti na optimalizacích, verzi překladače a fázi měsíce vygeneruje ud2 isntrukci. A proč? Protože může, je to undefined behavior, norma takové chování povoluje.

https://godbolt.org/z/bGqsEqsYc

10
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 22:34:28 »
Ne, k datům se přistupuje přes pointer, tak proč by to mělo psát že array out of bounds?
gcc ví, že pointer je alias na to původní pole. V tomto kódu warning dostaneš:
Kód: [Vybrat]
#include <stdio.h>

int main()
{
    int array[2] = {0, 1};
    int *a = &array[1];
    a += 1;
    printf("%d\n", *a);

    return 0;
}
Kód: [Vybrat]
gcc -Wall -O2 main.c -o test
main.c: In function ‘main’:
main.c:8:5: warning: array subscript 2 is outside array bounds of ‘int[2]’ [-Warray-bounds]
    8 |     printf("%d\n", *a);
      |     ^~~~~~~~~~~~~~~~~~
main.c:5:9: note: at offset 8 into object ‘array’ of size 8
    5 |     int array[2] = {0, 1};
      |         ^~~~~

No ale v tom původním přikladu žádný warning není a navíc to bez optimalizací spadne, ale s optimalizacemi dává "správný" výsledek. Záhada, že?  ;)

11
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 21:55:23 »
Toto je normální runtime podtečení, proč by to mělo dávat warning?
Protože to má dát tento warning, ale z nějakého důvodu nedá. Pokračuj v řešení kvízu, jsi na dobré cestě ;)
Kód: [Vybrat]
main.c: In function ‘main’:
main.c:10:5: warning: array subscript 4294967296 is outside array bounds of ‘int[2]’ [-Warray-bounds]

12
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 21:43:46 »
Další příklad "wishful programmingu". Proč máš i unsigned když chceš dělat signed aritmetiku a mít výsledek -1?
Ano, všichni víme, že ty bys žádnou podobnout chybu nikdy neudělal, ale kde je ten slibovaný warning, který měl být s -Wall vidět?

13
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 21:26:02 »
Večerní C kvíz. Proč se tento program chová tak divně a proč -Wall nic neřekne? Kdo to vyřeší, dostane odkaz do gcc bugzilly ;)
Kód: [Vybrat]
#include <stdio.h>

int main()
{
    static int array[2] = {0, 1};

    int *a = &array[1];
    unsigned i = 0;
    a += i - 1;
    printf("%d\n", *a);

    return 0;
}

Nejprve to přeložme a spusťme bez optimalizací:
Kód: [Vybrat]
gcc -Wall main.c -o test
./test
Neoprávněný přístup do paměti (SIGSEGV)

A teď s optimalizacemi:
Kód: [Vybrat]
gcc -O2 -Wall main.c -o test
./test
0

14
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 15:59:20 »
Jedine o cos mi rozsiril znalosti je ze C23 enforcuje dvojkovy doplnek. Za to diky. Zbytek bych spise rekl ze jsi mne nepochopil, nebo je taky mozne ze jsem se ve spechu nekde spatne vyjadril. Ale jinak o tve neustale utoky v diskuzi nestojim a muzes si je smerovat jinam, diky :-) Arrogant prick...
Hele, já na tebe neútočím. Měli jsme nejasnosti ohledně chování operátoru >> v C a vysvětlili jsme si, že je to implementation defined. Měli jsme nejasnosti ohledně reprezentace signed čísel v C23 a vysvětlili jsme si, že to musí být druhý doplněk. Což já považuji za skvělou příležitost redefinovat chování operátoru >> jako arithmetic shift, přesně jak se stalo v C++20. Standardizační komise C23 a ty tento názor bohužel nesdílí, nedá si nic dělat, budeme muset dál žít s implementation defined.

15
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 15:35:32 »
Heh naopak jsem mel dost zkusenosti na to, ze jsem si uvedomil ze to je implementation defined

Dovol, abych ti připomenul tohle:
C zachovava pri rotaci znamenko protoze rotace je provadena na znamenkovem typu, dela tedy tzv. aritmeticky bit shift.

Lol - uvedl me do praxe :D Ja mam v C embedded programovani praxi 17 let.
Tak je 17 let asi málo, ještě minulý týden jsi žil v domění, že je to arimetický shift a ne implementation defined. Jsem rád, že jsem ti pomohl rozšířit znalosti C. Není zač.

Stran: [1] 2 3 ... 8