Newsgroup: it.comp.programmare.win32
Titolo: Const e memoria protetta

Volevo soddisfare questa curiosità.....
ho questo codice in console mode:
int const var=98;
aa=(int *)(&var);
*aa=4;
a questo punto mi da questo errore a runtime  "unhandle exception in
prog.exe :.........."
chiaramente un errore di protezione di memoria.............................
mi chiedo ma allora vengono allocati spazi dimemoria protetti ????
potreste chiarirmi le idee?? grazie

mi chiedo ma allora vengono allocati spazi dimemoria protetti ????
Puo' darsi.
La questione e' "implementation-dependant".
--
Andrea Laforgia (ICQ 87230455)
------------------------------ 
#exclude <windows.h>


andrea ma spiegati meglio cosě ti sei capito solo tu :))

volevo perfezionare il codice infatti l acosa mi succede se dichiaro la
variabile al di fuori del main
int const var=98;
int main(){
 aa=(int *)(&var);
 *aa=4;
}


Si tratta a mio parere di un  baco!  L'area puntata da una const non puo'
essere modificata. Il compilatore doveva riconosce l'errore e segnalarlo.
Ti faccio un esempio straclassico per semplificarti il discorso:
const char *a= "Ciao";  // oggetto puntato COSTANTE ma non il puntatore!
a[0] = "Z";             // errore!
a = "Tanti saluti"      // consentito
char *const a = "Ciao"; // puntatore COSTANTE ma non oggetto puntato!
a[2] = "Z";             // consentito.
a = "Tanti saluti"      // errore!
Nel tuo caso dichiarando la variabile aa come oggetto costante il
compilatore riserva l'area di memoria come di sola lettura (ROM).
L'accesso in scrittura da come risultato l'eccezione. Forzando il
cast non ti resta che usare una gestione delle anomalie. Come segue :
#include <iostream.h>
const int a =3;
int *b;
int main()
{
 b=(int *)(&a);
 try {
  *b=4;
 }
 catch (...) {
  cout << "exception handled";
 }
 return 0;
}
..ma la cosa carina e' che se le variabili vengono dichiarate a livello
locale NON viene generata alcuna eccezione e il contenuto della costante
viene cambiata (ARGH!!!!)...
#include <iostream.h>
int main()
{
 const int a=3;
 int *b;
 b=(int *)(&a);
 try {
  *b=4;
 }
 catch (...) {
  cout << "exception handled";
 }
 return 0;
}
Visual C++ a colpito ancora....
Ciao.
Il Michett@
--


non credo sia un bug anche perchè se una variabile è dichiarata const
dovrebbe restare const
comunque rimando il codice completo
(codice provato in VC6)
int const var=50;
int main(){
 int *noconst;
 noconst=(int *)(&var);
 *noconst=20; //tento di assegnare un nuovo valore
//qui c'è l'errore che mi fa pensare alla famosa memoria di sola lettura
 return 0 ;
}
visto che sicuramente ne sai più di me spero saprai dirmi qualcosa di più

 prog.exe :.........."
Evidentemente il tuo compilatore non mette le costanti in .data, bensi`
in una sezione read-only.
---
Bye! Lorenzo Lutti
http://www.geocities.com/SiliconValley/Peaks/6258/


(il compilatore č VC6)
infatti questo era evidente ma mi chiedevo....
questo č possibile in win32 cioč allocare  memoria rom (solo lettura)???
se č possibile come si fa?? :)))

 (solo lettura)???
Intendi a runtime o direttamente come sezione dentro a un eseguibile?
Nel primo caso basta usare VirtualProtect() o VirtualProtectEx(); nel
secondo caso, col Visual C++ puoi usare #pragma const_seg.


andrea ma spiegati meglio cosě ti sei capito solo tu :))
implementation-dependant = dipendente dalla implementazione
risposta : DIPENDE dal sistema e dal compilatore.


essere modificata. Il compilatore doveva riconosce l'errore e segnalarlo.
Il compilatore al limite segnala un warning che ti avvisa del fatto
che lo specificatore "const" non ha piu' valore, ma non ti impedisce
di fare un'operazione del genere.


infatti non credo che lo stack si possa definire di sola lettura.
Gia' ma non mi funziona nemmeno il #pragma const_seg("MY_COST_DATA") che
dovrebbe garantire l'allocazione in area protetta delle costanti...boh!
Ciao.
Il Michett@
--

Un grazie a tutti qualcosa di piů ho capito :)))