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
|
// 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.
void processIntBuffer(int* buf) {
std::ignore = buf[0];
}
void processUint8Buffer(uint8_t* buf) {
std::ignore = buf[0];
}
void testPointerPassing() {
int singleInt;
// Expected rewrite:
// processIntBuffer(base::SpanFromSingleElement(singleInt));
processIntBuffer(&singleInt);
// processUint8Buffer(base::as_writable_byte_span(
// base::SpanFromSingleElement(singleInt)));
processUint8Buffer(reinterpret_cast<uint8_t*>(&singleInt));
int intArray[10];
// Not using &.
// No rewrite expected.
processIntBuffer(intArray);
// Triggers pointer-into-array rewriting (issue 402806166).
// Expected rewrite:
// processIntBuffer(intArray);
processIntBuffer(&intArray[0]);
// 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[0]);
void* voidPtr;
// void** should get rewritten.
// Expected rewrite:
// processUint8Buffer(
// base::as_writable_byte_span(base::SpanFromSingleElement(voidPtr)));
processUint8Buffer(reinterpret_cast<uint8_t*>(&voidPtr));
}
// Function that takes a pointer to an integer pointer.
void processIntPointerBuffer(int** pointerToData) {
std::ignore = pointerToData[0];
}
void testPointerToPointerPassing() {
int* singleIntPointer;
// Expected rewrite:
// processIntPointerBuffer(base::SpanFromSingleElement(singleIntPointer));
processIntPointerBuffer(&singleIntPointer);
int* intArrayOfPointers[10];
// Not using &.
// No rewrite expected.
processIntPointerBuffer(intArrayOfPointers);
// Triggers pointer-into-array rewriting (issue 402806166).
// Expected rewrite:
// processIntPointerBuffer(intArrayOfPointers);
processIntPointerBuffer(&intArrayOfPointers[0]);
std::vector<int*> intVector;
// Triggers pointer-into-container rewriting (crrev.com/c/6304404).
// Expected rewrite:
// processIntPointerBuffer(intVector);
processIntPointerBuffer(&intVector[0]);
}
struct MyStruct {
int field;
};
void testFieldPointerPassing() {
MyStruct myStruct;
// Expected rewrite:
// processIntBuffer(base::SpanFromSingleElement(myStruct.field));
processIntBuffer(&myStruct.field);
}
void testParamPointerPassing(int param) {
// Expected rewrite:
// processIntBuffer(base::SpanFromSingleElement(param));
processIntBuffer(¶m);
}
|