summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2010-06-29 01:12:49 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2010-06-29 01:12:49 +0000
commita65140ef077e76a3d4eaf95ce7f2df09d04741e8 (patch)
treeb2373c7ead999999156b620a06557ca0601d1181
parentde6e367b5b652335d1dc6435b6bbef9b64a748a7 (diff)
downloadcryptopp-a65140ef077e76a3d4eaf95ce7f2df09d04741e8.tar.gz
randomize test buffer length and alignment to better detect alignment-related bugs
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@494 57ff6487-cd31-0410-9ec3-f628ee90f5f0
-rw-r--r--datatest.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/datatest.cpp b/datatest.cpp
index b7b73da..cfac74a 100644
--- a/datatest.cpp
+++ b/datatest.cpp
@@ -57,9 +57,22 @@ const std::string & GetRequiredDatum(const TestData &data, const char *name)
return i->second;
}
+void RandomizedTransfer(BufferedTransformation &source, BufferedTransformation &target, bool finish)
+{
+ while (source.MaxRetrievable() > (finish ? 0 : 4096))
+ {
+ byte buf[4096+64];
+ word32 start = GlobalRNG().GenerateWord32(0, 63);
+ word32 len = GlobalRNG().GenerateWord32(1, UnsignedMin(4096U, source.MaxRetrievable()));
+ source.Get(buf+start, len);
+ target.Put(buf+start, len);
+ }
+}
+
void PutDecodedDatumInto(const TestData &data, const char *name, BufferedTransformation &target)
{
std::string s1 = GetRequiredDatum(data, name), s2;
+ ByteQueue q;
while (!s1.empty())
{
@@ -67,7 +80,7 @@ void PutDecodedDatumInto(const TestData &data, const char *name, BufferedTransfo
{
s1 = s1.substr(1);
if (s1.empty())
- return; //avoid invalid read if s1 is empty
+ goto end; // avoid invalid read if s1 is empty
}
int repeat = 1;
@@ -95,14 +108,15 @@ void PutDecodedDatumInto(const TestData &data, const char *name, BufferedTransfo
s1 = s1.substr(STDMIN(s1.find(' '), s1.length()));
}
- ByteQueue q;
while (repeat--)
{
q.Put((const byte *)s2.data(), s2.size());
- if (q.MaxRetrievable() > 4*1024 || repeat == 0)
- q.TransferTo(target);
+ RandomizedTransfer(q, target, false);
}
}
+
+end:
+ RandomizedTransfer(q, target, true);
}
std::string GetDecodedDatum(const TestData &data, const char *name)