1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <array>
#include <cstdint>
#include <vector>
// Tests related to single_element_expr matcher.
#include "base/containers/auto_spanification_helper.h"
#include "base/containers/span.h"
void processIntBuffer(base::span<int> buf) {
std::ignore = buf[0];
}
void processUint8Buffer(base::span<uint8_t> buf) {
std::ignore = buf[0];
}
void testPointerPassing() {
int singleInt;
// Expected rewrite:
// processIntBuffer(base::SpanFromSingleElement(singleInt));
processIntBuffer(base::SpanFromSingleElement(singleInt));
// processUint8Buffer(base::as_writable_byte_span(
// base::SpanFromSingleElement(singleInt)));
processUint8Buffer(
base::as_writable_byte_span(base::SpanFromSingleElement(singleInt)));
int intArray[10];
// Not using &.
// No rewrite expected.
processIntBuffer(intArray);
// Triggers pointer-into-array rewriting (issue 402806166).
// Expected rewrite:
// processIntBuffer(intArray);
processIntBuffer(intArray);
// Do not rewrite because code may be expecting an buffer with >1 size.
// No rewrite expected.
processUint8Buffer(reinterpret_cast<uint8_t*>(&intArray));
std::array<int, 5> stdArray;
// Do not rewrite because code may be expecting an buffer with >1 size.
// No rewrite expected.
processUint8Buffer(reinterpret_cast<uint8_t*>(&stdArray));
std::vector<int> intVector;
// We know how to get size from Vector so just leave it alone to
// construct a span.
// Expected rewrite:
// processIntBuffer(intVector);
processIntBuffer(intVector);
void* voidPtr;
// void** should get rewritten.
// Expected rewrite:
// processUint8Buffer(
// base::as_writable_byte_span(base::SpanFromSingleElement(voidPtr)));
processUint8Buffer(
base::as_writable_byte_span(base::SpanFromSingleElement(voidPtr)));
}
// Function that takes a pointer to an integer pointer.
void processIntPointerBuffer(base::span<int*> pointerToData) {
std::ignore = pointerToData[0];
}
void testPointerToPointerPassing() {
int* singleIntPointer;
// Expected rewrite:
// processIntPointerBuffer(base::SpanFromSingleElement(singleIntPointer));
processIntPointerBuffer(base::SpanFromSingleElement(singleIntPointer));
int* intArrayOfPointers[10];
// Not using &.
// No rewrite expected.
processIntPointerBuffer(intArrayOfPointers);
// Triggers pointer-into-array rewriting (issue 402806166).
// Expected rewrite:
// processIntPointerBuffer(intArrayOfPointers);
processIntPointerBuffer(intArrayOfPointers);
std::vector<int*> intVector;
// Triggers pointer-into-container rewriting (crrev.com/c/6304404).
// Expected rewrite:
// processIntPointerBuffer(intVector);
processIntPointerBuffer(intVector);
}
struct MyStruct {
int field;
};
void testFieldPointerPassing() {
MyStruct myStruct;
// Expected rewrite:
// processIntBuffer(base::SpanFromSingleElement(myStruct.field));
processIntBuffer(base::SpanFromSingleElement(myStruct.field));
}
void testParamPointerPassing(int param) {
// Expected rewrite:
// processIntBuffer(base::SpanFromSingleElement(param));
processIntBuffer(base::SpanFromSingleElement(param));
}
|