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.