| #!/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 <davidm@hpl.hp.com> |
| # |
| # 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. |
| # |
| |
| 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)" |
| ) |
| |
| 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: |
| line = sys.stdin.buffer.readline().decode("utf_8", "replace") |
| 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, |
| ) |
| ) |