alaptípusát állandó változás - verem túlcsordulás az orosz

Szeretném megérteni, hogy a C ++ kezeli alaptípusa állandók.

Mi történik, ha használja a táncokat tambura és a mutatók az érték módosításához a memória cella, amely elméletileg, és állandó értéken kell tartani?

Én a következő kódot:

Következtetés kapom a következő:

Hogyan magyarázza ezt a viselkedést?

Nem fogom, hogy ilyen kód nem lesznek felhasználva a gyakorlatban, csak azt akarom, hogy megértsék, ahol a konstansok vannak tárolva.

Kezdetnek, a szabvány szerint, a változás segítségével trükköket állandó mutató van definiált működést. Ez megtörténhet, bármi bármikor a programban.

Még rosszabb, ha valahol a fordító rájöttek maguknak, hogy az állandó egyenletes, és legkevésbé szignifikáns bit értéke 0, és a fenti információk alapján, ki tudja küszöbölni, ellenőrzésében a kódot, most ellenőrizni nem ad át, és a kódot is kreshnutsya bármikor .

UB általában alapú biztonsági lyukak programokat. Például, ha a fordító indokoltan feltételezhető, hogy a vonal hossza 45, és ez alatt elég puffert kiosztani hossza, amíg csal fordító lökettávolság ő vonal hossza 54, kapott egy klasszikus verem bontásban.

Összegzés: A fordítóprogram nem „kötelezettség” vagy „elvek” dolgozni állandók. Joga van, hogy semmit. Éppen ellenkezőleg, ez a programozó, ha megígérte, hogy az érték állandó, nincs joga megváltoztatni.

A szabvány szerint a C ++ (7.1.6.1 A CV-selejtező)

4 Kivéve, hogy minden tanulót bejelentett változékony (7.1.1) nem lehet módosítani, minden olyan kísérletet, hogy módosítsa a const objektum élettartama során (3.8) eredménye definiálatlan viselkedés

Van egy anakronizmus C, még egy kísérlet, hogy változtatni nem const objektum eredménye definiálatlan program viselkedésének. Beszélünk sztring literálok C.

A C ++, string literálok van típus állandó karakter tömbök. Például egy szövegkonstans „Hello” típus const char [6]. Azonban a C sztring literálok nem const típusú karakter tömbök. Ezért ugyanazt szövegkonstans „Szia” C egy char [6]. Azonban, ha nem tudja megváltoztatni a szövegkonstans C, úgy is, mint nem tudja megváltoztatni a szövegkonstans C ++.

-C (6.4.5 sztring literálok) szabvány

7 Ez meghatározhatatlan, hogy ezek a tömbök különböznek, feltéve, hogy elemek a megfelelő értékeket. Ha a program megpróbálja módosítani egy ilyen sorozata, a viselkedés nem definiált.

Az a tény, hogy a C sztring literálok nem const típusú karakter tömbök, nyilván a támogatásnak köszönhetően a meglévő kód alapja idején bevezetése a selejtező const a köznyelv C.

A fordító okos és tudja, hogy a konstans zainlaynit. De lehetséges, hogy meggyőzze őt, hogy ez az állandó nem nagyon állandó:

PS: Ha jól emlékszem, az illékony const helyzet javítása, amelyek nem vezetnek a definiált működést.

ő minden joga megvan azt hinni, hogy a kód nem éppen változik a const-objektumokat.

Illékony nem számít. Képzeljük el, hogy van valami külső, hogy „véletlenül” változott ugyanaz a konstans azonos értékeket írtunk. És a program helyett a módosító kódot a nop'y. Ez a változat tökéletesen pontos, és nem okoz UB.

Kapcsolódó cikkek