1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright (c) 2016 The Chromium Authors. All rights reserved. 2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// found in the LICENSE file. 4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Blacklisted typedefs 6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef __INTMAX_TYPE__ intmax_t; 7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef __UINTMAX_TYPE__ uintmax_t; 8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef int intptr_t; 9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef unsigned int uintptr_t; 10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef __WINT_TYPE__ wint_t; 11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef __SIZE_TYPE__ size_t; 12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef __SIZE_TYPE__ rsize_t; 13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef long ssize_t; 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef __PTRDIFF_TYPE__ ptrdiff_t; 15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef unsigned int dev_t; 16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef int off_t; 17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef long clock_t; 18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef int time_t; 19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef long suseconds_t; 20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Other typedefs 22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef int int32_t; 23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef unsigned int uint32_t; 24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef long int64_t; 25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef unsigned long uint64_t; 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace std { 28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T> 30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct allocator {}; 31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T, class A = allocator<T>> 33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct vector {}; 34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class F, class S> 36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct pair {}; 37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // namespace std 39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace base { 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass Pickle {}; 43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T, class... Ts> 45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct Tuple { 46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch T value; 47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // namespace base 50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace IPC { 52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class... T> 54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct CheckedTuple { 55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef base::Tuple<T...> Tuple; 56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T> 59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct ParamTraits { 60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void Write(base::Pickle*, const T&) {} 61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T> 64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid WriteParam(base::Pickle* pickle, const T& value) { 65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ParamTraits<T>::Write(pickle, value); 66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // namespace IPC 69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch/* Test IPC::WriteParam() usage in templates. ERRORS: 6 */ 72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct Data { 74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t value; 75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch size_t size; 76f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 77f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 78f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <> 79f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct IPC::ParamTraits<Data> { 80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void Write(base::Pickle* pickle, const Data& p) { 81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // OK: WriteParam() called in explicit specialization 82f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteParam(pickle, p.value); // OK 83f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteParam(pickle, p.size); // ERROR 84f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 85f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 86f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 87f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T> 88f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct Container { 89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch T value; 90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 91f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 92f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T> 93f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct IPC::ParamTraits<Container<T>> { 94f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void Write(base::Pickle* pickle, const Container<T>& container) { 95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // NOT CHECKED: T is not explicitly referenced 96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, container.value); // NOT CHECKED 97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteParam(pickle, container.value); // NOT CHECKED 98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // NOT CHECKED: T explicitly referenced 100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam<T>(pickle, container.value); // NOT CHECKED 101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteParam<T>(pickle, container.value); // NOT CHECKED 102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 103f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // OK: explicit cast to non-dependent allowed type 104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteParam(pickle, static_cast<uint32_t>(container.value)); // OK 105f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 106f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // ERROR: explicit cast to non-dependent banned type 107f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteParam(pickle, static_cast<long>(container.value)); // ERROR 108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 109f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 110f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 111f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T, class... Ts> 112f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct MultiContainer { 113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch T value; 114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T, class... Ts> 117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct IPC::ParamTraits<MultiContainer<T, Ts...>> { 118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void Write(base::Pickle* pickle, 119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const MultiContainer<T, Ts...>& container) { 120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // NOT CHECKED: template argument explicitly referenced 121f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool helper[] = { 122f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch (WriteParam<Ts>(pickle, container.value), true)... // NOT CHECKED 123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 124f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch (void)helper; 125f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T> 129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct SomeClass { 130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void Write(base::Pickle* pickle) { 131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // NOT CHECKED: WriteParam() calls on dependent types 132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, T(0)); // NOT CHECKED 133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Non-dependent types are checked 135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, size_t(0)); // ERROR 136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, uint64_t(0)); // OK 137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <class U> 140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void WriteEx(base::Pickle* pickle) { 141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // NOT CHECKED: WriteParam() calls on dependent types 142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, U(0)); // NOT CHECKED 143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Non-dependent types are checked 145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, time_t(0)); // ERROR 146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, uint32_t(0)); // OK 147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T> 151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid SomeWriteFunction(base::Pickle* pickle) { 152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // NOT CHECKED: WriteParam() calls on dependent types 153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, T(0)); // NOT CHECKED 154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Non-dependent types are checked 156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, long(0)); // ERROR 157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, char(0)); // OK 158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch [&](){ 160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, T(0)); // NOT CHECKED 161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, clock_t(0)); // ERROR 163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(pickle, int64_t(0)); // OK 164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }(); 165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid TestWriteParamInTemplates() { 168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // These specializations call WriteParam() on various banned types, either 169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // because they were specified directly (long) or because non-blacklisted 170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // typedef (uint64_t) was stripped down to its underlying type, which is 171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // blacklisted when used as is (unsigned long). 172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // However, since it's hard (if not impossible) to check specializations 173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // properly, we're simply not checking them. 174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch SomeClass<long>::Write(nullptr); 175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch SomeClass<long>::WriteEx<uint64_t>(nullptr); 176f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch SomeWriteFunction<uint64_t>(nullptr); 177f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 178f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 180f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch/* Test IPC::CheckedTuple. ERRORS: 5 */ 181f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define IPC_TUPLE(...) IPC::CheckedTuple<__VA_ARGS__>::Tuple 183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define IPC_MESSAGE_DECL(name, id, in_tuple) \ 185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch struct name ## Meta_ ## id { \ 186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch using InTuple = in_tuple; \ 187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define IPC_TEST_MESSAGE(id, in) \ 190f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC_MESSAGE_DECL(TestMessage, id, IPC_TUPLE in) 191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct Empty {}; 193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochIPC_TEST_MESSAGE(__COUNTER__, (bool, size_t, Empty, long)) // 2 ERRORs 195f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 196f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef std::vector<long> long1D; 197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef std::vector<long1D> long2D; 198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochIPC_TEST_MESSAGE(__COUNTER__, (bool, long2D)) // ERROR 199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochIPC_TEST_MESSAGE(__COUNTER__, (char, short, std::pair<size_t, bool>)) // ERROR 201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochIPC_TEST_MESSAGE(__COUNTER__, (std::vector<std::vector<long&>&>&)) // ERROR 203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 204f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 205f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch/* Check IPC::WriteParam() arguments. ERRORS: 30 */ 206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// ERRORS: 21 208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid TestWriteParamArgument() { 209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch #define CALL_WRITEPARAM(Type) \ 210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { \ 211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Type p; \ 212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p); \ 213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // ERROR: blacklisted types / typedefs 216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(long) // ERROR 217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(unsigned long) // ERROR 218f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(intmax_t) // ERROR 219f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(uintmax_t) // ERROR 220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(intptr_t) // ERROR 221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(uintptr_t) // ERROR 222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(wint_t) // ERROR 223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(size_t) // ERROR 224f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(rsize_t) // ERROR 225f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(ssize_t) // ERROR 226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(ptrdiff_t) // ERROR 227f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(dev_t) // ERROR 228f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(off_t) // ERROR 229f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(clock_t) // ERROR 230f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(time_t) // ERROR 231f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(suseconds_t) // ERROR 232f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 233f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // ERROR: typedef to blacklisted typedef 234f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef size_t my_size; 235f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(my_size) // ERROR 236f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // ERROR: expression ends up with type "unsigned long" 238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { 239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint64_t p = 0; 240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p + 1); // ERROR 241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 242f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 243f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // ERROR: long chain of typedefs, ends up with blacklisted typedef 244f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { 245f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef size_t my_size_base; 246f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef const my_size_base my_size; 247f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef my_size& my_size_ref; 248f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch my_size_ref p = 0; 249f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p); // ERROR 250f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 251f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // ERROR: template specialization references blacklisted type 253f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(std::vector<long>) // ERROR 254f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(std::vector<size_t>) // ERROR 255f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // OK: typedef to blacklisted type 257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef long my_long; 258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(my_long) // OK 259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // OK: other types / typedefs 261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(char) // OK 262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(int) // OK 263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(uint32_t) // OK 264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(int64_t) // OK 265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // OK: long chain of typedefs, ends up with non-blacklisted typedef 267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { 268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef uint32_t my_int_base; 269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef const my_int_base my_int; 270f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef my_int& my_int_ref; 271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch my_int_ref p = 0; 272f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p); // OK 273f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 274f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 275f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // OK: template specialization references non-blacklisted type 276f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(std::vector<char>) // OK 277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CALL_WRITEPARAM(std::vector<my_long>) // OK 278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch #undef CALL_WRITEPARAM 280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 281f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct Provider { 283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef unsigned int flags; 284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 285f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch short get_short() const { return 0; } 286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint64_t get_uint64() const { return 0; } 287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch long get_long() const { return 0; } 288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch unsigned int get_uint() const { return 0; } 289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch flags get_flags() const { return 0; } 290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch size_t get_size() const { return 0; } 291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const std::vector<size_t>& get_sizes() const { return sizes_data; } 293f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const std::vector<uint64_t>& get_uint64s() const { return uint64s_data; } 294f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 295f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <class T> 296f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch T get() const { return T(); } 297f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch short short_data; 299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch unsigned int uint_data; 300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch flags flags_data; 301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch long long_data; 302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch size_t size_data; 303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint64_t uint64_data; 304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch std::vector<size_t> sizes_data; 305f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch std::vector<uint64_t> uint64s_data; 306f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 307f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 308f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// ERRORS: 9 309f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid TestWriteParamMemberArgument() { 310f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Provider p; 311f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 312f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get<short>()); // OK 313f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get_short()); // OK 314f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.short_data); // OK 315f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 316f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get<unsigned int>()); // OK 317f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get_uint()); // OK 318f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.uint_data); // OK 319f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 320f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get<Provider::flags>()); // OK 321f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get_flags()); // OK 322f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.flags_data); // OK 323f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 324f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get<long>()); // ERROR 325f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get_long()); // ERROR 326f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.long_data); // ERROR 327f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 328f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // This one is flaky and depends on whether size_t is typedefed to a 329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // blacklisted type (unsigned long). 330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch //IPC::WriteParam(nullptr, p.get<size_t>()); // ERROR 331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get_size()); // ERROR 332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.size_data); // ERROR 333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Information about uint64_t gets lost, and plugin sees WriteParam() 335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // call on unsigned long, which is blacklisted. 336f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get<uint64_t>()); // ERROR 337f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get_uint64()); // OK 338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.uint64_data); // OK 339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Same thing here, WriteParam() sees vector<unsigned long>, and denies it. 341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get<std::vector<uint64_t>>()); // ERROR 342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get_uint64s()); // OK 343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.uint64s_data); // OK 344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // This one is flaky and depends on whether size_t is typedefed to a 346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // blacklisted type (unsigned long). 347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch //IPC::WriteParam(nullptr, p.get<std::vector<size_t>>()); 348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.get_sizes()); // ERROR 349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IPC::WriteParam(nullptr, p.sizes_data); // ERROR 350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch/* ERRORS: 41 */ 354