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