Newsgroup: it.comp.lang.c++
Titolo: Buffer overflow c/c++

Buongiorno a tutti,
vorrei chiedervi come individuare negli array del C/C++ il buffer
overflow.
Per esempio:
char c[8];
int x[5][6][10];
int jj;
c[20] = 'z';
x[4][7][4] = 11;
jj = 5 + rand();
x[4][jj][4] = 11;
Esiste un metodo o un programma, compilatore per effettuare tale
controllo facilmente.
    Grazie

 overflow.
Prima di usare il valore devi controllare che non abbia superato il limite 
massimo.
char c[8];
int x[5][6][10];
int jj;
int i = 20;
if (i >= 0 && i < 8)
    c[20] = 'z';
else
    std::cout << "Indice fuori dall'intervallo" << std::endl;
E cosi via. 


Non c'è. Se vuoi un "controllo" del genere usa std::vector assieme
agli iteratori, e non gli array in stile C.
Puoi anche usare GCC ProPolice per aiutarti se hai esigenze di
sicurezza: usa g++ con l'opzione -fstack-protector-all.
Tuttavia, alla fine deve essere il programmatore a stare un po'
attento. È il beneficio e la dannazione assieme di linguaggi come C e C
++, che lavorano più vicini alla macchina rispetto a Java, per
esempio, e danno la possibilità di metter mano direttamente alla
memoria.
Ps. mi pare che dal 2003 anche MSVC abbia la protezione dello stack
con l'opzione /GS.
Matteo

 Ps. mi pare che dal 2003 anche MSVC abbia la protezione dello stack
ma anche questa è in qualche modo più aspecifica che non la 
protezione di un dato oggetto buffer, e il rallentamento si 
ripercuote indiscriminatamente su ogni parte del codice ... 
O intuisco male ?



No, è perfettamente vero. D'altro canto, anche altri linguaggi come
Java e compagni impiegano astrazioni e controlli runtime.
I canarini non sono particolarmente costosi, per fortuna, ma nemmeno
gratuiti.
Ciao,
Matteo

Vi ringrazio,
ma rischia di diventare molto costoso in termini di codice.
E poi il C standard non offre strutture particolari in merito.
Mi chiedevo se non ci fosse un sistema più celere. Come ho detto, un
tool.
    Grazie


 controllo facilmente.
Vorresti un tool per controllare staticamente il tuo codice sorgente? 
Oppure vuoi fare i controlli in runtime, come ti hanno suggerito negli 
altri messaggi?
E.


Possibilmente in fase di run-time.
Per esempio se ho:
int x[10][10][10];
int ii;
...
ii = rand();
...
x[0][ii][5] = 7;
Solo in fase di run-time mi potrò sapere se vi è un baco (l'esempio è
assurdo, ma ii potrebbe assumere qualsiasi valore.)
   Grazie

ah ... considerazione a latere : non c'era bisogno, ma ho 
provato a compilare lo stesso un operator [] statico e 
globale -> sberleffi del GCC, che mi informa che tale 
operatore non può essere di tipo static e non-member.
Pietra tombale sull'overload di questo operatore sui tipi 
built-in
ciao
Soviet
luca_c ha scritto:


 Possibilmente in fase di run-time.
Allora la cosa � abbastanza facile. Sostituisci gli array del C con i 
vector<> del C++ e sostituisci l'operatore[] con la funzione membro at().
Oppure ti definisci le tue classi con il tuo overload dell'operator[], 
come ti hanno suggerito gli altri. In quest'ultimo caso una soluzione 
molto efficiente � quella di mettere i controlli sono nella versione 
DEBUG del tuo codice, e di toglierli nella versione RELEASE.
E.

luca_c ha scritto:

Ci sono degli strumenti commerciali, come:
http://en.wikipedia.org/wiki/BoundsChecker
Non conosco strumenti free in grado di fare cio' che chiedi su array 
predefiniti.
-- 
Carlo Milanesi
http://digilander.libero.it/carlmila

 globale (fuori da una classe/struct) non ce l'hai...
No, per quella cosa li non puoi farlo. Oltretutto visto che gli array
non memorizzano la loro dimensione, diventerebbe problematico fare la
faccenda. O forse non ho capito cosa intendi.
-- 
-riko

 tool.
Ni. Sto scrivendo un oggetto che fa esattamente quello che vuoi (ovvero
prova ad individuare staticamente tutti gli accessi invalidi). Purtroppo
prima devono finirmi un aggeggio che faccia pointer-aliasing analysis su
heap.
*E* devo trovare il tempo per proseguire...
-- 
-riko

 > Mi chiedevo se non ci fosse un sistema più celere. Come ho detto, un
