diff options
author | Jim Meyering <meyering@gcc.gnu.org> | 2011-04-20 18:18:43 +0000 |
---|---|---|
committer | Jim Meyering <meyering@gcc.gnu.org> | 2011-04-20 18:18:43 +0000 |
commit | 53eebfbf949c9cfe6a060a91a09242cb7204f6d8 (patch) | |
tree | 383467c3fd67db83bd7cf20b900410bf5d8b1a80 /gcc | |
parent | 6788475ac17e1c9ed67dddac0e3a519cccf0a017 (diff) | |
download | gcc-53eebfbf949c9cfe6a060a91a09242cb7204f6d8.zip gcc-53eebfbf949c9cfe6a060a91a09242cb7204f6d8.tar.gz gcc-53eebfbf949c9cfe6a060a91a09242cb7204f6d8.tar.bz2 |
discourage unnecessary use of if before free
* README.Portability: Explain why "if (P) free (P)" is best avoided.
From-SVN: r172784
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/README.Portability | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/gcc/README.Portability b/gcc/README.Portability index 32a33e2..4101a2f 100644 --- a/gcc/README.Portability +++ b/gcc/README.Portability @@ -51,14 +51,28 @@ foo (bar, ) needs to be coded in some other way. -free and realloc ----------------- +Avoid unnecessary test before free +---------------------------------- -Some implementations crash upon attempts to free or realloc the null -pointer. Thus if mem might be null, you need to write +Since SunOS 4 stopped being a reasonable portability target, +(which happened around 2007) there has been no need to guard +against "free (NULL)". Thus, any guard like the following +constitutes a redundant test: + + if (P) + free (P); + +It is better to avoid the test.[*] +Instead, simply free P, regardless of whether it is NULL. + +[*] However, if your profiling exposes a test like this in a +performance-critical loop, say where P is nearly always NULL, and +the cost of calling free on a NULL pointer would be prohibitively +high, consider using __builtin_expect, e.g., like this: + + if (__builtin_expect (ptr != NULL, 0)) + free (ptr); - if (mem) - free (mem); Trigraphs @@ -194,4 +208,3 @@ o Passing incorrect types to fprintf and friends. o Adding a function declaration for a module declared in another file to a .c file instead of to a .h file. - |