From bbd28b100e413aa72bd011c072ad24c9084c6981 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Wed, 27 May 2015 00:19:11 -0600 Subject: [PATCH] Hack around segfault at launch, patch from danfe: https://github.com/TTimo/GtkRadiant/issues/289 --- radiant/treemodel.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/radiant/treemodel.cpp b/radiant/treemodel.cpp index 4d2f8238..d36e492a 100644 --- a/radiant/treemodel.cpp +++ b/radiant/treemodel.cpp @@ -647,7 +647,13 @@ void detach( const NameCallback& callback ){ }; void node_attach_name_changed_callback( scene::Node& node, const NameCallback& callback ){ - if ( &node != 0 ) { + // Reference cannot be bound to dereferenced null pointer in well-defined + // C++ code, and Clang will assume that comparison below always evaluates + // to true, resulting in a segmentation fault. Use a dirty hack to force + // Clang to check those "bad" references for null nonetheless. + volatile intptr_t n = (intptr_t)&node; + + if ( n != 0 ) { Nameable* nameable = Node_getNameable( node ); if ( nameable != 0 ) { nameable->attach( callback ); @@ -655,7 +661,9 @@ void node_attach_name_changed_callback( scene::Node& node, const NameCallback& c } } void node_detach_name_changed_callback( scene::Node& node, const NameCallback& callback ){ - if ( &node != 0 ) { + volatile intptr_t n = (intptr_t)&node; // see the comment on line 650 + + if ( n != 0 ) { Nameable* nameable = Node_getNameable( node ); if ( nameable != 0 ) { nameable->detach( callback ); @@ -1124,7 +1132,8 @@ void graph_tree_model_row_deleted( GraphTreeModel& model, GraphTreeNode::iterato const char* node_get_name( scene::Node& node ); const char* node_get_name_safe( scene::Node& node ){ - if ( &node == 0 ) { + volatile intptr_t n = (intptr_t)&node; // see the comment on line 650 + if ( n == 0 ) { return ""; } return node_get_name( node ); @@ -1142,7 +1151,8 @@ GraphTreeNode* graph_tree_model_find_parent( GraphTreeModel* model, const scene: } void node_attach_name_changed_callback( scene::Node& node, const NameCallback& callback ){ - if ( &node != 0 ) { + volatile intptr_t n = (intptr_t)&node; // see the comment on line 650 + if ( n != 0 ) { Nameable* nameable = Node_getNameable( node ); if ( nameable != 0 ) { nameable->attach( callback ); @@ -1150,7 +1160,8 @@ void node_attach_name_changed_callback( scene::Node& node, const NameCallback& c } } void node_detach_name_changed_callback( scene::Node& node, const NameCallback& callback ){ - if ( &node != 0 ) { + volatile intptr_t n = (intptr_t)&node; // see the comment on line 650 + if ( n != 0 ) { Nameable* nameable = Node_getNameable( node ); if ( nameable != 0 ) { nameable->detach( callback ); -- 2.39.2