[superh-gnu-discuss] mplayer argument parsing segfault with 4.4-45

Bill Traynor wmat at naoi.ca
Mon Jan 4 20:56:44 UTC 2010


On Tue, Dec 29, 2009 at 11:21, Mark Mitchell <mark at codesourcery.com> wrote:

> Magnus Damm wrote:
>
> > The mplayer source is fairly large so I suspect that the issue needs
> > to be tracked down further. Do you have any pointer to a more fine
> > grained step by step document that can be followed to produce these
> > things for you? I'm quite busy though so I'm afraid I'll just add this
> > to my TODO list for now.
>
> The first technique is to mix object files between the good and bad
> builds.  Build the whole thing with both compilers, but then link half
> of the object files from the good build with the other half from the bad
> build.  Continue to bisect things until you have a bad object file.  If
> you're lucky, that's a small object file with just one or two functions
> in it, and it will be obvious what's been miscompiled -- or what's buggy
>  in the source code.
>
>
This was posted to mplayer-dev-eng.  I'm posting here to complete the
thread.  This is not a compiler bug, but a mplayer bug.  Matt Fleming and I
figured this out, here's the explanation and patch authored by Matt:

Attached is a patch that changes the snippet of code that tests for the
presence of vsscanf() during configure.

The current test assumes that the type of va_list (as defined by the ABI
of the target we're compiling for) is a pointer type, and therefore that
0 is a valid argument. This is not the case for the SH4 ABI where
va_list happens to be a struct type and even though vsscanf() is
provided by libc the test fails to compile,

/tmp/mplayer-conf-9882-6741.c: In function 'main':
/tmp/mplayer-conf-9882-6741.c:4: error: incompatible type for argument 3 of
'vsscanf'
/home/wmat/CodeSourcery/Sourcery_G++_Lite_4.4-45/bin/../sh-linux-gnu/libc/usr/include/stdio.h:484:
note: expected '__gnuc_va_list' but argument is of type 'int'

The solution is to provide a properly typed argument to vsscanf() so
that it will compile for any ABI.

Index: configure
===================================================================
--- configure   (revision 30208)
+++ configure   (working copy)
@@ -3745,7 +3745,7 @@
 #define _ISOC99_SOURCE
 #include <stdarg.h>
 #include <stdio.h>
-int main(void) { vsscanf(0, 0, 0); return 0; }
+int main(void) { va_list ap; vsscanf(0, 0, ap); return 0; }
 EOF
 _vsscanf=no
 cc_check && _vsscanf=yes


--
> Mark Mitchell
> CodeSourcery
> mark at codesourcery.com
> (650) 331-3385 x713
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://sourcerytools.com/pipermail/superh-gnu-discuss/attachments/20100104/80a8cded/attachment.html>


More information about the superh-gnu-discuss mailing list