• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifdef UNSAFE_BUFFERS_BUILD
6 // TODO(crbug.com/341324165): Fix and remove.
7 #pragma allow_unsafe_buffers
8 #endif
9 
10 #include "base/memory/raw_span.h"
11 
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 
15 // This file contains tests related to raw_span, to show that they
16 // convert to span.
17 
TEST(RawSpan,ConvertToSpan)18 TEST(RawSpan, ConvertToSpan) {
19   int arr[3] = {100, 101, 102};
20   base::raw_span<int> span1(arr);
21   base::span<int> span2(span1);
22   base::span<int> span3;
23   span3 = span1;
24 
25   EXPECT_THAT(span1, ::testing::ElementsAre(100, 101, 102));
26   EXPECT_THAT(span2, ::testing::ElementsAre(100, 101, 102));
27   EXPECT_THAT(span3, ::testing::ElementsAre(100, 101, 102));
28 }
29 
TEST(RawSpan,ConvertFromSpan)30 TEST(RawSpan, ConvertFromSpan) {
31   int arr[3] = {100, 101, 102};
32   base::span<int> span1(arr);
33   base::raw_span<int> span2(span1);
34   base::raw_span<int> span3;
35   span3 = span1;
36 
37   EXPECT_THAT(span1, ::testing::ElementsAre(100, 101, 102));
38   EXPECT_THAT(span2, ::testing::ElementsAre(100, 101, 102));
39   EXPECT_THAT(span3, ::testing::ElementsAre(100, 101, 102));
40 }
41 
TEST(RawSpan,UnderstandsDanglingAttribute)42 TEST(RawSpan, UnderstandsDanglingAttribute) {
43   // Test passes if it doesn't trip Dangling Ptr Detectors.
44   int* arr = new int[3];
45   base::raw_span<int, DisableDanglingPtrDetection> span(arr, 3u);
46   delete[] span.data();
47 }
48 
TEST(RawSpan,ExtractAsDangling)49 TEST(RawSpan, ExtractAsDangling) {
50   // Test passes if it doesn't trip Dangling Ptr Detectors.
51   int* arr = new int[3];
52   base::raw_span<int> span(arr, 3u);
53   delete[] base::ExtractAsDanglingSpan(span).data();
54 }
55 
TEST(RawSpan,SameSlotAssignmentWhenDangling)56 TEST(RawSpan, SameSlotAssignmentWhenDangling) {
57   int* arr = new int[3];
58   base::raw_span<int, DisableDanglingPtrDetection> span(arr, 3u);
59   delete[] arr;  // Make the pointer dangle.
60 
61   // This test is designed to test for crbug.com/347461704, but as #comment13
62   // explains, `raw_span<>` doesn't exhibit the suspected buggy behavior. Keep
63   // the test just in case the implementation changes in the future.
64   span = span.subspan<1>();
65 }
66