Re: Why is cast from NULL illegal?
- From: Lars Clausen <lrclause cs uiuc edu>
- To: Sven Neumann <sven gimp org>
- Cc: gtk-list gnome org
- Subject: Re: Why is cast from NULL illegal?
- Date: 19 Nov 2002 12:55:56 -0600
On 19 Nov 2002, Sven Neumann wrote:
> Hi,
>
> Lars Clausen <lrclause cs uiuc edu> writes:
>
>> After changing Dia's code to have more static type checking, I'm getting
>> a number of errors about invalid casts from NULL. But surely NULL can
>> be any type, so any cast of it should be valid.
>
> surely you can cast NULL to any type but you are using type-checking
> casts here. These casts are supposed to guarantee that the variable
> points to a valid GObject of a specific GType. This can't possibly work
> with a NULL pointer.
Hmmm... looking at the GObject docs, G_OBJECT() says 'Cast a GObject or
derived pointer into a (GObject*) pointer'. I would say that since NULL is
a GObject pointer that points to nothing, we shouldn't get any warnings for
casting it. NULL is in fact a pointer of any pointer type that points to
nothing.
Also, note that this means that GTK_WIDGET(gtk_item_factor_get_item(...))
will cause a warning on the legal NULL return, even though we're casting to
the exact return type. Messy.
>> The function in question here is gtk_item_factory_get_item(), which
>> despite always returning NULL or a GtkMenuItem* has a return type of
>> GtkWidget*. After some nasty bugs caused by the lack of static type
>> check for this, I decided to make better use of the compilers
>> typechecking. But if I say
>> GTK_MENU_ITEM(gtk_item_factory_get_item(...)), I get warnings whenever
>> it returns NULL. Having to check for NULL before casting would be
>> cumbersome.
>
> gtk_item_factory_get_item() returns a GtkWidget pointer so the return
> value should be assigned to a GtkWidget pointer as well. If you later
> need to use the widget as a GtkMenu, you should do the type-checking
> cast there (after checking that it is non-NULL).
So why does gtk_item_factory_get_item() return a GtkWidget*, when the
description indicates that it will always be a GtkMenuItem*? (Or NULL, but
you can't say that NULL is a valid GtkWidget object either.)
In general, functions ought to return the most specific type possible, to
make the greatest use of the compile-time type checks. Using GtkWidget*
for the return type of methods where you know the returned object is more
specific is like using void* instead of <type>*. It provides a little
programming ease at the cost of some hard-to-trace bugs.
-Lars
--
Lars Clausen (http://shasta.cs.uiuc.edu/~lrclause)| Hårdgrim of Numenor
"I do not agree with a word that you say, but I |----------------------------
will defend to the death your right to say it." | Where are we going, and
--Evelyn Beatrice Hall paraphrasing Voltaire | what's with the handbasket?
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]