absl_hardening_test.cc 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <limits>
  5. #include <vector>
  6. #include "gtest/gtest.h"
  7. #include "third_party/abseil-cpp/absl/base/options.h"
  8. #include "third_party/abseil-cpp/absl/container/fixed_array.h"
  9. #include "third_party/abseil-cpp/absl/container/inlined_vector.h"
  10. #include "third_party/abseil-cpp/absl/strings/string_view.h"
  11. #include "third_party/abseil-cpp/absl/types/optional.h"
  12. #include "third_party/abseil-cpp/absl/types/span.h"
  13. #include "third_party/abseil-cpp/absl/types/variant.h"
  14. namespace {
  15. #if !ABSL_OPTION_HARDENED
  16. # error "Define ABSL_OPTION_HARDENED to 1 in absl/base/options.h"
  17. #endif
  18. TEST(AbslHardeningTest, Optional) {
  19. absl::optional<int> optional;
  20. EXPECT_DEATH_IF_SUPPORTED(*optional, "");
  21. }
  22. TEST(AbslHardeningTest, StringView) {
  23. absl::string_view view("foo");
  24. EXPECT_DEATH_IF_SUPPORTED(view[4], "");
  25. EXPECT_DEATH_IF_SUPPORTED(view.remove_prefix(10), "");
  26. EXPECT_DEATH_IF_SUPPORTED(view.remove_suffix(10), "");
  27. absl::string_view empty("");
  28. EXPECT_DEATH_IF_SUPPORTED(empty.front(), "");
  29. EXPECT_DEATH_IF_SUPPORTED(empty.back(), "");
  30. }
  31. TEST(AbslHardeningTest, FixedArray) {
  32. absl::FixedArray<int, 4> fixed_array(0);
  33. EXPECT_DEATH_IF_SUPPORTED(fixed_array[1], "");
  34. EXPECT_DEATH_IF_SUPPORTED(fixed_array.front(), "");
  35. EXPECT_DEATH_IF_SUPPORTED(fixed_array.back(), "");
  36. }
  37. TEST(AbslHardeningTest, InlinedVector) {
  38. absl::InlinedVector<int, 10> inlined_vector;
  39. EXPECT_DEATH_IF_SUPPORTED(inlined_vector[1], "");
  40. EXPECT_DEATH_IF_SUPPORTED(inlined_vector.front(), "");
  41. EXPECT_DEATH_IF_SUPPORTED(inlined_vector.back(), "");
  42. EXPECT_DEATH_IF_SUPPORTED(
  43. inlined_vector.resize(inlined_vector.max_size() + 1), "");
  44. EXPECT_DEATH_IF_SUPPORTED(inlined_vector.pop_back(), "");
  45. auto it = inlined_vector.end();
  46. EXPECT_DEATH_IF_SUPPORTED(inlined_vector.erase(it), "");
  47. }
  48. TEST(AbslHardeningTest, Span) {
  49. std::vector<int> v;
  50. auto span = absl::Span<const int>(v);
  51. EXPECT_DEATH_IF_SUPPORTED(span.front(), "");
  52. EXPECT_DEATH_IF_SUPPORTED(span.back(), "");
  53. EXPECT_DEATH_IF_SUPPORTED(span.remove_prefix(10), "");
  54. EXPECT_DEATH_IF_SUPPORTED(span.remove_suffix(10), "");
  55. EXPECT_DEATH_IF_SUPPORTED(span[10], "");
  56. std::vector<int> v1 = {1, 2, 3, 4};
  57. EXPECT_DEATH_IF_SUPPORTED(absl::MakeSpan(&v1[2], &v[0]), "");
  58. EXPECT_DEATH_IF_SUPPORTED(absl::MakeConstSpan(&v1[2], &v[0]), "");
  59. }
  60. TEST(AbslHardeningTest, Variant) {
  61. absl::variant<int, std::string> variant = 5;
  62. EXPECT_DEATH_IF_SUPPORTED(absl::get<std::string>(variant), "");
  63. EXPECT_DEATH_IF_SUPPORTED(absl::get<1>(variant), "");
  64. }
  65. } // namespace