From f28b285ac3ff8700058ddf932767f4a3e06cbd29 Mon Sep 17 00:00:00 2001 From: Peter Goodman Date: Sun, 10 Dec 2017 14:39:05 -0500 Subject: [PATCH] Removed usage of old name, added in a Euler power of like primes example. When the pairwise ASSERT_NEs are absent, you get interesting results that show examples of integer overflows. --- examples/CMakeLists.txt | 3 +++ examples/Euler.cpp | 44 +++++++++++++++++++++++++++++++++++++++++ src/lib/Stream.c | 8 ++++---- 3 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 examples/Euler.cpp diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index f79acb8..a78eedc 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -19,6 +19,9 @@ target_link_libraries(Fixture deepstate) add_executable(Primes Primes.cpp) target_link_libraries(Primes deepstate) +add_executable(Euler Euler.cpp) +target_link_libraries(Euler deepstate) + add_executable(IntegerOverflow IntegerOverflow.cpp) target_link_libraries(IntegerOverflow deepstate) diff --git a/examples/Euler.cpp b/examples/Euler.cpp new file mode 100644 index 0000000..8a341f7 --- /dev/null +++ b/examples/Euler.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2017 Trail of Bits, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include + +using namespace deepstate; + +static unsigned pow5(unsigned v) { + return v * v * v * v * v; +} + +TEST(Euler, SumsOfLikePowers) { + symbolic_unsigned a, b, c, d, e; + ASSERT_GT(a, 1); + ASSERT_GT(b, 1); + ASSERT_GT(c, 1); + ASSERT_GT(d, 1); + ASSERT_GT(e, 1); + ASSERT_NE(a, b); ASSERT_NE(a, c); ASSERT_NE(a, d); ASSERT_NE(a, e); + ASSERT_NE(b, c); ASSERT_NE(b, d); ASSERT_NE(b, e); + ASSERT_NE(c, d); ASSERT_NE(c, e); + ASSERT_NE(d, e); + ASSERT_NE(pow5(a) + pow5(b) + pow5(c) + pow5(d), pow5(e)) + << a << "^5 + " << b << "^5" << " + " << c + << "^5 + " << d << "^5 = " << e << "^5"; +} + +int main(void) { + return DeepState_Run(); +} diff --git a/src/lib/Stream.c b/src/lib/Stream.c index 0726ba5..ee57704 100644 --- a/src/lib/Stream.c +++ b/src/lib/Stream.c @@ -277,11 +277,11 @@ void DeepState_StreamResetFormatting(enum DeepState_LogLevel level) { memset(&(stream->options), 0, sizeof(stream->options)); } -static int McTest_NumLsInt64BitFormat = 2; +static int DeepState_NumLsInt64BitFormat = 2; /* `PRId64` will be "ld" or "lld" */ -DEEPSTATE_INITIALIZER(McTest_NumLsFor64BitFormat) { - McTest_NumLsInt64BitFormat = (PRId64)[1] == 'd' ? 1 : 2; +DEEPSTATE_INITIALIZER(DeepState_NumLsFor64BitFormat) { + DeepState_NumLsInt64BitFormat = (PRId64)[1] == 'd' ? 1 : 2; } /* Approximately do string format parsing and convert it into calls into our @@ -419,7 +419,7 @@ get_length_char: if (!length) { length = 1; - } else if (num_ls >= McTest_NumLsInt64BitFormat) { + } else if (num_ls >= DeepState_NumLsInt64BitFormat) { length = 8; }