[FFmpeg-devel] [PATCH] mxfdec: make it work with other calling conventions

Reimar Döffinger Reimar.Doeffinger
Thu Jul 1 08:18:36 CEST 2010


On Wed, Jun 30, 2010 at 05:05:14PM -0700, Baptiste Coudurier wrote:
> On 06/30/2010 04:50 PM, Reimar D?ffinger wrote:
> >On Wed, Jun 30, 2010 at 04:20:50PM -0700, Baptiste Coudurier wrote:
> >>On 06/30/2010 04:06 PM, Reimar D?ffinger wrote:
> >>>On Wed, Jun 30, 2010 at 02:49:55PM -0700, Baptiste Coudurier wrote:
> >>>>>>But that's more an explanation of
> >>>>>>why there isn't any prototype for the read() function.
> >>>>>
> >>>>>I expected that is because pointers to functions with a different
> >>>>>number of arguments were stored there, but that is more of an argument
> >>>>>_for_ making it an error, since this allowed the fact that the
> >>>>>code would crash with stdcall and all other calle-restores-stack calling
> >>>>>conventions to go by unnoticed, without even a warning.
> >>>>
> >>>>All the functions are called with the same number of arguments.
> >>>
> >>>That's completely irrelevant, they are called with a different number
> >>>of arguments than the number of arguments they are declared with!
> >>
> >>In any case, the compiler has to fail in this case, because
> >>vararg/undefined prototype cannot work and stdcall requires a
> >>function prototype.
> >
> >What? Whatever gave you that idea?
> >Microsoft all those years has never noticed that none of their sofware
> >can even compile?
> 
> http://msdn.microsoft.com/en-us/library/zxk0tw93(VS.71).aspx
> 
> The __stdcall calling convention is used to call Win32 API
> functions. The callee cleans the stack, so the compiler makes vararg
> functions __cdecl. Functions that use this calling convention
> require a function prototype.

Well, they never bothered to implement varargs for stdcall, though
it wouldn't be impossible.
But I have no idea what they are talking about with the prototype.
I expect they mean at the point where the function is defined,
certainly not where it is used.
Simple test-case with mingw gcc:
id __stdcall test2();

int __stdcall test(int a)
{
    test2(0);
    test2(0ULL);
    return 1;
}

gcc happily generates code that is guaranteed to crash:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 18                sub    $0x18,%esp
   6:   c7 04 24 00 00 00 00    movl   $0x0,(%esp)
   d:   e8 00 00 00 00          call   12 <_test at 4+0x12>
  12:   52                      push   %edx
  13:   c7 04 24 00 00 00 00    movl   $0x0,(%esp)
  1a:   c7 44 24 04 00 00 00    movl   $0x0,0x4(%esp)
  21:   00 
  22:   e8 00 00 00 00          call   27 <_test at 4+0x27>
  27:   50                      push   %eax
  28:   50                      push   %eax
  29:   b8 01 00 00 00          mov    $0x1,%eax
  2e:   c9                      leave  
  2f:   c2 04 00                ret    $0x4

(interesting how it does not use push to store the
arguments but instead uses it to un-cleanup the stack...
I'm almost speechless).



More information about the ffmpeg-devel mailing list