Thanks David,

I couldn't have put it better :-)

As you can infer, I am in a different time zone so your emails tend to
come in after I have gone home for the day!

Regards
Luke

-----Original Message-----
From: David Brown [mailto:da...@westcontrol.com] 
Sent: Thursday, 23 January 2003 9:27 PM
To: mspgcc-users@lists.sourceforge.net
Subject: Re: [Mspgcc-users] Struct assignment BUG...

> Dear Garst,
>
> I can see that there are some friends in the list that had found a bug
from
> what Oleg has originally posted ( struct declararation and use ). I
would
> like to respectfully ask this friends what the bug is an which is the
> interesting code it generates, so I ( and probably someone else )
could
> learn something new. It is clear that I missed something. Can the
original
> Oleg's code work fine ? Why ? Thanks in advance.
>

The array v ( struct x *v[2] ) contains two elements, each of which is a
pointer to an "x" structure.  I think everyone is clear on that one.

The original code was:
    void swap(void)
     {
         struct x tmp;
          tmp=*v[0];
          *v[0]=*v[1];
          *v[1]=tmp;
     }

And the suggested change was:

    void swap(void)    {
        struct x *tmp;    /*  this declaraction should be struct x *tmp
,
and
                                not the variable tmp of type struct x
!!! */
         *tmp = *v[0];
         *v[0]= *v[1];
        *v[1]= *tmp;
     }

In the first case, tmp is declared to be a "struct x".  The structure
that
v[0] points to is copied into tmp.  Then the structure that v[1] points
to
is copied into the space that v[0] points to, and then the tmp structure
is
copied into the space that v[0] points to.

I think you were trying to suggest that the pointers should be swapped,
not
the structs they pointed to.  In that case, the code would have been:
        struct x *tmp;
        tmp = v[0]; v[0] = v[1]; v[1] = tmp;
Note that there are no longer dereferencers (the *'s).
The code you have given will do pretty much the same thing as the
original
code, except that the temporary area is accessed indirectly through a
pointer tmp, which is not initialised.  In other words, the code will
use a
random bit of memory somewhere (which may not physically exist) for the
scratch space, which is not what you want.  The compiler should give you
a
warning on that sort of thing (if not, add the -W and -Wall flags to
your
compiler flags).

mvh.

David



>
>
> > Will this work?
> >
> >  struct x{                /* struct of type x defined */
> >  int a,b,c,d;
> >  };
> >
> >  struct x *v[2];    /* array of 2 pointers to structures of type x -
> > somewhere initialized, OK ?*/
> >
> >  /* swap pointers, this means after call to swap(), v[0] holds the
> > pointer to v[1]   and viceversa */
> >  void swap(void)    {
> >  struct x *tmp;    /*  this declaraction should be struct x *tmp ,
and
> > not the variable tmp of type struct x !!! */
> >   *tmp = *v[0];
> >   *v[0]= *v[1];
> >   *v[1]= *tmp;
> >  }
> >
> > Garst
> > >
> > Luke Hoffmann wrote:
> > >
> > > Sorry, I'll repost this with HTML off ;-)
> > >
> > > Hi,
> > >
> > > I think Oleg has identified a real problem.
> > > Lets leave the question of "is this the best way to do it" aside
and
> realise that "this is the best way to reproduce the problem"!
> > >
> > > The swap() function is not swapping pointers it is swapping the
contents
> of structures.
> > > This is a valid operation and it produces some interesting code!
> > > Clearly the code attached is wrong.
> > >
> > > Regards
> > > Luke
> > >
> > >
> > > -----Original Message-----
> > > From: Roberto G. Berner [mailto:booleangene...@ciudad.com.ar]
> > > Sent: Thursday, 23 January 2003 4:36 AM
> > > To: mspgcc-users@lists.sourceforge.net
> > > Subject: RE: [Mspgcc-users] Struct assignment BUG...
> > >
> > > Dear Oleg:
> > >
> > > Accept my apologies, but I think you should check this. If I am
wrong,
> please excuse me.
> > >
> > >
> > > struct x{                /* struct of type x defined */
> > > int a,b,c,d;
> > > };
> > >
> > > struct x *v[2];    /* array of 2 pointers to structures of type x
-
> somewhere initialized, OK ?*/
> > >
> > > /* swap pointers, this means after call to swap(), v[0] holds the
> pointer to v[1] and viceversa */
> > > void swap(void)    {
> > > struct x tmp;    /*  this declaraction should be struct x *tmp ,
and
not
> the variable tmp of type struct x !!! */
> > >  tmp=*v[0];        /* tmp should be a pointer in order to hold
pointers
> properly */
> > >  *v[0]=*v[1];
> > >  *v[1]=tmp;
> > > }
> > >
> > > Kind regards,
> > >
> > > Roberto G. Berner
> > > booleangene...@ciudad.com.ar
> > > ven...@increible.homelinux.com
> > > 4308 3500 tel
> > > 4308 3700 fax
> > > 15 5122 6095 cel
> > > ----- Original Message -----
> > > From: Oleg Skydan
> > > To: mspgcc-users@lists.sourceforge.net
> > > Sent: Wednesday, January 22, 2003 4:27 PM
> > > Subject: Re: [Mspgcc-users] Struct assignment BUG...
> > >
> > > Dear Roberto,
> > >
> > > The swap function exchanges the contents of the two structs,
> > > pointed by elements of the array v, so there a significant BUG.
> > >
> > > I have omitted the initialization section for simplicity (I have
found
> this BUG in
> > > a real program, which is very large).
> > >
> > > Anyway the stack pointer should point to the same location at the
> function
> > > exit and entry (unless it is explicitly changed, using asm
statement
for
> example).
> > >
> > > Thanks,
> > > Oleg.
> > > ----- Original Message -----
> > > From: Roberto G. Berner
> > > To: mspgcc-users@lists.sourceforge.net
> > > Sent: Wednesday, January 22, 2003 6:25 PM
> > > Subject: RE: [Mspgcc-users] Struct assignment BUG...
> > >
> > > Dear Oleg:
> > >
> > > I think that there is no bug. Should I suggest trying ...
> > >
> > > struct x *tmp;
> > >
> > > Kind regards,
> > >
> > > Roberto G. Berner
> > > booleangene...@ciudad.com.ar
> > > ven...@increible.homelinux.com
> > > 4308 3500 tel
> > > 4308 3700 fax
> > > 15 5122 6095 cel
> > > ----- Original Message -----
> > > From: Oleg Skydan
> > > To: MSP430 GCC
> > > Sent: Wednesday, January 22, 2003 12:12 PM
> > > Subject: [Mspgcc-users] Struct assignment BUG...
> > >
> > > Hello, All !
> > >
> > > I found a significant BUG when using struct assignment.
> > >
> > > Here is the sample:
> > >
> > > struct x{
> > > int a,b,c,d;
> > > };
> > >
> > > struct x *v[2];
> > >
> > > void swap(void)
> > > {
> > > struct x tmp;
> > >  tmp=*v[0];
> > >  *v[0]=*v[1];
> > >  *v[1]=tmp;
> > > }
> > >
> > > And here is GCC's listing (with -O option):
> > >
> > > /***********************
> > >  * Function `swap'
> > >  ***********************/
> > > swap:
> > > /* prologue: frame size = 8 */
> > > .L__FrameSize_swap=0x8
> > > .L__FrameOffset_swap=0x8
> > >  sub #8, r1 ; 8, fpn 0
> > > /* prologue end (size=1) */
> > >  mov &v, r15
> > >  mov @r15+, @r1
> > >  mov @r15+, 2(r1)
> > >  mov @r15+, 4(r1)
> > >  mov @r15+, 6(r1)
> > >  mov &v+2, r14
> > >  mov @r14+, 0(r15)
> > >  mov @r14+, 2(r15)
> > >  mov @r14+, 4(r15)
> > >  mov @r14+, 6(r15)
> > >  mov &v+2, r15
> > >  mov @r1+, 0(r15)       ;We should not change the stack pointer
here !
> > >  mov @r1+, 2(r15)
> > >  mov @r1+, 4(r15)
> > >  mov @r1+, 6(r15)
> > > /* epilogue: frame size=8 */
> > >  add #8, r1                    ;After this command the stack
pointer
> points to the illegal location !
> > >  ret
> > > /* epilogue end (size=2) */
> > > /* function swap size 33 (30) */
> > >
> > > I use win32 version (from 10.12.2002).
> > > Thanks, Oleg.
> > >
> > >
> > >
> >
> >
> > -------------------------------------------------------
> > This SF.net email is sponsored by: Scholarships for Techies!
> > Can't afford IT training? All 2003 ictp students receive
scholarships.
> > Get hands-on training in Microsoft, Cisco, Sun, Linux/UNIX, and
more.
> > www.ictp.com/training/sourceforge.asp
> > _______________________________________________
> > Mspgcc-users mailing list
> > Mspgcc-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/mspgcc-users
> >
> >
>
>
>
> -------------------------------------------------------
> This SF.NET email is sponsored by:
> SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
> http://www.vasoftware.com
> _______________________________________________
> Mspgcc-users mailing list
> Mspgcc-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users
>
>




-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
_______________________________________________
Mspgcc-users mailing list
Mspgcc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mspgcc-users

____
This communication contains information which is confidential and the copyright 
of Nautronix. 

If you are not the intended recipient of this communication please delete and 
destroy all copies and advise Nautronix immediately. If you are the intended 
recipient of this communication you should not copy, disclose or distribute 
this communication without the prior authority of Nautronix. Any views 
expressed in this Communication are those of the individual sender, except 
where the sender specifically states them to be the views of Nautronix.

Except as required at law, Nautronix does not represent, warrant and/or 
guarantee that the integrity of this communication has been maintained nor that 
the communication is free of errors, virus, interception or interference.


Reply via email to