tags 406378 =patch
thanks

On Sun, Jan 14, 2007 at 01:35:11PM +0000, Neil Williams wrote:
> On Sun, 14 Jan 2007 03:55:45 -0800
> Steve Langasek <[EMAIL PROTECTED]> wrote:

> > On Sat, Jan 13, 2007 at 09:26:13PM -0800, Thomas Bushnell BSG wrote:
> > > Hi Steve; you were very helpful with the last alpha bug reported by this
> > > submitter; I'm wondering if you can give it a little attention.  I don't
> > > have easy access to an alpha to reproduce the problem.

> > Please ask upstream where they got the idea that g_type_register_static()
> > returned a guint, or that it was otherwise ok to cast its GType return type
> > to a guint.

> This behaviour has been "normal" for gnucash for at least 5 years.

Really?  In gnucash 2.0.2, I find around 250 gtype declarations, and only 11
of them were using guint instead of GType (full patch attached now). 
Casting GType to a 32-bit int is always fatal on alpha, because GType is
really a pointer disguised as an int, and due to the default load addresses
on alpha this will always truncate a 64-bit pointer to 32-bits and cause a
segfault.  And I've used gnucash on alpha before, and it wasn't 5 years ago
-- either this is new code, or these types somehow weren't needed during
normal operation, or the nature of a gtype differs between gtk1.2 and
gtk2.0.  (But I don't remember gtk1.2 having gobject/gtype at all, though
that could just be me...)

> The only "reason" I can find is from the API docs for glib2:
> "GType
> A numerical value which represents the unique identifier of a
> registered type. "
> http://developer.gnome.org/doc/API/2.0/gobject/gobject-Type-Information.html#GType

> I guess it's just being taken literally and in the absence of a warning
> not to . . .

> The use of guint predates the use of g_type_register_static, to a time
> when gtk_type_unique was in use:
> http://svn.gnucash.org/trac/changeset/12075#file1
> 
> But the static guint type existed before that and has not been changed
> since:
> http://svn.gnucash.org/trac/browser/gnucash/trunk/src/business/business-gnome/search-owner.c?rev=6905#L65

Heh -- and unlike 2.0's GType, 1.2's GtkType *was* a typedef for a guint.

It's still type abuse, violating the abstraction provided by the API; but at
least that explains why gnucash worked on alpha before being ported to GTK
2.0.

> > Years of debugging crashing gtk+ programs on alpha, and it's
> > always the same thing -- somehow, GTK programmers are consistently getting
> > bad information about how to use gobject, and I want to know where it's
> > coming from so I can lart the people responsible.

> I can't find a URL for such bad information - maybe it's coming from a
> particular offline example. I'd have to say that the GObject/GLib/Gtk
> API documentation doesn't make it clear that although type is a
> numerical value it cannot be handled as a numerical value in a portable
> manner.

Er, it certainly can be handled as a numerical value in a portable manner --
*by taking care not to cast it (implicitly or otherwise) to a different type
that's too small*.  You wouldn't think it appropriate to assign the return
value from a function returning unsigned long to a variable of type unsigned
short, would you?

> In the cases that you have found, has the use of guint also been a
> long-standing issue or are people putting this into new code?

New code, by and large.

> I somehow doubt anyone developing gnucash has been developing on an
> alpha.

No, I imagine not; but when this blatant type error is so common that I can
diagnose it from a glance at a backtrace, I really would like it if
upstreams were being given good enough docs to enable them to write working
code in the first place.

-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
[EMAIL PROTECTED]                                   http://www.debian.org/
diff -u gnucash-2.0.2/debian/changelog gnucash-2.0.2/debian/changelog
--- gnucash-2.0.2/debian/changelog
+++ gnucash-2.0.2/debian/changelog
@@ -1,3 +1,10 @@
+gnucash (2.0.2-2.2) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * For the 800th time, GType != int.  Closes: #406378.
+
+ -- Steve Langasek <[EMAIL PROTECTED]>  Sun, 14 Jan 2007 03:40:31 -0800
+
 gnucash (2.0.2-2.1) unstable; urgency=medium
 
   * NMU.
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome/gnc-split-reg.h
+++ gnucash-2.0.2/src/gnome/gnc-split-reg.h
@@ -159,7 +159,7 @@
 /**
  * GTK-related; gets an identifier for the class of GNCSplitRegs.
  **/
-guint gnc_split_reg_get_type(void);
+GType gnc_split_reg_get_type(void);
 
 /**
  * Creates and returns a GNCSplitReg.
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome/gnc-split-reg.c
+++ gnucash-2.0.2/src/gnome/gnc-split-reg.c
@@ -170,10 +170,10 @@
 FROM_STRING_FUNC(SortType, ENUM_LIST_SORTTYPE)
 AS_STRING_FUNC(SortType, ENUM_LIST_SORTTYPE)
 
-guint
+GType
 gnc_split_reg_get_type( void )
 {
-  static guint gnc_split_reg_type = 0;
+  static GType gnc_split_reg_type = 0;
 
   if (!gnc_split_reg_type)
     {
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/gnc-general-search.h
+++ gnucash-2.0.2/src/gnome-search/gnc-general-search.h
@@ -83,7 +83,7 @@
 					      gpointer searched);
 gpointer   gnc_general_search_get_selected   (GNCGeneralSearch *gsl);
 
-guint      gnc_general_search_get_type       (void);
+GType      gnc_general_search_get_type       (void);
 
 #endif
 
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-account.h
+++ gnucash-2.0.2/src/gnome-search/search-account.h
@@ -46,7 +46,7 @@
   /* signals */
 };
 
-guint		gnc_search_account_get_type	(void);
+GType		gnc_search_account_get_type	(void);
 GNCSearchAccount	*gnc_search_account_new	(void);
 GNCSearchAccount	*gnc_search_account_matchall_new	(void);
 
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-boolean.h
+++ gnucash-2.0.2/src/gnome-search/search-boolean.h
@@ -47,7 +47,7 @@
   /* signals */
 };
 
-guint		gnc_search_boolean_get_type	(void);
+GType		gnc_search_boolean_get_type	(void);
 GNCSearchBoolean	*gnc_search_boolean_new	(void);
 
 /* methods */
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-date.h
+++ gnucash-2.0.2/src/gnome-search/search-date.h
@@ -48,7 +48,7 @@
   /* signals */
 };
 
-guint		gnc_search_date_get_type	(void);
+GType		gnc_search_date_get_type	(void);
 GNCSearchDate	*gnc_search_date_new	(void);
 
 /* methods */
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-double.h
+++ gnucash-2.0.2/src/gnome-search/search-double.h
@@ -47,7 +47,7 @@
   /* signals */
 };
 
-guint		gnc_search_double_get_type	(void);
+GType		gnc_search_double_get_type	(void);
 GNCSearchDouble	*gnc_search_double_new	(void);
 
 /* methods */
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-int64.h
+++ gnucash-2.0.2/src/gnome-search/search-int64.h
@@ -47,7 +47,7 @@
   /* signals */
 };
 
-guint		gnc_search_int64_get_type	(void);
+GType		gnc_search_int64_get_type	(void);
 GNCSearchInt64	*gnc_search_int64_new	(void);
 
 /* methods */
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-numeric.h
+++ gnucash-2.0.2/src/gnome-search/search-numeric.h
@@ -50,7 +50,7 @@
   /* signals */
 };
 
-guint		gnc_search_numeric_get_type	(void);
+GType		gnc_search_numeric_get_type	(void);
 GNCSearchNumeric	*gnc_search_numeric_new	(void);
 GNCSearchNumeric	*gnc_search_numeric_debcred_new (void);
 
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-reconciled.h
+++ gnucash-2.0.2/src/gnome-search/search-reconciled.h
@@ -47,7 +47,7 @@
   /* signals */
 };
 
-guint		gnc_search_reconciled_get_type	(void);
+GType		gnc_search_reconciled_get_type	(void);
 GNCSearchReconciled	*gnc_search_reconciled_new	(void);
 
 /* methods */
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-string.h
+++ gnucash-2.0.2/src/gnome-search/search-string.h
@@ -54,7 +54,7 @@
   /* signals */
 };
 
-guint		gnc_search_string_get_type	(void);
+GType		gnc_search_string_get_type	(void);
 GNCSearchString	*gnc_search_string_new	(void);
 
 /* methods */
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/gnc-general-search.c
+++ gnucash-2.0.2/src/gnome-search/gnc-general-search.c
@@ -80,10 +80,10 @@
  *
  * Returns the GtkType for the GNCGeneralSearch widget
  */
-guint
+GType
 gnc_general_search_get_type (void)
 {
-	static guint general_search_type = 0;
+	static GType general_search_type = 0;
 
 	if (!general_search_type){
 		static const GTypeInfo our_info = {
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-account.c
+++ gnucash-2.0.2/src/gnome-search/search-account.c
@@ -56,10 +56,10 @@
 static GNCSearchCoreTypeClass *parent_class;
 
 
-guint
+GType
 gnc_search_account_get_type (void)
 {
-  static guint type = 0;
+  static GType type = 0;
 	
   if (!type) {
     GTypeInfo type_info = {
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-boolean.c
+++ gnucash-2.0.2/src/gnome-search/search-boolean.c
@@ -51,10 +51,10 @@
 
 static GNCSearchCoreTypeClass *parent_class;
 
-guint
+GType
 gnc_search_boolean_get_type (void)
 {
-  static guint type = 0;
+  static GType type = 0;
 	
   if (!type) {
     GTypeInfo type_info = {
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-date.c
+++ gnucash-2.0.2/src/gnome-search/search-date.c
@@ -55,10 +55,10 @@
 
 static GNCSearchCoreTypeClass *parent_class;
 
-guint
+GType
 gnc_search_date_get_type (void)
 {
-  static guint type = 0;
+  static GType type = 0;
 	
   if (!type) {
     GTypeInfo type_info = {
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-double.c
+++ gnucash-2.0.2/src/gnome-search/search-double.c
@@ -55,10 +55,10 @@
 
 static GNCSearchCoreTypeClass *parent_class;
 
-guint
+GType
 gnc_search_double_get_type (void)
 {
-  static guint type = 0;
+  static GType type = 0;
 	
   if (!type) {
     GTypeInfo type_info = {
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-int64.c
+++ gnucash-2.0.2/src/gnome-search/search-int64.c
@@ -56,10 +56,10 @@
 
 static GNCSearchCoreTypeClass *parent_class;
 
-guint
+GType
 gnc_search_int64_get_type (void)
 {
-  static guint type = 0;
+  static GType type = 0;
 	
   if (!type) {
     GTypeInfo type_info = {
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-numeric.c
+++ gnucash-2.0.2/src/gnome-search/search-numeric.c
@@ -56,10 +56,10 @@
 
 static GNCSearchCoreTypeClass *parent_class;
 
-guint
+GType
 gnc_search_numeric_get_type (void)
 {
-  static guint type = 0;
+  static GType type = 0;
 	
   if (!type) {
     GTypeInfo type_info = {
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-reconciled.c
+++ gnucash-2.0.2/src/gnome-search/search-reconciled.c
@@ -52,10 +52,10 @@
 
 static GNCSearchCoreTypeClass *parent_class;
 
-guint
+GType
 gnc_search_reconciled_get_type (void)
 {
-  static guint type = 0;
+  static GType type = 0;
 	
   if (!type) {
     GTypeInfo type_info = {
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/gnome-search/search-string.c
+++ gnucash-2.0.2/src/gnome-search/search-string.c
@@ -55,10 +55,10 @@
 
 static GNCSearchCoreTypeClass *parent_class;
 
-guint
+GType
 gnc_search_string_get_type (void)
 {
-  static guint type = 0;
+  static GType type = 0;
 	
   if (!type) {
     GTypeInfo type_info = {
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/business/business-gnome/search-owner.h
+++ gnucash-2.0.2/src/business/business-gnome/search-owner.h
@@ -46,7 +46,7 @@
   /* signals */
 };
 
-guint		gnc_search_owner_get_type	(void);
+GType		gnc_search_owner_get_type	(void);
 GNCSearchOwner	*gnc_search_owner_new	(void);
 
 /* methods */
only in patch2:
unchanged:
--- gnucash-2.0.2.orig/src/business/business-gnome/search-owner.c
+++ gnucash-2.0.2/src/business/business-gnome/search-owner.c
@@ -65,10 +65,10 @@
 static guint signals[LAST_SIGNAL] = { 0 };
 #endif
 
-guint
+GType
 gnc_search_owner_get_type (void)
 {
-  static guint type = 0;
+  static GType type = 0;
 	
   if (!type) {
     GTypeInfo type_info = {

Reply via email to