Re: Jádro pudla (Cernobily svet) :-)

Pavel Hudecek phudecek@tiscali.cz
Sobota Březen 4 12:39:57 CET 2006


Aby C mohlo fungovat bez překrývání segmentů:

1. (minimalistická) možnost:
Ukazatel bude opravdový ukazatel, tedy segment a offset, nikoli jen offset,
offsetová část nemůže být int, ale unsigned int.
Zároveň ale při použití na platformách bez segmentů musí překladač
stejný program přeložit klasicky:-)

2. rozšíření:
normu bychom dále měli obohatit o několik klíčových slov:

data, stack, segment

int a;
data int b;
stack int c;
const int d;
segment 0 int e[1000000];
data int *f;
segment 1 int g[123456];
segment 1 int h[654321];
...
- a leží v implicitním segmentu (je-li globální, pak v datech, lokální v zásobníku)
- b je v datovém segmentu
- c je v zásobníku
- d je v programu a nelze do něj zapisovat
- e má vytvořen vlastní segment, takže nelze překročit meze pole a přesto není kvůli
kontrole potřeba vykonat jedinou instrukci navíc. Meze ovšem nemusejí končit
hned na požadované hranici pole, některé platformy mají délku segmentu zarovnánu třeba
na 4 kB - ostatně třeba x86 to má dle okolností - do asi 1 MB lze limitovat po bajtech,
nad po 4 kB, zásobník téměř vždy po 4 kB (protože limit je 4 GB-velikost).
- f je ukazatel do dat
- g a h mají společný segment, takže můžou vzájemně přetéct, ale neutečou jinam
(segmentů nemůže být nekonečně mnoho, takže něco takového je nutné)
...

k malloc a dalším jsou potřeba i funkce pro vytváření a změnu velikosti segmentů

a ještě chybí pár dalších věcí, na které si momentálně nemůžu vzpomenout, ale když
jsem to asi před rokem dlouze promýšlel, byly taky nutné.

Zapínatelné to nejde, prostě by to vždy používaly všechny překladače
pro platformy se segmenty a nepoužívaly překladače pro ostatní
(samozřejmě při stejné syntaxi v obou případech).

Poznámka: Na C se mi líbí právě ta svoboda, že si člověk může kód napsat jak chce
(pokud to umí) a neomezují ho šílené kontroly všeho možného i nemožného
a že zákaldní programové struktury se tvoří jednoduchými znaky a tak se mezi
nimi neztrácí skutečný program a že se vejde více užitečného kódu na jednu
obrazovku (zapomnětlivému člověku to velmi zvyšuje přehlednost).
Taktéž je velmi užitečné, že výsledkem logických operací je číslo (za boolean
bych střílel:-) ), které můžu klidně sečíst s nějakými dalšími a pak z něj vypočítat
třeba sinus:-). pokud program počítá něco fyzikálně zajímavějšího, přehlednost
velmi zvýší rozlišování velkých a malých písmen (chybí mi už jen řecká abeceda).
Chybí mi ještě nějaký obecný ukazatel, který by adresoval cokoli a to po bajtech.

if ((a>0) + (b<5) + (c==4) + (++x!=y--) + (!(z%10)) + (A[y]==4) >= 3)
   printf ("byly splněny alespoň 3 podmínky");

PH

From: "Ales Prochaska" <prochaska@alsoft.cz>
> Jenže překladač lze napsat tak, aby systémy ochrany paměti využíval.
> Stačilo by aby se někdo zamyslel hlavou a udělal dejme tomu překladač,
> který bude možné přepnout do nějakého módu "safe C++" (když už teda né
> tu Adu nebo nějaký lepší jazyk), což bude céčko s nepatrně pozměněnou
> syntaxí, beztak převážně v místech do kterých rozumně uvažující
> programátor raději nikdy nezabloudí :-)

>> Jak to funguje doopravdy:
>>
>> Základem je tzv. flat model, kdy segment programu, dat i zásobníku se překrývají po celé délce.
>> Program sice nemůže k cizím datům, ale sám sebe přepsat může a může taky jakákoli svá data
>> spustit jako program...
>>
>> Co to má společného s ANSI C?
>>
>> Pointery neobsahují segmentovou část adresy, takže C lze používat jen s flat modelem.
>> Zásobník nelze smysluplně limitovat, protože má-li být limit nad 2 GB (opakuji, limit zásobníku
>> určuje nejnižší povolenou adresu), budou pointery do něj odkazující záporné:-) 




Další informace o konferenci Hw-list