| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <assert.h> |
| #include <unittest/unittest.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <limits.h> |
| |
| bool normal_math_test(void) { |
| BEGIN_TEST; |
| |
| int a = 5; |
| int b = atoi("6"); // avoid compiler optimizations |
| int c = a+b; |
| EXPECT_EQ(11, c, "The world is broken"); |
| |
| END_TEST; |
| } |
| |
| bool signed_overflow_test(void) { |
| BEGIN_TEST; |
| |
| ASSERT_DEATH([](void*) { |
| int a = INT_MAX; |
| int b = atoi("6"); // avoid compiler optimizations |
| int c = a+b; // crash occurs here |
| printf("%d\n", c); // should not be reached. |
| }, 0, "overflow should have caused a crash"); |
| |
| END_TEST; |
| } |
| |
| bool signed_underflow_test(void) { |
| BEGIN_TEST; |
| |
| ASSERT_DEATH([](void*) { |
| int a = INT_MIN; |
| int b = atoi("-6"); // avoid compiler optimizations |
| int c = a+b; // crash occurs here |
| printf("%d\n", c); // should not be reached. |
| }, 0, "underflow should have caused a crash"); |
| |
| END_TEST; |
| } |
| |
| bool divide_by_zero_test(void) { |
| BEGIN_TEST; |
| |
| ASSERT_DEATH([](void*) { |
| int a = 5; |
| int b = atoi("0"); // avoid compiler optimizations |
| int c = a/b; // crash occurs here |
| printf("%d\n", c); // should not be reached. |
| }, 0, "divide by zero should have caused a crash"); |
| |
| END_TEST; |
| } |
| |
| BEGIN_TEST_CASE(integer_tests) |
| RUN_TEST(normal_math_test) |
| RUN_TEST_ENABLE_CRASH_HANDLER(signed_overflow_test) |
| RUN_TEST_ENABLE_CRASH_HANDLER(signed_underflow_test) |
| RUN_TEST_ENABLE_CRASH_HANDLER(divide_by_zero_test) |
| END_TEST_CASE(integer_tests) |