问题
I've seen some posters stating that strdup
is evil. Is there a consensus on this? I've used it without any guilty feelings and can see no reason why it is worse than using malloc
/memcpy
.
The only thing I can think might earn strdup
a reputation is that callers might misuse it (eg. not realise they have to free the memory returned; try to strcat to the end of a strdup'ed string). But then malloc'ed strings are not free from the possibility of misuse either.
Thanks for the replies and apologies to those who consider the question unhelpful (votes to close). In summary of the replies, it seems that there is no general feeling that strdup
is evil per se, but a general consensus that it can, like many other parts of C, be used improperly or unsafely.
There is no 'correct' answer really, but for the sake of accepting one, I accepted @nneoneo's answer - it could equally have been @R..'s answer.
回答1:
Two reasons I can think of:
- It's not strictly ANSI C, but rather POSIX. Consequently, some compilers (e.g. MSVC) discourage use (MSVC prefers
_strdup
), and technically the C standard could define its ownstrdup
with different semantics sincestr
is a reserved prefix. So, there are some potential portability concerns with its use. - It hides its memory allocation. Most other
str
functions don't allocate memory, so users might be misled (as you say) into believing the returned string doesn't need to be freed.
But, aside from these points, I think that careful use of strdup
is justified, as it can reduce code duplication and provides a nice implementation for common idioms (such as strdup("constant string")
to get a mutable, returnable copy of a literal string).
回答2:
My answer is rather supporting strdup
and it is no worse than any other function in C.
POSIX is a standard and
strdup
is not too difficult to implement if portability becomes an issue.Whether to free the memory allocated by
strdup
shouldn't be an issue if anyone taken a little time to read the man page and understand howstrdup
works. If one doesn't understand how a function works, it's very likely the person is going to mess up something, this is applicable to any function, not juststrdup
.In C, memory & most other things are managed by the programmer, so strdup is no worse than forgetting to free
malloc
'ed memory, failing to null terminate a string, using incorrect format string inscanf
(and invoking undefined behaviour), accessing dangling pointer etc.
(I really wanted to post this as a comment, but couldn't add in a single comment. Hence, posted it as an answer).
回答3:
I haven't really heard strdup
described as evil, but some possible reasons some people dislike it:
- It's not standard C (but is in POSIX). However I find this reason silly because it's nearly a one-line function to add on systems that lack it.
- Blindly duplicating strings all over the place rather than using them in-place when possible wastes time and memory and introduces failure cases into code that might otherwise be failure-free.
- When you do need a copy of a string, it's likely you actually need more space to modify or build on it, and
strdup
does not give you that.
回答4:
I think the majority of the concern about strdup comes from security concerns regarding buffer over runs, and improperly formatted strings. If a non-null terminated string is passed to strdup it can allocated an undefined length string. I don't know if this can be specifically leveraged into an attack but in general it is good secure coding practice to only use string functions which take a maximum length instead of relying on the null character alone.
回答5:
Many people obviously don't, but I personally find strdup
evil for several reasons,
the main one being it hides the allocation. The other
str*
functions and most other standard functions require nofree
afterwards, sostrdup
looks innocuous enough and you can forget to clean up after it. dmckee suggested to just add it to your mental list of functions that need cleaning up after, but why? I don't see a big advantage over reducing two medium-length lines to one short one.It allocates memory on the heap always, and with C99's (is it 99?) VLAs, you have yet another reason to just use
strcpy
(you don't even needmalloc
). You can't always do this, but when you can, you should.It's not part of the ISO standard (but it is part of the POSIX standard, thanks Wiz), but that's really a small point as R.. mentioned that it can be added easily. If you write portable programs, I'm not sure how you'd tell if it was already defined or not though...
These are of course a few of my own reasons, no one else's. To answer your question, there is no consensus that I'm aware of.
If you're writing programs just for yourself and you find strdup
no problem, then there's much less reason not to use it than if you are writing a program to be read by many people of many skill levels and ages.
回答6:
My reason for disliking strdup, which hasn't been mentioned, is that it is resource allocation without a natural pair. Let's try a silly game: I say malloc
, you say free
. I say open
you say close
. I say create
you say destroy
. I say strdup
you say ....?
Actually, the answer to strdup
is free
of course, and the function would have been better named malloc_and_strcpy
to make that clear. But many C programmers don't think of it that way and forgets that strdup
requires its opposite or "ending" free
to deallocate.
In my experience, it is very common to find memory leaks in code which calls strdup
. It's an odd function which combines strlen
, malloc
and strcpy
.
来源:https://stackoverflow.com/questions/12984948/why-is-strdup-considered-to-be-evil