diff options
Diffstat (limited to 'debug_info_test/whitelist.py')
-rw-r--r-- | debug_info_test/whitelist.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/debug_info_test/whitelist.py b/debug_info_test/whitelist.py new file mode 100644 index 00000000..383fcc3d --- /dev/null +++ b/debug_info_test/whitelist.py @@ -0,0 +1,57 @@ +# Copyright 2018 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import glob +import re + +# Matching a string of length m in an NFA of size n is O(mn^2), but the +# performance also depends largely on the implementation. It appears to be fast +# enough according to the tests. +# +# The performance bottleneck of this script is readelf. Unless this becomes +# slower than readelf, don't waste time here. +def is_whitelisted(list_name, pattern): + """chech whether the given pattern is specified in the whitelist. + + Args: + list_name: name of the whitelist + pattern: the target string + Returns: + True if matched otherwise False + """ + return pattern and whitelists[list_name].match(pattern) + +def prepare_whitelist(patterns): + """Join and compile the re patterns. + + Args: + patterns: regex patterns. + Return: + A compiled re object + """ + return re.compile('|'.join(patterns)) + +def load_whitelists(dirname): + """Load whitelists under dirname. + + A whitelist ends with .whitelist. + + Args: + dirname: path to the dir. + Returns: + A dictionary of 'filename' -> whitelist matcher. + """ + wlist = {} + for fn in glob.glob(os.path.join(dirname, '*.whitelist')): + key = os.path.splitext(os.path.basename(fn))[0] + with open(fn, 'r') as f: + patterns = f.read().splitlines() + patterns = [l for l in patterns if l != ''] + patterns = [l for l in patterns if l[0] != '#'] + wlist[key] = prepare_whitelist(patterns) + return wlist + + +whitelists = load_whitelists(os.path.dirname(__file__)) |