Hello,

The function “free” is documented in the way that no action shall occur for
a passed null pointer. It is therefore not needed that a function caller
repeats a corresponding check.
https://stackoverflow.com/questions/18775608/free-a-null-pointer-anyway-or-check-first

This issue can be fixed also by using the software “Coccinelle 1.1.1”.

Regards,
Markus
diff --git a/bashline.c b/bashline.c
index c85b05b6..81010b68 100644
--- a/bashline.c
+++ b/bashline.c
@@ -1670,8 +1670,7 @@ attempt_shell_completion (text, start, end)
       char *n;
 
       /* XXX - don't free the members */
-      if (prog_complete_matches)
-	free (prog_complete_matches);
+      free (prog_complete_matches);
       prog_complete_matches = (char **)NULL;
 
       os = start;
@@ -1991,8 +1990,7 @@ command_word_completion_function (hint_text, state)
 
       if (dequoted_hint && dequoted_hint != hint)
 	free (dequoted_hint);
-      if (hint)
-	free (hint);
+      free (hint);
 
       mapping_over = searching_path = 0;
       hint_is_dir = CMD_IS_DIR (hint_text);
@@ -2056,8 +2054,7 @@ command_word_completion_function (hint_text, state)
 	    }
 	  hint_len = strlen (hint);
 
-	  if (filename_hint)
-	    free (filename_hint);
+	  free (filename_hint);
 
 	  fnhint = filename_hint = savestring (hint);
 
@@ -2093,14 +2090,12 @@ command_word_completion_function (hint_text, state)
       /* Initialize the variables for each type of command word. */
       local_index = 0;
 
-      if (varlist)
-	free (varlist);
+      free (varlist);
 
       varlist = all_visible_functions ();
 
 #if defined (ALIAS)
-      if (alias_list)
-	free (alias_list);
+      free (alias_list);
 
       alias_list = all_aliases ();
 #endif /* ALIAS */
@@ -2273,8 +2268,7 @@ globword:
 
       if (fnhint && fnhint != filename_hint)
 	free (fnhint);
-      if (filename_hint)
-	free (filename_hint);
+      free (filename_hint);
 
       filename_hint = sh_makepath (current_path, hint, 0);
       /* Need a quoted version (though it doesn't matter much in most
@@ -2409,8 +2403,7 @@ command_subst_completion_function (text, state)
 
   if (state == 0)
     {
-      if (filename_text)
-	free (filename_text);
+      free (filename_text);
       orig_start = text;
       if (*text == '`')
 	text++;
@@ -2421,8 +2414,7 @@ command_subst_completion_function (text, state)
       rl_completion_suppress_quote = 1;
       start_len = text - orig_start;
       filename_text = savestring (text);
-      if (matches)
-	free (matches);
+      free (matches);
 
       /*
        * At this point we can entertain the idea of re-parsing
@@ -2491,8 +2483,7 @@ variable_completion_function (text, state)
 
   if (!state)
     {
-      if (varname)
-	free (varname);
+      free (varname);
 
       first_char_loc = 0;
       first_char = text[0];
diff --git a/builtins/common.c b/builtins/common.c
index 19b00c4d..b047c44d 100644
--- a/builtins/common.c
+++ b/builtins/common.c
@@ -434,8 +434,7 @@ shift_args (times)
 
   while (times-- > 0)
     {
-      if (dollar_vars[1])
-	free (dollar_vars[1]);
+      free (dollar_vars[1]);
 
       for (count = 1; count < 9; count++)
 	dollar_vars[count] = dollar_vars[count + 1];
diff --git a/builtins/mkbuiltins.c b/builtins/mkbuiltins.c
index f505ebde..350d8bbd 100644
--- a/builtins/mkbuiltins.c
+++ b/builtins/mkbuiltins.c
@@ -261,8 +261,7 @@ main (argc, argv)
 	{
 	  int len;
 
-	  if (error_directory)
-	    free (error_directory);
+	  free (error_directory);
 
 	  error_directory = xmalloc (2 + strlen (argv[arg_index]));
 	  strcpy (error_directory, argv[arg_index]);
@@ -448,9 +447,7 @@ void
 array_free (array)
      ARRAY *array;
 {
-  if (array->array)
-    free (array->array);
-
+  free (array->array);
   free (array);
 }
 
@@ -695,8 +692,7 @@ free_defs (defs)
   register int i;
   register BUILTIN_DESC *builtin;
 
-  if (defs->production)
-    free (defs->production);
+  free (defs->production);
 
   if (defs->lines)
     array_free (defs->lines);
diff --git a/examples/loadables/csv.c b/examples/loadables/csv.c
index 75b37725..de7564a2 100644
--- a/examples/loadables/csv.c
+++ b/examples/loadables/csv.c
@@ -96,8 +96,7 @@ csvsplit (csv, line, dstring)
     }
   while (delim == *dstring);
 
-  if (xbuf)
-    free (xbuf);
+  free (xbuf);
 
   return (rval = ind);				/* number of fields */
 }
diff --git a/examples/loadables/dsv.c b/examples/loadables/dsv.c
index 70e59cbc..187ef685 100644
--- a/examples/loadables/dsv.c
+++ b/examples/loadables/dsv.c
@@ -156,8 +156,7 @@ dsvsplit (dsv, line, dstring, flags)
     }
   while (delim == *dstring);
 
-  if (xbuf)
-    free (xbuf);
+  free (xbuf);
 
   return (rval = ind);				/* number of fields */
 }
diff --git a/execute_cmd.c b/execute_cmd.c
index e5c6b9ab..b3b0aa31 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -5527,8 +5527,7 @@ execute_builtin_or_function (words, builtin, var, redirects,
   nfifo = num_fifos ();
   if (nfifo > ofifo)
     close_new_fifos (ofifo_list, osize);
-  if (ofifo_list)
-    free (ofifo_list);
+  free (ofifo_list);
   discard_unwind_frame ("saved_fifos");
 #endif
 
diff --git a/expr.c b/expr.c
index 5079bd47..362c531d 100644
--- a/expr.c
+++ b/expr.c
@@ -304,12 +304,8 @@ expr_unwind ()
 {
   while (--expr_depth > 0)
     {
-      if (expr_stack[expr_depth]->tokstr)
-	free (expr_stack[expr_depth]->tokstr);
-
-      if (expr_stack[expr_depth]->expression)
-	free (expr_stack[expr_depth]->expression);
-
+      free (expr_stack[expr_depth]->tokstr);
+      free (expr_stack[expr_depth]->expression);
       free (expr_stack[expr_depth]);
     }
   if (expr_depth == 0)
diff --git a/input.c b/input.c
index 7b439f8c..46ce19ab 100644
--- a/input.c
+++ b/input.c
@@ -430,8 +430,7 @@ free_buffered_stream (bp)
     return;
 
   n = bp->b_fd;
-  if (bp->b_buffer)
-    free (bp->b_buffer);
+  free (bp->b_buffer);
   free (bp);
   buffers[n] = (BUFFERED_STREAM *)NULL;
 }
diff --git a/lib/glob/glob.c b/lib/glob/glob.c
index b66af85c..5ec432d0 100644
--- a/lib/glob/glob.c
+++ b/lib/glob/glob.c
@@ -1575,7 +1575,7 @@ only_filename:
       free ((char *) result);
     }
 
-  if (free_dirname && directory_name)
+  if (free_dirname)
     free (directory_name);
 
   QUIT;
diff --git a/lib/glob/xmbsrtowcs.c b/lib/glob/xmbsrtowcs.c
index 17250c30..6f7c6803 100644
--- a/lib/glob/xmbsrtowcs.c
+++ b/lib/glob/xmbsrtowcs.c
@@ -43,7 +43,7 @@ extern int errno;
 #define WSBUF_INC 32
 
 #ifndef FREE
-#  define FREE(x)	do { if (x) free (x); } while (0)
+#  define FREE(x)	do { free (x); } while (0)
 #endif
 
 #if ! HAVE_STRCHRNUL
@@ -93,8 +93,7 @@ xmbsrtowcs (dest, src, len, pstate)
 
       wclength = mbsrtowcs (wsbuf, &mbs, n, &psbuf);
 
-      if (wsbuf)
-	free (wsbuf);
+      free (wsbuf);
       return wclength;
     }
       
diff --git a/lib/intl/bindtextdom.c b/lib/intl/bindtextdom.c
index ef5479e3..21ab4b99 100644
--- a/lib/intl/bindtextdom.c
+++ b/lib/intl/bindtextdom.c
@@ -206,8 +206,7 @@ set_binding_values (domainname, dirnamep, codesetp)
 
 		  if (__builtin_expect (result != NULL, 1))
 		    {
-		      if (binding->codeset != NULL)
-			free (binding->codeset);
+		      free (binding->codeset);
 
 		      binding->codeset = result;
 		      binding->codeset_cntr++;
diff --git a/lib/intl/loadmsgcat.c b/lib/intl/loadmsgcat.c
index adbd7b4f..8e627981 100644
--- a/lib/intl/loadmsgcat.c
+++ b/lib/intl/loadmsgcat.c
@@ -1287,8 +1287,7 @@ _nl_load_domain (domain_file, domainbinding)
       /* This is an invalid revision.  */
     invalid:
       /* This is an invalid .mo file.  */
-      if (domain->malloced)
-	free (domain->malloced);
+      free (domain->malloced);
 #ifdef HAVE_MMAP
       if (use_mmap)
 	munmap ((caddr_t) data, size);
@@ -1321,8 +1320,7 @@ _nl_unload_domain (domain)
 
   _nl_free_domain_conv (domain);
 
-  if (domain->malloced)
-    free (domain->malloced);
+  free (domain->malloced);
 
 # ifdef _POSIX_MAPPED_FILES
   if (domain->use_mmap)
diff --git a/lib/intl/localcharset.c b/lib/intl/localcharset.c
index 6983d0bf..949a4917 100644
--- a/lib/intl/localcharset.c
+++ b/lib/intl/localcharset.c
@@ -200,7 +200,6 @@ get_charset_aliases ()
 	    }
 	}
 
-      if (file_name != NULL)
 	free (file_name);
 
 #else
diff --git a/lib/malloc/xmalloc.c b/lib/malloc/xmalloc.c
index f6dec67a..8c589633 100644
--- a/lib/malloc/xmalloc.c
+++ b/lib/malloc/xmalloc.c
@@ -89,6 +89,5 @@ void
 xfree (string)
      PTR_T string;
 {
-  if (string)
-    free (string);
+  free (string);
 }
diff --git a/lib/readline/util.c b/lib/readline/util.c
index 2e986db0..67c38d13 100644
--- a/lib/readline/util.c
+++ b/lib/readline/util.c
@@ -450,8 +450,7 @@ FUNCTION_FOR_MACRO (_rl_uppercase_p)
 void
 rl_free (void *mem)
 {
-  if (mem)
-    free (mem);
+  free (mem);
 }
 
 /* Backwards compatibility, now that savestring has been removed from
diff --git a/lib/readline/xfree.c b/lib/readline/xfree.c
index c199b29b..8024bcc3 100644
--- a/lib/readline/xfree.c
+++ b/lib/readline/xfree.c
@@ -44,6 +44,5 @@
 void
 xfree (PTR_T string)
 {
-  if (string)
-    free (string);
+  free (string);
 }
diff --git a/lib/sh/fpurge.c b/lib/sh/fpurge.c
index 8cd4e368..de900f3c 100644
--- a/lib/sh/fpurge.c
+++ b/lib/sh/fpurge.c
@@ -159,11 +159,8 @@ fpurge (FILE *fp)
   fp->_IO_read_end = fp->_IO_read_ptr;
   fp->_IO_write_ptr = fp->_IO_write_base;
   /* Avoid memory leak when there is an active ungetc buffer.  */
-  if (fp->_IO_save_base != NULL)
-    {
-      free (fp->_IO_save_base);
-      fp->_IO_save_base = NULL;
-    }
+  free (fp->_IO_save_base);
+  fp->_IO_save_base = NULL;
   return 0;
 # elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
   fp_->_p = fp_->_bf._base;
diff --git a/lib/sh/snprintf.c b/lib/sh/snprintf.c
index 1f0f4c73..fc512570 100644
--- a/lib/sh/snprintf.c
+++ b/lib/sh/snprintf.c
@@ -1836,8 +1836,7 @@ static void
 xfree(x)
      void *x;
 {
-  if (x)
-    free (x);
+  free (x);
 }
 
 /* set of small tests for snprintf() */
diff --git a/lib/sh/timers.c b/lib/sh/timers.c
index 69b754c9..81f254dd 100644
--- a/lib/sh/timers.c
+++ b/lib/sh/timers.c
@@ -44,7 +44,7 @@ extern int errno;
 #endif /* !errno */
 
 #ifndef FREE
-#define FREE(s)  do { if (s) free (s); } while (0)
+#define FREE(s)  do { free (s); } while (0)
 #endif
 
 extern unsigned int falarm (unsigned int, unsigned int);
diff --git a/mailcheck.c b/mailcheck.c
index 4a11143c..bd6e8318 100644
--- a/mailcheck.c
+++ b/mailcheck.c
@@ -239,8 +239,7 @@ free_mail_files ()
   for (i = 0; i < mailfiles_count; i++)
     dispose_mail_file (mailfiles[i]);
 
-  if (mailfiles)
-    free (mailfiles);
+  free (mailfiles);
 
   mailfiles_count = 0;
   mailfiles = (FILEINFO **)NULL;
diff --git a/nojobs.c b/nojobs.c
index b7504cd8..3a0a23a6 100644
--- a/nojobs.c
+++ b/nojobs.c
@@ -499,8 +499,7 @@ make_child (command, flags)
   sigset_t set, oset;
 
   /* Discard saved memory. */
-  if (command)
-    free (command);
+  free (command);
 
   async_p = (flags & FORK_ASYNC);
   start_pipeline ();
diff --git a/subst.c b/subst.c
index 93b91606..f5daaabf 100644
--- a/subst.c
+++ b/subst.c
@@ -5971,8 +5971,7 @@ clear_fifo_list ()
 
   for (i = 0; i < fifo_list_size; i++)
     {
-      if (fifo_list[i].file)
-	free (fifo_list[i].file);
+      free (fifo_list[i].file);
       fifo_list[i].file = NULL;
       fifo_list[i].proc = 0;
     }
diff --git a/support/man2html.c b/support/man2html.c
index e6f441b4..226cd968 100644
--- a/support/man2html.c
+++ b/support/man2html.c
@@ -1243,8 +1243,7 @@ clear_table(TABLEROW * table)
 		ti1 = tr1->first;
 		while (ti1) {
 			ti2 = ti1->next;
-			if (ti1->contents)
-				free(ti1->contents);
+			free(ti1->contents);
 			free(ti1);
 			ti1 = ti2;
 		}
@@ -1558,8 +1557,9 @@ scan_table(char *c)
 				do {
 					curfield = curfield->next;
 				} while (curfield && curfield->align == 'S');
-			} else if (g)
+			} else {
 				free(g);
+			}
 			if (c[-1] == '\n') {
 				currow = next_row(currow);
 				curfield = currow->first;
@@ -1618,8 +1618,9 @@ scan_table(char *c)
 					do {
 						curfield = curfield->next;
 					} while (curfield && curfield->align == 'S');
-				} else if (g)
+				} else {
 					free(g);
+				}
 			}
 			if (i)
 				*c = itemsep;
@@ -1818,10 +1819,8 @@ scan_expression(char *c, int *result)
 			value = 0;
 		else
 			value = (!strcmp(st1, st2));
-		if (st1)
-			free(st1);
-		if (st2)
-			free(st2);
+		free(st1);
+		free(st2);
 		if (tcmp)
 			c = c + 3;
 		c++;
@@ -2137,8 +2136,7 @@ add_to_index(int level, char *item)
 	subs = level;
 	scan_troff(item, 1, &c);
 	sprintf(manidx + mip, "<DT><A HREF=\"#%s\">%s</A><DD>\n", label, c);
-	if (c)
-		free(c);
+	free(c);
 	while (manidx[mip])
 		mip++;
 }
@@ -2266,8 +2264,7 @@ scan_request(char *c)
 					de->st = NULL;
 					strdef = de;
 				} else {
-					if (de->st)
-						free(de->st);
+					free(de->st);
 					de->slen = 0;
 					de->st = NULL;
 				}
@@ -2600,8 +2597,7 @@ scan_request(char *c)
 						buf[l + 1] = buf[l + 2] = '\0';
 						scan_troff(buf + 1, 0, NULL);
 					}
-					if (buf)
-						free(buf);
+					free(buf);
 				}
 				*c++ = '\n';
 				break;
@@ -2968,8 +2964,7 @@ scan_request(char *c)
 				while (de && de->nr != j)
 					de = de->next;
 				if (de) {
-					if (de->st)
-						free(de->st);
+					free(de->st);
 					de->nr = 0;
 				}
 				de = strdef;
@@ -3069,8 +3064,7 @@ scan_request(char *c)
 					}
 					h[j] = '\0';
 					if (de) {
-						if (de->st)
-							free(de->st);
+						free(de->st);
 						de->st = h;
 					} else {
 						de = (STRDEF *) xmalloc(sizeof(STRDEF));
@@ -3702,8 +3696,7 @@ scan_request(char *c)
 				newline_for_fun = onff;
 				argument = oldargument;
 				for (i = 0; i < words; i++)
-					if (wordlist[i])
-						free(wordlist[i]);
+					free(wordlist[i]);
 				*sl = '\n';
 			} else if (mandoc_command &&
 				   ((isupper(*c) && islower(*(c + 1)))
diff --git a/variables.c b/variables.c
index 1a0c2c45..0055f31d 100644
--- a/variables.c
+++ b/variables.c
@@ -3373,7 +3373,7 @@ bind_variable_value (var, value, aflags)
 	 make_variable_value */
       t = (aflags & ASS_APPEND) ? make_variable_value (var, value, aflags) : value;
       (*(var->assign_func)) (var, t, -1, 0);
-      if (t != value && t)
+      if (t != value)
 	free (t);      
     }
   else
diff --git a/xmalloc.c b/xmalloc.c
index 1b3b4088..b60d6925 100644
--- a/xmalloc.c
+++ b/xmalloc.c
@@ -146,8 +146,7 @@ void
 xfree (string)
      PTR_T string;
 {
-  if (string)
-    free (string);
+  free (string);
 }
 
 #ifdef USING_BASH_MALLOC

Reply via email to