-
Notifications
You must be signed in to change notification settings - Fork 2
/
SVF-padded-vtables.patch
59 lines (53 loc) · 2.72 KB
/
SVF-padded-vtables.patch
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
From 12ede5e903bd806c984217b0fc37f873f9718248 Mon Sep 17 00:00:00 2001
From: Pietro Borrello <[email protected]>
Date: Fri, 28 May 2021 13:44:45 +0200
Subject: Fix handling of padded vtables (common in asan builds)
---
lib/SVF-FE/CHG.cpp | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/lib/SVF-FE/CHG.cpp b/lib/SVF-FE/CHG.cpp
index 00bfbcf..fef1902 100644
--- a/lib/SVF-FE/CHG.cpp
+++ b/lib/SVF-FE/CHG.cpp
@@ -128,7 +128,19 @@ void CHGraph::buildCHGNodes(const GlobalValue *globalvalue)
for (unsigned int ei = 0; ei < vtblStruct->getNumOperands(); ++ei)
{
- const ConstantArray *vtbl = SVFUtil::dyn_cast<ConstantArray>(vtblStruct->getOperand(ei));
+ Constant *operand = vtblStruct->getOperand(ei);
+ // Sometimes ASAN adds padding to vtable by embedding them in structs
+ // so we should check and unpack them
+ if (!SVFUtil::isa<ConstantArray>(operand)) {
+ ConstantStruct *opStruct = SVFUtil::dyn_cast<ConstantStruct>(operand);
+ if(!opStruct) {
+ // We should skip handling the padding, in the form of an array
+ assert(SVFUtil::isa<ArrayType>(operand->getType()));
+ continue;
+ }
+ operand = opStruct->getOperand(0);
+ }
+ const ConstantArray *vtbl = SVFUtil::dyn_cast<ConstantArray>(operand);
assert(vtbl && "Element of initializer not an array?");
for (u32_t i = 0; i < vtbl->getNumOperands(); ++i)
{
@@ -434,8 +446,20 @@ void CHGraph::analyzeVTables(const Module &M)
for (unsigned int ei = 0; ei < vtblStruct->getNumOperands(); ++ei)
{
+ Constant *operand = vtblStruct->getOperand(ei);
+ // Sometimes ASAN adds padding to vtable by embedding them in structs
+ // so we should check and unpack them
+ if (!SVFUtil::isa<ConstantArray>(operand)) {
+ ConstantStruct *opStruct = SVFUtil::dyn_cast<ConstantStruct>(operand);
+ if(!opStruct) {
+ // We should skip handling the padding, in the form of an array
+ assert(SVFUtil::isa<ArrayType>(operand->getType()));
+ continue;
+ }
+ operand = opStruct->getOperand(0);
+ }
const ConstantArray *vtbl =
- SVFUtil::dyn_cast<ConstantArray>(vtblStruct->getOperand(ei));
+ SVFUtil::dyn_cast<ConstantArray>(operand);
assert(vtbl && "Element of initializer not an array?");
/*
--
2.17.1