tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] core dump because stack overwritten


From: Michael Matz
Subject: Re: [Tinycc-devel] core dump because stack overwritten
Date: Thu, 24 Oct 2019 13:10:20 +0000 (UTC)
User-agent: Alpine 2.21 (LSU 202 2017-01-01)

Hi,

On Wed, 23 Oct 2019, Christian Jullien wrote:

> I'm not an official maintainer but as long is fixes a bug (with 
> associated test) and does break anything else, I would say yes (to push 
> on mod). If you do, please add the other test given by Pursuer.

So, the patch from Pursuer that's now in mob is correct in the sense that 
is fixes the root cause.  The initial patch from Herman (changing 
save_reg_upstack) would have fixed the symptom but would have introduced 
other bugs: e.g. it would then have done the wrong thing for real 128bit 
returns like

struct S {long a,b;};
extern struct S rets(void);
long bla(void)
{
  struct S s = rets();
  return s.a + s.b;
}

So, all is well now in mob :)  Thanks Herman and Pursuer.


Ciao,
Michael.

> 
> C.
> 
> -----Original Message-----
> From: Tinycc-devel [mailto:tinycc-devel-bounces+eligis=address@hidden] On 
> Behalf Of Herman ten Brugge via Tinycc-devel
> Sent: Wednesday, October 23, 2019 17:26
> To: address@hidden; address@hidden
> Cc: Herman ten Brugge
> Subject: Re: [Tinycc-devel] core dump because stack overwritten
> 
> I looked at the website and see that -DTCC_TARGET_PE is used to compile 
> gcc on windows.
> This uses 'tccpe.c' and not 'x86_64-gen.c x86_64-link.c i386-asm.c 
> x86_64-asm.h'.
> I compiled the code with the x86_64-w64-mingw32-gcc compile on linux and 
> see different code with tccpe.c.
> So I still believe my patch is correct. The other targets never touch 
> this code. So only x86_64 is using this.
> Can I apply this patch? Or is there some one else who can confirm that 
> this is the correct or not.
> 
>      Herman
> 
> On 2019-10-23 15:53, Christian Jullien wrote:
> > Yes, it's fixed now. Thanks.
> >
> > There are different ways to build tcc for Windows.
> > I personally wrote and maintain https://sourceforge.net/projects/wintcc/
> >
> > Which makes a reproducible native build on Windows with both 32/64 backend.
> >
> > It requires Cygwin only for first step bootstrap with gcc.
> >
> > C.
> >
> > -----Original Message-----
> > From: Tinycc-devel [mailto:tinycc-devel-bounces+eligis=address@hidden] On 
> > Behalf Of Herman ten Brugge via Tinycc-devel
> > Sent: Wednesday, October 23, 2019 13:20
> > To: address@hidden; address@hidden
> > Cc: Herman ten Brugge
> > Subject: Re: [Tinycc-devel] core dump because stack overwritten
> >
> > I updated the Makefile. I hope it now works on all targets.
> > How do I test the Windows port. I do not have any compilers installed. I
> > use linux 99.999% of the time.
> >
> >       Herman
> >
> > On 2019-10-23 11:50, Christian Jullien wrote:
> >> Again I've no idea of the best patch to apply, but two remarks:
> >>
> >> * First, 106_pthread.c fails on Windows because of:
> >> Test: 106_pthread...
> >> --- 106_pthread.expect  2019-10-22 20:47:55.982574300 +0200
> >> +++ 106_pthread.output  2019-10-23 11:40:46.742218000 +0200
> >> @@ -1 +1,2 @@
> >> -ok
> >> +In file included from 106_pthread.c:2:
> >> +106_pthread.c:2: error: include file 'pthread.h' not found
> >> You should run this test only on Linux systems
> >>
> >> * Your new patch test TCC_TARGET_X86_64, how do you explain that with or 
> >> without this patch your test case looks to work on Windows x64 and 
> >> produces "42 42"?
> >>
> >>
> >> -----Original Message-----
> >> From: Tinycc-devel [mailto:tinycc-devel-bounces+eligis=address@hidden] On 
> >> Behalf Of Herman ten Brugge via Tinycc-devel
> >> Sent: Wednesday, October 23, 2019 11:23
> >> To: address@hidden; address@hidden
> >> Cc: Herman ten Brugge
> >> Subject: Re: [Tinycc-devel] core dump because stack overwritten
> >>
> >> How about this patch:
> >>
> >> --------------------------
> >> --- a/tccgen.c        2019-10-22 19:52:48.761977245 +0200
> >> +++ b/tccgen.c  2019-10-23 11:18:14.871290060 +0200
> >> @@ -2627,7 +2627,9 @@ static void gen_cvt_ftoi1(int t)
> >>             gfunc_call(1);
> >>             vpushi(0);
> >>             vtop->r = REG_IRET;
> >> +#if !defined(TCC_TARGET_X86_64) /* REG_LRET only for VT_QLONG */
> >>             vtop->r2 = REG_LRET;
> >> +#endif
> >>         } else {
> >>             gen_cvt_ftoi(t);
> >>         }
> >> --------------------------
> >> According to https://en.wikipedia.org/wiki/X86_calling_conventions the
> >> x86_64 only uses rax for 64 bits returns.
> >>
> >>        Herman
> >>
> >>
> >> On 2019-10-23 07:20, Christian Jullien wrote:
> >>> I confirm your test case fails on Linux x64. It looks your patch pay 
> >>> attention to PTR_SIZE == 4 (i.e. it now enters if only with 32bit 
> >>> processor).
> >>> However, w.o. the patch I can't reproduce the core dump on aarch64 Linux 
> >>> nor with Windows x64 which are also a 64bit processors. They both 
> >>> correctly display "42 42"
> >>> No core dumps does not mean it works, memory may be corrupted somewhere 
> >>> else.
> >>>
> >>> Either your patch is only required for Linux x64 or there is something to 
> >>> investigate more carefully.
> >>>
> >>> I can only test on different platforms but I'm unable to give you further 
> >>> advices.
> >>>
> >>> M2c
> >>>
> >>> C.
> >>>
> >>> -----Original Message-----
> >>> From: Tinycc-devel [mailto:tinycc-devel-bounces+eligis=address@hidden] On 
> >>> Behalf Of Herman ten Brugge via Tinycc-devel
> >>> Sent: Tuesday, October 22, 2019 22:15
> >>> To: address@hidden
> >>> Cc: Herman ten Brugge
> >>> Subject: [Tinycc-devel] core dump because stack overwritten
> >>>
> >>> I have a small testcase:
> >>>
> >>> --------------
> >>> #include <stdio.h>
> >>> #include <stdlib.h>
> >>> #include <inttypes.h>
> >>>
> >>> int
> >>> main(void)
> >>> {
> >>>       struct tst_struct { uint64_t cnt; } *tst =
> >>>         (struct tst_struct *) malloc (sizeof (struct tst_struct));
> >>>
> >>>       tst->cnt = 42;
> >>>       printf ("%" PRIu64 " %" PRIu64 "\n", tst->cnt, (uint64_t) (tst->cnt 
> >>> /
> >>> 1.0));
> >>>       return 0;
> >>> }
> >>> ----------------
> >>> when I compile this with tcc and run it I get a core dump. The problem
> >>> is that the stack is overwritten.
> >>> I have a fix.
> >>>
> >>> ------------------------
> >>> --- a/tccgen.c  2019-10-22 19:52:48.761977245 +0200
> >>> +++ b/tccgen.c  2019-10-22 22:08:08.465825842 +0200
> >>> @@ -1203,7 +1203,7 @@ ST_FUNC void save_reg_upstack(int r, int
> >>>                      }
> >>>      #endif
> >>>                      /* special long long case */
> >>> -                if ((p->r2 & VT_VALMASK) < VT_CONST) {
> >>> +                if (PTR_SIZE == 4 && (p->r2 & VT_VALMASK) < VT_CONST) {
> >>>                          sv.c.i += PTR_SIZE;
> >>>                          store(p->r2, &sv);
> >>>                      }
> >>> ---------------------
> >>> But am not sure if this is the correct fix. The code generator is quite
> >>> complex.
> >>>
> >>>         Herman
> >>>
> >>>
> >>> _______________________________________________
> >>> Tinycc-devel mailing list
> >>> address@hidden
> >>> https://lists.nongnu.org/mailman/listinfo/tinycc-devel
> >>>
> >> _______________________________________________
> >> Tinycc-devel mailing list
> >> address@hidden
> >> https://lists.nongnu.org/mailman/listinfo/tinycc-devel
> >>
> >
> > _______________________________________________
> > Tinycc-devel mailing list
> > address@hidden
> > https://lists.nongnu.org/mailman/listinfo/tinycc-devel
> >
> 
> 
> _______________________________________________
> Tinycc-devel mailing list
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/tinycc-devel
> 
> 
> _______________________________________________
> Tinycc-devel mailing list
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/tinycc-devel
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]