[vdr] Valgrind warnings with LCARS OSD

Marko Mäkelä marko.makela at iki.fi
Fri Nov 15 18:17:19 CET 2013


Hi Klaus,

On Fri, Nov 15, 2013 at 04:47:10PM +0100, Klaus Schmidinger wrote:
>>#2  0x0810e3d2 in cPixmapMemory::DrawRectangle (this=0x6d3fe78, 
>>Rect=..., Color=2566914048) at osd.c:1333
>>1333      cRect r = Rect.Intersected(DrawPort().Size());
>>
>>As far as I can tell, the entirely uninitialized cRect is being passed 
>>as the Rect parameter to cPixmapMemory::DrawRectangle(). 
>>Unfortunately, gdb cannot show me the stack above that. It would seem 
>>to me that cSkinLCARSDisplayMenu::Clear() is passing uninitialized 
>>bounds to cOsd::DrawRectangle(), which will lead to funny values like 
>>this:
>>
>>(gdb) p *this
>>$31 = {point = {x = 1418239204, y = 0}, size = {width = -1379480940, 
>>height = 201}, static Null = {point = {x = 0, y = 0}, size = {width = 
>>0, height = 0}, static Null = <same as static member of an already 
>>seen type>}}
>
>The constructor of cRect makes sure that all members are initialized to zero.
>I'm afraid I can't think of a way there could be an uninitialized cRect.

Sorry, I used a bit sloppy language. cRect appears to be initialized, 
but with uninitialized values. You know, Valgrind does not complain when 
you copy uninitialized data around. It only complains when you are 
comparing uninitialized data or passing uninitialized data to a system 
call. The Valgrind V-bits are tracking which bits are uninitialized.

The cRect constructor is not at fault. I tried this twice, but both 
times gdb would only show me the 3 topmost stack frames, claiming that 
the rest of the stack is corrupted. Valgrind did show more (quoting from 
my previous message):

==3601==    by 0x810AA0B: cOsd::DrawRectangle(int, int, int, int,
unsigned int) (osd.c:1922)
==3601==    by 0x8130482: cSkinLCARSDisplayMenu::Clear() 
(skinlcars.c:1463)

I could obviously not verify this (due to gdb claiming that the stack is 
corrupted), but I suspect that the parameters that are being passed are 
uninitialized:

void cSkinLCARSDisplayMenu::Clear(void)
{
   textScroller.Reset();
   osd->DrawRectangle(xi00, yi00, xi03 - 1, yi01 - 1, Theme.Color(clrBackground));
}

AFAICT, it is invoking this code in cOsd::DrawRectangle():
      pixmaps[0]->DrawRectangle(cRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1), Color);
This in turn should be invoking this constructor:
  cRect(int X, int Y, int Width, int Height): point(X, Y), size(Width, Height) {}

cSkinLCARSDisplayMenu::cSkinLCARSDisplayMenu() is not initializing any 
of the members xi00, yi00, xi03, yi01.

>Is there a reproducible set of actions that causes this to happen?

Yes. Hit Play (to start playing the last played recording), Pause, Menu, 
Recordings while using the LCARS skin. The first 2 or 3 keypresses ought 
to be optional. I had to stop the video playback with the 2 first 
keypresses, because the softdevice framerate is measured in seconds per 
frame when running under Valgrind :)

Best regards,

	Marko



More information about the vdr mailing list