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