Changed the return type of strdup() to const char* (issue #658)

This commit is contained in:
Benoit Blanchon
2018-01-14 13:49:37 +01:00
parent e92612b511
commit ae0b7a3ebd
4 changed files with 8 additions and 7 deletions

View File

@ -5,6 +5,7 @@ HEAD
---- ----
* Changed the rules of string duplication (issue #658) * Changed the rules of string duplication (issue #658)
* Changed the return type of `strdup()` to `const char*` to prevent double duplication
> ### New rules for string duplication > ### New rules for string duplication
> >

View File

@ -38,19 +38,19 @@ class JsonBuffer : Internals::NonCopyable {
// Duplicates a string // Duplicates a string
// //
// char* strdup(TValue); // const char* strdup(TValue);
// TValue = const std::string&, const String&, // TValue = const std::string&, const String&,
template <typename TString> template <typename TString>
typename TypeTraits::EnableIf<!TypeTraits::IsArray<TString>::value, typename TypeTraits::EnableIf<!TypeTraits::IsArray<TString>::value,
char *>::type const char *>::type
strdup(const TString &src) { strdup(const TString &src) {
return Internals::StringTraits<TString>::duplicate(src, this); return Internals::StringTraits<TString>::duplicate(src, this);
} }
// //
// char* strdup(TValue); // const char* strdup(TValue);
// TValue = const char*, const char[N], const FlashStringHelper* // TValue = const char*, const char[N], const FlashStringHelper*
template <typename TString> template <typename TString>
char *strdup(const TString *src) { const char *strdup(const TString *src) {
return Internals::StringTraits<const TString *>::duplicate(src, this); return Internals::StringTraits<const TString *>::duplicate(src, this);
} }

View File

@ -10,14 +10,14 @@ TEST_CASE("DynamicJsonBuffer::strdup()") {
SECTION("Should return a copy") { SECTION("Should return a copy") {
char original[] = "hello"; char original[] = "hello";
char* copy = buffer.strdup(original); const char* copy = buffer.strdup(original);
strcpy(original, "world"); strcpy(original, "world");
REQUIRE(std::string("hello") == copy); REQUIRE(std::string("hello") == copy);
} }
SECTION("Given NULL, return NULL") { SECTION("Given NULL, return NULL") {
const char* original = NULL; const char* original = NULL;
char* copy = buffer.strdup(original); const char* copy = buffer.strdup(original);
REQUIRE(0 == copy); REQUIRE(0 == copy);
} }
} }

View File

@ -243,7 +243,7 @@ TEST_CASE("std::string") {
SECTION("JsonBuffer_strdup") { SECTION("JsonBuffer_strdup") {
std::string original("hello"); std::string original("hello");
char *copy = jb.strdup(original); const char *copy = jb.strdup(original);
original[0] = 'w'; original[0] = 'w';
REQUIRE(std::string("hello") == copy); REQUIRE(std::string("hello") == copy);
} }