Newsgroup: it.comp.programmare.win32
Titolo: Assertion Failed con VS C++ 2008

Sto eseguendo il porting di una piccola applicazione win32 console da 
Visual C++6.0 a Visual Studio 2008 Beta, per cercare di convincere il 
boss ad aprire il portafoglio.
La compilazione non ha richiesto grossi maneggi del codice; se si 
escludono un centinaio di warning relativi alle cose più disparate, ma 
ininfluenti, al momento del debug il tutto si pianta con una 'Assertion 
Failed: string iterator not dereferencable' sulla riga evidenziata. 
Ovviamente in VC++6 il debug fila via senza problemi.
string sBuf = buffer;
string::iterator k;
k = sBuf.begin();
while ((*k == ' ')&&(k != sBuf.end()))
{
	k = sBuf.erase(k);
}
k = sBuf.end();
while ((*k == ' ')&&(k != sBuf.end()))	// Riga che genera l'errore
{
	k = sBuf.erase(k);
}
Qualcuno ha un'idea sul perché? Analizzando l'assert contenuto in xstring:
if (this->_Mycont == 0 || _Myptr == 0 || _Myptr < ((_Mystring 
*)this->_Mycont)->_Myptr() || ((_Mystring *)this->_Mycont)->_Myptr() + 
((_Mystring *)this->_Mycont)->_Mysize <= _Myptr)
{
	_DEBUG_ERROR("string iterator not dereferencable");
	_SCL_SECURE_OUT_OF_RANGE;
}
__analysis_assume(_Myptr != 0);
sembra che il problema sia "this->_Mycont == 0" che è true, dato che in 
quel momento k è appunto a fine stringa.
Scrivendo:
while ((k != sBuf.end())&&(*k == ' '))
il problema non si manifesta.
Poiché di cose come questa ne ho alcune decine in altrettanti progetti, 
vorrei evitare di dover mettere mano a troppe righe.
Vi sembra corretto l'approccio di VS2008 o conviene segnalare la cosa a 
Microsoft?
Andrea

 while ((*k == ' ')&&(k != sBuf.end()))
Il vostro codice è disastroso.
Va potenzialmente in crash se il buffer è vuoto e potenzialmente va 
sempre in crash con l'istruzione sintentizzabile in *(string::end())
string sBuf(buffer);
while(sBuf.empty() == false)
{
  if(' ' == *(sBuf.begin()))
    sBuf.erase(0,1);
  else
    break;
}
while(sBuf.empty() == false)
{
  if(' ' == *(sBuf.rbegin()))
    sBuf.erase(sBuf.length()-1,1);
  else
    break;
}
string::reverse_iterator z;
z = sBuf.rbegin();
while( (k != sBuf.rend()) && (*k == ' ') )
    k = sBuf.erase(k);

Oltre a quanto dice Davide, che condivido, è importante ricordare che le 
differenze tra VC6 e 2008 sono abissali.
VC6 non era standard ISO (standard che risale al 1998 e di conseguenza era 
ovviamente impossibile)
Adesso siamo alle soglie della standardizzazione ISO C++0x e questo fa 
capire quanto il compilatore nuovo sia importante.
VC2008 è compliant allo standard quasi al 100% (i pochi punti che non lo 
sono, è una esplicita scelta Microsoft la cui discussione sarebbe lunga per 
un post qui)
Altre buone motivazioni (solo le prime di una lunghissima serie) per 
VC++2008:
- /GS che evita i buffer overrun
- supporto per ASLR che evita attacchi rimappando in Vista randomicamente le 
dll in memoria
- guadagno fino al 20% di performance in più rispetto a VC6
- supporto delle nuove STL e 
STL.NET
- supporto per la profile guided optimization
- supporto per OpenMP per parallelizzare in modo automatico pezzi di codice
- supporto per codice misto managed/unmanaged con C++/CLI
- scrivere template degni di questo nome
e questo è realmente solo l'inizio
-- 
Raffaele Rialdi
Microsoft .NET MVP 
http://mvp.support.microsoft.com
 -
http://italy.mvps.org
 UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org
 Weblog: 
http://blogs.ugidotnet.org/raffaele
 

 VC2008 è compliant allo standard quasi al 100%
Il che è già tanto, comunque, visto che lo standard ISO del C++ non è mai
stato applicato capillarmente da nessun compilatore (credo che il più
compliant sia il Comeau). Credo, poi, che l'assorbimento in Microsoft di
persone del calibro di Herb Sutter e Stanley Lippman abbia dato i suoi
frutti. Mi sembra che Microsoft stia facendo un bel lavoro. Ultimamente
sto puntando molto su .NET.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it