annotate libsanitizer/ubsan/ubsan_type_hash_win.cpp @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 //===-- ubsan_type_hash_win.cpp -------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 // Implementation of type hashing/lookup for Microsoft C++ ABI.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 #include "sanitizer_common/sanitizer_platform.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 #include "ubsan_platform.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #if CAN_SANITIZE_UB && SANITIZER_WINDOWS
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 #include "ubsan_type_hash.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 #include "sanitizer_common/sanitizer_common.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #include <typeinfo>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 struct CompleteObjectLocator {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 int is_image_relative;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 int offset_to_top;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 int vfptr_offset;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 int rtti_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 int chd_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 int obj_locator_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 struct CompleteObjectLocatorAbs {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 int is_image_relative;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 int offset_to_top;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 int vfptr_offset;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 std::type_info *rtti_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 void *chd_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 CompleteObjectLocator *obj_locator_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 bool __ubsan::checkDynamicType(void *Object, void *Type, HashValue Hash) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 // FIXME: Implement.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 __ubsan::DynamicTypeInfo
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 __ubsan::getDynamicTypeInfoFromVtable(void *VtablePtr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 // The virtual table may not have a complete object locator if the object
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 // was compiled without RTTI (i.e. we might be reading from some other global
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 // laid out before the virtual table), so we need to carefully validate each
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 // pointer dereference and perform sanity checks.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 CompleteObjectLocator **obj_locator_ptr =
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 ((CompleteObjectLocator**)VtablePtr)-1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 if (!IsAccessibleMemoryRange((uptr)obj_locator_ptr, sizeof(void*)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 return DynamicTypeInfo(0, 0, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 CompleteObjectLocator *obj_locator = *obj_locator_ptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 if (!IsAccessibleMemoryRange((uptr)obj_locator,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 sizeof(CompleteObjectLocator)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 return DynamicTypeInfo(0, 0, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 std::type_info *tinfo;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 if (obj_locator->is_image_relative == 1) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 char *image_base = ((char *)obj_locator) - obj_locator->obj_locator_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 tinfo = (std::type_info *)(image_base + obj_locator->rtti_addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 } else if (obj_locator->is_image_relative == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 tinfo = ((CompleteObjectLocatorAbs *)obj_locator)->rtti_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 // Probably not a complete object locator.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 return DynamicTypeInfo(0, 0, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 if (!IsAccessibleMemoryRange((uptr)tinfo, sizeof(std::type_info)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 return DynamicTypeInfo(0, 0, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 // Okay, this is probably a std::type_info. Request its name.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 // FIXME: Implement a base class search like we do for Itanium.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 return DynamicTypeInfo(tinfo->name(), obj_locator->offset_to_top,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 "<unknown>");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 bool __ubsan::checkTypeInfoEquality(const void *, const void *) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 #endif // CAN_SANITIZE_UB && SANITIZER_WINDOWS