Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CNativeW::SetString に NULL を指定した場合に wcslen に NULL を渡して落ちてしまう不具合を修正 #1087

Merged
merged 3 commits into from
Nov 6, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion sakura_core/mem/CNativeW.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,10 @@ void CNativeW::SetString( const wchar_t* pData, int nDataLen )
// バッファの内容を置き換える
void CNativeW::SetString( const wchar_t* pszData )
{
CNative::SetRawData(pszData,wcslen(pszData) * sizeof(wchar_t));
if (pszData)
CNative::SetRawData(pszData,wcslen(pszData) * sizeof(wchar_t));
else
CMemory::Clear();
}

void CNativeW::SetStringHoldBuffer( const wchar_t* pData, int nDataLen )
Expand Down
2 changes: 1 addition & 1 deletion sakura_core/mem/CNativeW.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class CNativeW : public CNative{

//WCHAR
void SetString( const wchar_t* pData, int nDataLen ); //!< バッファの内容を置き換える。nDataLenは文字単位。
void SetString( const wchar_t* pszData ); //!< バッファの内容を置き換える
void SetString( const wchar_t* pszData ); //!< バッファの内容を置き換える。NULL 指定時はメモリ解放を行い、文字列長はゼロになる
void SetStringHoldBuffer( const wchar_t* pData, int nDataLen );
void AppendString( const wchar_t* pszData ); //!< バッファの最後にデータを追加する
void AppendString( const wchar_t* pszData, int nLength ); //!< バッファの最後にデータを追加する。nLengthは文字単位。成功すればtrue。メモリ確保に失敗したらfalseを返す。
Expand Down
38 changes: 22 additions & 16 deletions tests/unittests/test-cnative.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,19 @@ TEST(CNativeW, ConstructWithStringEmpty)
}

/*!
* @brief コンストラクタ(nullptr指定)の仕様
* @remark 構築できない(実行時エラーになる)
* @note バグですね(^^;
* @brief コンストラクタ(NULL指定)の仕様
* @remark バッファは確保されない
* @remark 文字列長はゼロになる
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このクラスに関して、テストを整備する目的は挙動を仕様化することなので、想定結果をコメントで入れたいっす。

まあ、後で自分でPR出しますんで対応不要ですが。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2d5a94a でコメントを追加しました。

TEST(CNativeW, ConstructWithStringNull)
{
volatile int ret = 0;
ASSERT_DEATH({ CNativeW value(NULL); ret = value.capacity(); }, ".*");
(void)ret;
CNativeW value(NULL);
EXPECT_EQ(0, value.GetStringLength());
EXPECT_EQ(nullptr, value.GetStringPtr());

CNativeW value2(nullptr);
EXPECT_EQ(0, value2.GetStringLength());
EXPECT_EQ(nullptr, value2.GetStringPtr());
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

キャパがゼロになるのも仕様な認識です。

これも後追いでいいです。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2d5a94a でコメントを追加しました。


/*!
Expand Down Expand Up @@ -236,14 +240,15 @@ TEST(CNativeW, AssignString)

/*!
* @brief 代入演算子(nullptr指定)の仕様
* @remark 代入できない(実行時エラーになる)
* @note バグですね(^^;
* @remark バッファを確保している場合は解放される
* @remark 文字列長はゼロになる
*/
TEST(CNativeW, AssignStringNullPointer)
{
volatile int ret = 0;
ASSERT_DEATH({ CNativeW value; value = nullptr; ret = value.capacity(); }, ".*");
(void)ret;
CNativeW value(L"test");
value = nullptr;
EXPECT_EQ(0, value.GetStringLength());
EXPECT_EQ(nullptr, value.GetStringPtr());
}

/*!
Expand Down Expand Up @@ -303,14 +308,15 @@ TEST(CNativeW, AppendString)

/*!
* @brief 加算代入演算子(nullptr指定)の仕様
* @remark 加算代入できない(実行時エラーになる)
* @note バグですね(^^;
* @remark 加算代入しても内容に変化無し
*/
TEST(CNativeW, AppendStringNullPointer)
{
volatile int ret = 0;
ASSERT_DEATH({ CNativeW value; value += nullptr; ret = value.capacity(); }, ".*");
(void)ret;
CNativeW org(L"orz");
CNativeW value(org);
value += nullptr;
EXPECT_EQ(value.GetStringLength(), org.GetStringLength());
EXPECT_TRUE(CNativeW::IsEqual(value, org));
}

/*!
Expand Down