[ccan] clang warnings from ccan/rbtree/rbtree.c

Rusty Russell rusty at rustcorp.com.au
Sat Mar 12 11:07:34 EST 2011


On Tue, 8 Mar 2011 16:29:54 +1100, Brad Hards <bradh at frogmouth.net> wrote:
> I've been running the clang static analysis tool over ccan. Some issues, some 
> false alarms, some "hmm, what now".
> 
> Here is an extract from ccan/rbtree/rbtree.c:
> 
> /* setting a NULL node to black is a nop */
> static inline void trbt_set_color(trbt_node_t *node, int color)
> {
> 	if ( (node==NULL) && (color==TRBT_BLACK) ) {
> 		return;
> 	}
> 	node->rb_color = color;
> }
> static inline void trbt_set_color_left(trbt_node_t *node, int color)
> {
> 	if ( ((node==NULL)||(node->left==NULL)) && (color==TRBT_BLACK) ) {
> 		return;
> 	}
> 	node->left->rb_color = color;
> }
> static inline void trbt_set_color_right(trbt_node_t *node, int color)
> {
> 	if ( ((node==NULL)||(node->right==NULL)) && (color==TRBT_BLACK) ) {
> 		return;
> 	}
> 	node->right->rb_color = color;
> }
> 
> It only complains about the last one:
> 216  static inline void trbt_set_color_right(trbt_node_t *node, int color)
> 217  {
> 218          if ( ((node==NULL)||(node->right==NULL)) && (color==TRBT_BLACK) ) 
> {
>   1.  Assuming pointer value is null
>   2. Taking false branch
> 219                  return;
> 220          }
> 221          node->right->rb_color = color;
>   3.  Dereference of null pointer
> 222  }
> 
> That is, if node or node->right are NULL, and color is not equal to 
> TRBT_BLACK, then it will segfault. 
> 
> Now, I couldn't find a case where we ever pass anything other than a color of 
> TRBT_BLACK, but I'm still not sure what to do here:
> 1. Simplify the function so it only ever sets to black?
> 2. Change it to || instead of &&?
> 3. Ignore the whole thing?
> 
> Thoughts? Suggestions?

Well, step 1 is to CC the author :)

I would say: simplify.  But that may be naive...

Ronnie?

Cheers,
Rusty.


More information about the ccan mailing list