mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-81057: Add a CI Check for New Unsupported C Global Variables (gh-102506)
This will keep us from adding new unsupported (i.e. non-const) C global variables, which would break interpreter isolation. FYI, historically it is very uncommon for new global variables to get added. Furthermore, it is rare for new code to break the c-analyzer. So the check should almost always pass unnoticed. Note that I've removed test_check_c_globals. A test wasn't a great fit conceptually and was super slow on debug builds. A CI check is a better fit. This also resolves gh-100237. https://github.com/python/cpython/issues/81057
This commit is contained in:
parent
a703f743db
commit
1ff81c0cb6
8 changed files with 90 additions and 54 deletions
|
@ -6,6 +6,11 @@ from . import common as _common
|
|||
|
||||
TOOL = 'gcc'
|
||||
|
||||
META_FILES = {
|
||||
'<built-in>',
|
||||
'<command-line>',
|
||||
}
|
||||
|
||||
# https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html
|
||||
# flags:
|
||||
# 1 start of a new file
|
||||
|
@ -75,11 +80,15 @@ def _iter_lines(text, reqfile, samefiles, cwd, raw=False):
|
|||
|
||||
# The first line is special.
|
||||
# The next two lines are consistent.
|
||||
for expected in [
|
||||
f'# 1 "{reqfile}"',
|
||||
'# 1 "<built-in>"',
|
||||
'# 1 "<command-line>"',
|
||||
]:
|
||||
firstlines = [
|
||||
f'# 0 "{reqfile}"',
|
||||
'# 0 "<built-in>"',
|
||||
'# 0 "<command-line>"',
|
||||
]
|
||||
if text.startswith('# 1 '):
|
||||
# Some preprocessors emit a lineno of 1 for line-less entries.
|
||||
firstlines = [l.replace('# 0 ', '# 1 ') for l in firstlines]
|
||||
for expected in firstlines:
|
||||
line = next(lines)
|
||||
if line != expected:
|
||||
raise NotImplementedError((line, expected))
|
||||
|
@ -121,7 +130,7 @@ def _iter_top_include_lines(lines, topfile, cwd,
|
|||
# _parse_marker_line() that the preprocessor reported lno as 1.
|
||||
lno = 1
|
||||
for line in lines:
|
||||
if line == '# 1 "<command-line>" 2':
|
||||
if line == '# 0 "<command-line>" 2' or line == '# 1 "<command-line>" 2':
|
||||
# We're done with this top-level include.
|
||||
return
|
||||
|
||||
|
@ -174,8 +183,8 @@ def _parse_marker_line(line, reqfile=None):
|
|||
return None, None, None
|
||||
lno, origfile, flags = m.groups()
|
||||
lno = int(lno)
|
||||
assert origfile not in META_FILES, (line,)
|
||||
assert lno > 0, (line, lno)
|
||||
assert origfile not in ('<built-in>', '<command-line>'), (line,)
|
||||
flags = set(int(f) for f in flags.split()) if flags else ()
|
||||
|
||||
if 1 in flags:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue