From f290746a363a971dc55355fd829eb0f3b936eb8e Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sun, 29 Jul 2018 22:35:36 -0400 Subject: [PATCH] Remove Coverity worakaround StreamState Use std::ostringstream instead. Eventually I'd like to see the output stream passed into the function of interest. It will avoid problems on some mobile OSes that don't have standard inputs and outputs. --- bench1.cpp | 99 +++++++++++++++++++++----------------- validat3.cpp | 132 +++++++++++++++++++++++++-------------------------- validat5.cpp | 48 +++++++++---------- validat6.cpp | 26 +++++----- validate.h | 27 ----------- 5 files changed, 158 insertions(+), 174 deletions(-) diff --git a/bench1.cpp b/bench1.cpp index 11dee0be..714a8637 100644 --- a/bench1.cpp +++ b/bench1.cpp @@ -13,6 +13,10 @@ #include "smartptr.h" #include "stdcpp.h" +#include +#include +#include + #if CRYPTOPP_MSC_VERSION # pragma warning(disable: 4355) #endif @@ -32,7 +36,7 @@ const double CLOCK_TICKS_PER_SECOND = (double)CLK_TCK; const double CLOCK_TICKS_PER_SECOND = 1000000.0; #endif -const byte defaultKey[] = "0123456789" // 168 + NULL +extern const byte defaultKey[] = "0123456789" // 168 + NULL "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" "00000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000"; @@ -43,67 +47,70 @@ time_t g_testBegin, g_testEnd; void OutputResultBytes(const char *name, const char *provider, double length, double timeTaken) { - // Coverity finding, also see http://stackoverflow.com/a/34509163/608639. - StreamState ss(std::cout); + std::ostringstream oss; // Coverity finding if (length < 0.000001f) length = 0.000001f; if (timeTaken < 0.000001f) timeTaken = 0.000001f; double mbs = length / timeTaken / (1024*1024); - std::cout << "\n" << name << "" << provider; - std::cout << std::setiosflags(std::ios::fixed); - std::cout << "" << std::setprecision(0) << std::setiosflags(std::ios::fixed) << mbs; + oss << "\n" << name << "" << provider; + oss << std::setiosflags(std::ios::fixed); + oss << "" << std::setprecision(0) << std::setiosflags(std::ios::fixed) << mbs; if (g_hertz > 1.0f) { const double cpb = timeTaken * g_hertz / length; if (cpb < 24.0f) - std::cout << "" << std::setprecision(2) << std::setiosflags(std::ios::fixed) << cpb; + oss << "" << std::setprecision(2) << std::setiosflags(std::ios::fixed) << cpb; else - std::cout << "" << std::setprecision(1) << std::setiosflags(std::ios::fixed) << cpb; + oss << "" << std::setprecision(1) << std::setiosflags(std::ios::fixed) << cpb; } g_logTotal += log(mbs); g_logCount++; + + std::cout << oss.str(); } void OutputResultKeying(double iterations, double timeTaken) { - // Coverity finding, also see http://stackoverflow.com/a/34509163/608639. - StreamState ss(std::cout); + std::ostringstream oss; // Coverity finding if (iterations < 0.000001f) iterations = 0.000001f; if (timeTaken < 0.000001f) timeTaken = 0.000001f; - std::cout << "" << std::setprecision(3) << std::setiosflags(std::ios::fixed) << (1000*1000*timeTaken/iterations); + oss << "" << std::setprecision(3) << std::setiosflags(std::ios::fixed) << (1000*1000*timeTaken/iterations); // Coverity finding if (g_hertz > 1.0f) - std::cout << "" << std::setprecision(0) << std::setiosflags(std::ios::fixed) << timeTaken * g_hertz / iterations; + oss << "" << std::setprecision(0) << std::setiosflags(std::ios::fixed) << timeTaken * g_hertz / iterations; + + std::cout << oss.str(); } void OutputResultOperations(const char *name, const char *provider, const char *operation, bool pc, unsigned long iterations, double timeTaken) { - // Coverity finding, also see http://stackoverflow.com/a/34509163/608639. - StreamState ss(std::cout); + std::ostringstream oss; // Coverity finding if (!iterations) iterations++; if (timeTaken < 0.000001f) timeTaken = 0.000001f; - std::cout << "\n" << name << " " << operation << (pc ? " with precomputation" : ""); - std::cout << "" << provider; - std::cout << "" << std::setprecision(2) << std::setiosflags(std::ios::fixed) << (1000*timeTaken/iterations); + oss << "\n" << name << " " << operation << (pc ? " with precomputation" : ""); + oss << "" << provider; + oss << "" << std::setprecision(2) << std::setiosflags(std::ios::fixed) << (1000*timeTaken/iterations); // Coverity finding if (g_hertz > 1.0f) { const double t = timeTaken * g_hertz / iterations / 1000000; - std::cout << "" << std::setprecision(2) << std::setiosflags(std::ios::fixed) << t; + oss << "" << std::setprecision(2) << std::setiosflags(std::ios::fixed) << t; } g_logTotal += log(iterations/timeTaken); g_logCount++; + + std::cout << oss.str(); } /* @@ -276,34 +283,40 @@ void BenchMarkByNameKeyLess(const char *factoryName, const char *displayName = N void AddHtmlHeader() { + std::ostringstream oss; + // HTML5 - std::cout << ""; - std::cout << "\n"; + oss << ""; + oss << "\n"; - std::cout << "\n"; - std::cout << "\n"; - std::cout << "\nSpeed Comparison of Popular Crypto Algorithms"; - std::cout << "\n"; - std::cout << "\n"; + oss << "\n"; + oss << "\n"; + oss << "\nSpeed Comparison of Popular Crypto Algorithms"; + oss << "\n"; + oss << "\n"; - std::cout << "\n"; + oss << "\n"; - std::cout << "\n

Crypto++ " << CRYPTOPP_VERSION / 100; - std::cout << '.' << (CRYPTOPP_VERSION % 100) / 10 << '.' << CRYPTOPP_VERSION % 10 << " Benchmarks

"; + oss << "\n

Crypto++ " << CRYPTOPP_VERSION / 100; + oss << '.' << (CRYPTOPP_VERSION % 100) / 10 << '.' << CRYPTOPP_VERSION % 10 << " Benchmarks

"; - std::cout << "\n

Here are speed benchmarks for some commonly used cryptographic algorithms.

"; + oss << "\n

Here are speed benchmarks for some commonly used cryptographic algorithms.

"; if (g_hertz > 1.0f) - std::cout << "\n

CPU frequency of the test platform is " << g_hertz << " Hz.

"; + oss << "\n

CPU frequency of the test platform is " << g_hertz << " Hz.

"; else - std::cout << "\n

CPU frequency of the test platform was not provided.

" << std::endl; + oss << "\n

CPU frequency of the test platform was not provided.

" << std::endl; + + std::cout << oss.str(); } void AddHtmlFooter() { + std::ostringstream oss; std::cout << "\n"; std::cout << "\n" << std::endl; + std::cout << oss.str(); } void BenchmarkWithCommand(int argc, const char* const argv[]) @@ -327,6 +340,7 @@ void Benchmark(Test::TestClass suites, double t, double hertz) { g_allocatedTime = t; g_hertz = hertz; + std::ostringstream oss; AddHtmlHeader(); @@ -338,37 +352,36 @@ void Benchmark(Test::TestClass suites, double t, double hertz) // Unkeyed algorithms if (suites & Test::Unkeyed) { - std::cout << "\n
"; + oss << "\n
"; Benchmark1(t, hertz); } // Shared key algorithms if (suites & Test::SharedKey) { - std::cout << "\n
"; + oss << "\n
"; Benchmark2(t, hertz); } // Public key algorithms if (suites & Test::PublicKey) { - std::cout << "\n
"; + oss << "\n
"; Benchmark3(t, hertz); } g_testEnd = ::time(NULLPTR); - { - StreamState state(std::cout); - std::cout << "\n

Throughput Geometric Average: " << std::setiosflags(std::ios::fixed); - std::cout << std::exp(g_logTotal/(g_logCount > 0.0f ? g_logCount : 1.0f)) << std::endl; - } + oss << "\n

Throughput Geometric Average: " << std::setiosflags(std::ios::fixed); + oss << std::exp(g_logTotal/(g_logCount > 0.0f ? g_logCount : 1.0f)) << std::endl; - std::cout << "\n

Test started at " << TimeToString(g_testBegin); - std::cout << "\n
Test ended at " << TimeToString(g_testEnd); - std::cout << std::endl; + oss << "\n

Test started at " << TimeToString(g_testBegin); + oss << "\n
Test ended at " << TimeToString(g_testEnd); + oss << std::endl; AddHtmlFooter(); + + std::cout << oss.str(); } void Benchmark1(double t, double hertz) diff --git a/validat3.cpp b/validat3.cpp index e393715d..218b08c1 100644 --- a/validat3.cpp +++ b/validat3.cpp @@ -1061,6 +1061,9 @@ bool TestMersenne() bool pass = true, fail = false; member_ptr rng; + std::ostringstream oss; + oss << std::setiosflags(std::ios::fixed) << std::setprecision(6); + try {rng.reset(new PadlockRNG);} catch (const PadlockRNG_Err &) {} if (rng.get()) @@ -1081,37 +1084,37 @@ bool TestMersenne() fail = !(msr & (1 << 6U)); pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " VIA RNG is activated\n"; + oss << "passed:"; + oss << " VIA RNG is activated\n"; // Bit 13 should be unset fail = !!(msr & (1 << 13U)); pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " von Neumann corrector is activated\n"; + oss << "passed:"; + oss << " von Neumann corrector is activated\n"; // Bit 14 should be unset fail = !!(msr & (1 << 14U)); pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " String filter is deactivated\n"; + oss << "passed:"; + oss << " String filter is deactivated\n"; // Bit 12:10 should be unset fail = !!(msr & (0x7 << 10U)); pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " Bias voltage is unmodified\n"; + oss << "passed:"; + oss << " Bias voltage is unmodified\n"; fail = false; if (t == zero || t == one) @@ -1119,10 +1122,10 @@ bool TestMersenne() pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " All 0's or all 1's test\n"; + oss << "passed:"; + oss << " All 0's or all 1's test\n"; MeterFilter meter(new Redirector(TheBitBucket())); Deflator deflator(new Redirector(meter)); @@ -1141,16 +1144,12 @@ bool TestMersenne() if (mv < 0.98f) fail = true; - // Coverity finding, also see http://stackoverflow.com/a/34509163/608639. - StreamState ss(std::cout); - std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(6); - pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " Maurer Randomness Test returned value " << mv << "\n"; + oss << "passed:"; + oss << " Maurer Randomness Test returned value " << mv << "\n"; fail = false; if (meter.GetTotalBytes() < SIZE) @@ -1158,10 +1157,10 @@ bool TestMersenne() pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " " << SIZE << " generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE\n"; + oss << "passed:"; + oss << " " << SIZE << " generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE\n"; try { @@ -1175,10 +1174,10 @@ bool TestMersenne() pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " discarded " << SIZE << " bytes\n"; + oss << "passed:"; + oss << " discarded " << SIZE << " bytes\n"; try { @@ -1202,14 +1201,15 @@ bool TestMersenne() pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " GenerateWord32 and Crop\n"; + oss << "passed:"; + oss << " GenerateWord32 and Crop\n"; } else - std::cout << "Padlock RNG generator not available, skipping test.\n"; + oss << "Padlock RNG generator not available, skipping test.\n"; + std::cout << oss.str(); return pass; } @@ -1220,6 +1220,9 @@ bool TestRDRAND() bool pass = true, fail = false; member_ptr rng; + std::ostringstream oss; + oss << std::setiosflags(std::ios::fixed) << std::setprecision(6); + try {rng.reset(new RDRAND);} catch (const RDRAND_Err &) {} if (rng.get()) @@ -1243,16 +1246,12 @@ bool TestRDRAND() if (mv < 0.98f) fail = true; - // Coverity finding, also see http://stackoverflow.com/a/34509163/608639. - StreamState ss(std::cout); - std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(6); - pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " Maurer Randomness Test returned value " << mv << "\n"; + oss << "passed:"; + oss << " Maurer Randomness Test returned value " << mv << "\n"; fail = false; if (meter.GetTotalBytes() < SIZE) @@ -1260,10 +1259,10 @@ bool TestRDRAND() pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " " << SIZE << " generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE\n"; + oss << "passed:"; + oss << " " << SIZE << " generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE\n"; try { @@ -1277,10 +1276,10 @@ bool TestRDRAND() pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " discarded " << SIZE << " bytes\n"; + oss << "passed:"; + oss << " discarded " << SIZE << " bytes\n"; try { @@ -1304,14 +1303,15 @@ bool TestRDRAND() pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " GenerateWord32 and Crop\n"; + oss << "passed:"; + oss << " GenerateWord32 and Crop\n"; } else - std::cout << "RDRAND generator not available, skipping test.\n"; + oss << "RDRAND generator not available, skipping test.\n"; + std::cout << oss.str(); return pass; } @@ -1322,6 +1322,9 @@ bool TestRDSEED() bool pass = true, fail = false; member_ptr rng; + std::ostringstream oss; + oss << std::setiosflags(std::ios::fixed) << std::setprecision(6); + try {rng.reset(new RDSEED);} catch (const RDSEED_Err &) {} if (rng.get()) @@ -1345,16 +1348,12 @@ bool TestRDSEED() if (mv < 0.98f) fail = true; - // Coverity finding, also see http://stackoverflow.com/a/34509163/608639. - StreamState ss(std::cout); - std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(6); - pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " Maurer Randomness Test returned value " << mv << "\n"; + oss << "passed:"; + oss << " Maurer Randomness Test returned value " << mv << "\n"; fail = false; if (meter.GetTotalBytes() < SIZE) @@ -1362,10 +1361,10 @@ bool TestRDSEED() pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " " << SIZE << " generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE\n"; + oss << "passed:"; + oss << " " << SIZE << " generated bytes compressed to " << meter.GetTotalBytes() << " bytes by DEFLATE\n"; try { @@ -1379,10 +1378,10 @@ bool TestRDSEED() pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " discarded " << SIZE << " bytes\n"; + oss << "passed:"; + oss << " discarded " << SIZE << " bytes\n"; try { @@ -1406,14 +1405,15 @@ bool TestRDSEED() pass &= !fail; if (fail) - std::cout << "FAILED:"; + oss << "FAILED:"; else - std::cout << "passed:"; - std::cout << " GenerateWord32 and Crop\n"; + oss << "passed:"; + oss << " GenerateWord32 and Crop\n"; } else - std::cout << "RDSEED generator not available, skipping test.\n"; + oss << "RDSEED generator not available, skipping test.\n"; + std::cout << oss.str(); return pass; } #endif diff --git a/validat5.cpp b/validat5.cpp index 44c004a9..b0b27849 100644 --- a/validat5.cpp +++ b/validat5.cpp @@ -69,10 +69,9 @@ struct HashTestTuple bool HashModuleTest(HashTransformation &md, const HashTestTuple *testSet, unsigned int testSetSize) { bool pass=true, fail; - SecByteBlock digest(md.DigestSize()); + std::ostringstream oss; - // Coverity finding, also see http://stackoverflow.com/a/34509163/608639. - StreamState ss(std::cout); + SecByteBlock digest(md.DigestSize()); for (unsigned int i=0; i