Jarmo Paavilainen wrote:
> 
> Hi,
> 
> Wrong forum but Im a newbie in Linux and this is a Linux compiler problem
> (works on Watcom C++ 11/ MS VC++ 6.0). If someone knows a better place let
> me know.

linux-gcc is the correct list for such problems.
I can't see anything wrong in this code, but more info may help. Is
'pek' destroyed at the first iteration, or is it destroyed after the
first ? Also, this code assumes that tList.Append makes a new copy of
the object it is appending, is it so?

> 
> The code looks something like this:
> 
> ///////////////////////////////////////
> //
>         const char *pek;
>         for( loopIP = IPList.GetFirstNode(); loopIP; loopIP = loopIP->GetNext())
>         {
>                 if( bMajor ) pek = strrchr( loopIP->GetHolder().strDNS, '.' );
>                 else pek = strchr( loopIP->GetHolder().strDNS, '.' );
>                 if( !pek ) pek = " <N/A> ";
> 
> fprintf( stderr, "1) pek = \"%s\"\n", pek ); // ** Still ok here **
> 
>                 for( loopDNS = tList.GetFirstNode(); loopDNS; loopDNS =
> loopDNS->GetNext())
>                 {
>                         if( strcmp( pek, loopDNS->GetHolder().strDNS ) == 0 ) break;
>                         else fprintf( stderr, "2) pek = \"%s\"\n", pek ); // ** NOT 
>here **
>                 }
> 
> fprintf( stderr, "3) pek = \"%s\"\n", pek ); // If point 2 was executed then
> pek is fucked up here
> 
>                 if( loopDNS ) loopDNS->GetPointer()->iCount += 
>loopIP->GetHolder().iCount;
>                 else
>                 {
>                         sDNS sTemp;
>                         if( strlen( pek ) < sizeof( sTemp.strDNS ) - 1)
>                         {
> fprintf( stderr, "4) pek = \"%s\"\n", pek ); // If point 2 was executed then
> pek is still bad
>                                 strcpy( sTemp.strDNS, pek );
>                                 sTemp.iCount = loopIP->GetHolder().iCount;
>                                 tList.Append( sTemp );
> fprintf( stderr, "5) pek = \"%s\"\n", pek ); // Pek is the same here as it
> was at point 1, but the bad data is allready copied to sTemp.strDNS
>                         }
>                         else fprintf( stderr, "** ERROR ** Overflow detected." );
>                 }
>         }
> 
> //
> ///////////////////////////////////////
> 
> It seems that "pek" is moved by strcmp(...) to point at bogus data if the
> strings are not the same. But after a few commands the compiler restores the
> value. Maybe strcmp(...) does not restore all registers at exit. And after a
> while the compiler desides to restore them instead.
> 
> Or Im I doing something wrong?
> 
> // Jarmo

Reply via email to