#!/usr/bin/python -b # Ripped from HP and updated from Debian # Update by Gentoo to support unicode output # # Copyright (c) 2004 Hewlett-Packard Development Company, L.P. # David Mosberger # # Scan standard input for GCC warning messages that are likely to # source of real 64-bit problems. In particular, see whether there # are any implicitly declared functions whose return values are later # interpreted as pointers. Those are almost guaranteed to cause # crashes. # from __future__ import print_function import re import sys implicit_pattern = re.compile(r"([^:]*):(\d+): warning: implicit declaration " + "of function [`']([^']*)'") pointer_pattern = ( r"([^:]*):(\d+): warning: " + r"(" + r"(assignment" + r"|initialization" + r"|return" + r"|passing arg \d+ of `[^']*'" + r"|passing arg \d+ of pointer to function" + r") makes pointer from integer without a cast" + r"|" + r"cast to pointer from integer of different size)") if sys.hexversion < 0x3000000: # Use encoded byte strings in python-2.x, since the python ebuilds are # known to remove the encodings module when USE=build is enabled (thus # disabling unicode decoding/encoding). The portage module has a # workaround for this, but currently we don't import that here since we # don't want to trigger potential sandbox violations due to stale pyc # files for the portage module. unicode_quote_open = '\xE2\x80\x98' unicode_quote_close = '\xE2\x80\x99' def write(msg): sys.stdout.write(msg) else: unicode_quote_open = '\u2018' unicode_quote_close = '\u2019' def write(msg): sys.stdout.buffer.write(msg.encode('utf_8', 'backslashreplace')) pointer_pattern = re.compile(pointer_pattern) last_implicit_filename = "" last_implicit_linenum = -1 last_implicit_func = "" while True: if sys.hexversion >= 0x3000000: line = sys.stdin.buffer.readline().decode('utf_8', 'replace') else: line = sys.stdin.readline() if not line: break # translate unicode open/close quotes to ascii ones line = line.replace(unicode_quote_open, "`") line = line.replace(unicode_quote_close, "'") m = implicit_pattern.match(line) if m: last_implicit_filename = m.group(1) last_implicit_linenum = int(m.group(2)) last_implicit_func = m.group(3) else: m = pointer_pattern.match(line) if m: pointer_filename = m.group(1) pointer_linenum = int(m.group(2)) if (last_implicit_filename == pointer_filename and last_implicit_linenum == pointer_linenum): write("Function `%s' implicitly converted to pointer at " \ "%s:%d\n" % (last_implicit_func, last_implicit_filename, last_implicit_linenum))