[mythtv-commits] Ticket #2725: dynamic_cast can return NULL, must test

MythTV mythtv at cvs.mythtv.org
Sat Nov 25 11:34:55 UTC 2006


#2725: dynamic_cast can return NULL, must test
--------------------+-------------------------------------------------------
 Reporter:  nigel   |        Owner:  nigel  
     Type:  defect  |       Status:  closed 
 Priority:  minor   |    Milestone:  unknown
Component:  mythtv  |      Version:  0.20   
 Severity:  medium  |   Resolution:  invalid
--------------------+-------------------------------------------------------
Old description:

> There are a few places in the code where the result of dynamic_cast isn't
> tested before it is used. Sadly, in some cases, it can return NULL, which
> causes a bus error or SEGV.
> [[BR]]
> One particuar problem is in the keypress event processing. Causes a crash
> on OS X binaries built on 10.4 (gcc4), but running on 10.3. It is an old
> problem, usually caused by incorrectly compiling with -no-rtti:
> http://www.gossamer-threads.com/lists/mythtv/dev/72988#72988
> [[BR]]
> Some documents (''e.g.''
> http://www.cplusplus.com/doc/tutorial/typecasting.html) say that
> dynamic_cast ing a base class to a subclass is illegal. QKeyEvent is a
> base class of QEvent, so if I believe this, it is the problem here.

New description:

 There are a few places in the code where the result of dynamic_cast isn't
 tested before it is used. Sadly, in some cases, it can return NULL, which
 causes a bus error or SEGV.
 [[BR]]
 One particuar problem is in the keypress event processing. Causes a crash
 on OS X binaries built on 10.4 (gcc4), but running on 10.3. It is an old
 problem, usually caused by incorrectly compiling with -fno-rtti:
 http://www.gossamer-threads.com/lists/mythtv/dev/72988#72988
 [[BR]]
 Some documents (''e.g.''
 http://www.cplusplus.com/doc/tutorial/typecasting.html) say that
 dynamic_cast ing a base class to a subclass is illegal. QKeyEvent is a
 base class of QEvent, so if I believe this, it is the problem here.

Comment (by nigel):

 I suspect there is something seriously wrong with the GCC vtable parsing,
 but I haven't found it. The following:[code]Index: mythmainwindow.cpp
 ===================================================================
 --- mythmainwindow.cpp  (revision 11820)
 +++ mythmainwindow.cpp  (working copy)
 @@ -1089,9 +1089,32 @@
      {
          case QEvent::KeyPress:
          {
 +            QKeyEvent *ke = dynamic_cast<QKeyEvent*>(e);
 +
 +            if (!ke)
 +            {
 +                //puts("Dynamic_cast of a QtEvent failed!!!");
 +
 +                // In some strange situations, e is already a QKeyEvent
 +                ke = new QKeyEvent(QEvent::KeyPress, 0, 0, 0);
 +
 +                if (strcmp(typeid(*e).name(), typeid(*ke).name()) == 0)
 +                {
 +                    delete ke;
 +
 +                    // Same typeid? Safe to do a plain-old cast:
 +                    ke = static_cast<QKeyEvent*>(e);
 +                }
 +                else
 +                {
 +                    delete ke;
 +                    //puts("Did you use -fno-rtti to build?");
 +                    return false;
 +                }
 +            }
 +[/code] works. Some debuging reveals typeid(e).name() == "P9QKeyEvent"
 (QKeyEvent*), and typeid(*e).name() == "9QKeyEvent" (QKeyEvent). Freaking
 weird.
 [[BR]]
 A few other random dynamic_cast values that aren't checked:
 libmyth/settings.cpp line 611, 671, 718, 765, 796, 1402,
 libmythtv/darwinfirewirerecorder.cpp line 17, libmythtv/diseqcsettings.cpp
 line 1362-3, 1375-6, 1388-89, 1400, 1411, 1422-23, 1434-35, 1447-48,
 1473-74

-- 
Ticket URL: <http://svn.mythtv.org/trac/ticket/2725#comment:2>
MythTV <http://www.mythtv.org/>
MythTV


More information about the mythtv-commits mailing list