Возвращаясь к теме про фаззеры.
??? ???, ??????? ? ????????? ??? ????????? ?????? ?????? ? ???????? ? ????? ????????. ????? EntropyGenerator – ??????? ?????? ?????????? ????????? ?????.
class EntropyGenerator
{
public:
EntropyGenerator():
m_replay_index(std::numeric_limits<size_t>::max())
{
m_log.reserve(1024 * 64);
}
void
replay()
{
m_replay_index = 0;
}
size_t
generate(
size_t up_to
)
{
size_t r;
if (m_replay_index == std::numeric_limits<size_t>::max())
{
if (up_to > 0)
{
errno_t err = rand_s(&r);
BOOST_REQUIRE(err == 0);
r /= std::numeric_limits<size_t>::max() / up_to;
}
else
{
r = 0;
}
m_log.push_back(r);
}
else
{
r = m_log[m_replay_index++];
if (m_replay_index == m_log.size())
{
// This is the last generated number
__debugbreak();
}
}
BOOST_REQUIRE((r == 0 && up_to == 0) || (0 <= r && r < up_to));
return r;
}
protected:
std::vector<size_t> m_log;
size_t m_replay_index;
};
EntropyGenerator ???????????? ??? ?????? ??????:
- ??? ?????? ??????? ?? ?????????? ????????? ????? ? ???????? ????????? ? ????????? ?????? ??????????????? ????? ? ???;
- ??? ?????? ? ????????? ????????, EntropyGenerator ????????????? ? ????? ??????????????? ??????????????? ?????. ??? ?????? ?????????? ???????????????? ????? ??????????? ????? ????????, ???????? ??????????, ??? ?????????? ? ?????? ???? ? ?????????.
??????? runStress ????????? ?????????? ????, ???????? ? ?????? ???? ???????? ???? ??????? ?????? ?????????? ???. ????? ????????? ????? ??????????? ??????????. ? ????????? Boost.Test, ? ??? ??????????? ??????? (BOOST_REQUIRE ? Ko) ??????? ??????????.
template <typename TestT>
runStress(
TestT* test,
void
size_t replay_count
)
{
EntropyGenerator rnd;
for (size_t i = 0; i <= replay_count; )
{
try
{
// Run test
(*test)(rnd);
return;
}
catch (...)
{
if (i < replay_count)
{
++i;
rnd.replay();
}
else
throw;
}
}
}
?????? ?????:
// 64 chars
char randomData[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]";
void
stressLoadCells(
EntropyGenerator& rnd
)
{
for (size_t repeat = 20; repeat > 0; --repeat)
{
// Fill the source with random data of random length
Source source;
source.m_data.assign(rnd.generate(128), ' ');
for (
std::string::iterator i = source.m_data.begin(), i_end = source.m_data.end();
i != i_end;
++i)
{
*i = randomData[rnd.generate(64)];
}
// Create buffer with a cell of random size
Buffer buffer(&source, rnd.generate(15) + 1);
for (size_t i = 0; i < 128; ++i)
{
size_t j = rnd.generate(static_cast<size_t>(source.size()));
BOOST_REQUIRE(buffer[j] == source.m_data[j]);
}
}
}
void
stressTestLoadCells()
{
runStress(&stressLoadCells, 1);
}
????? ????? ? ???? – ??????? stressTestLoadCells. ???????? ??? ?????????? ? ??????? stressLoadCells, ??????? ? ?????????? ???? (? ?????? ??????) ??? ????????? (? ?????? ????) ???.
???? ??????? ??? ??????. ??????? ????????? ????????? ????????, ????? ? ???? ????? ???. ??? ??? ????? ???????? ????????? ????????? ????? ?????????? rnd.generate ? ?????? ??????????. ?????? ? ???????? ??????????, ???? ???? ??? ??? ?????? ???????????. ??? ??????????? ????????? ??????? ?????????????????? ????? ??? ????, ????? ?? ????? ?????????????. ??? ??????????? ?????????? ? ???????? ?? ?? ????????? ?????, ? ?? N ??????? rnd.generate.
Cross-posted from blog.not-a-kernel-guy.com.