Skip to content

Commit 0a1d166

Browse files
Essozclaude
andcommitted
fix: use attr_map to scope varid iteration in APIContainRelation online_check
Add Checker_data.attr_map (var_type → attr_name → set[VarInstId]), populated in _set_var_map when an attribute is first observed for a variable. Replace the broad type_map iteration in APIContainRelation.online_check and query_var_changes_within_time_and_process with attr_map lookups that only visit varids known to carry the attribute. This eliminates the KeyError when frozen parameters (or any variable lacking a tracked attribute) appear in type_map. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent b4f266d commit 0a1d166

3 files changed

Lines changed: 35 additions & 28 deletions

File tree

traincheck/invariant/contain_relation.py

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,35 +1315,35 @@ def online_check(
13151315

13161316
if isinstance(child_param, (VarTypeParam, VarNameParam)):
13171317
events = []
1318+
attr_name = child_param.attr_name
13181319
with checker_data.lock:
1319-
if child_param.var_type in checker_data.type_map:
1320-
for varid in checker_data.type_map[child_param.var_type]:
1321-
if isinstance(child_param, VarNameParam):
1322-
if varid.var_name != child_param.var_name:
1323-
continue
1324-
attr_name = child_param.attr_name
1325-
elif isinstance(child_param, VarTypeParam):
1326-
attr_name = child_param.attr_name
1327-
if attr_name not in checker_data.varid_map[varid]:
1320+
candidate_varids = checker_data.attr_map.get(
1321+
child_param.var_type, {}
1322+
).get(attr_name, set())
1323+
if isinstance(child_param, VarNameParam):
1324+
candidate_varids = {
1325+
v
1326+
for v in candidate_varids
1327+
if v.var_name == child_param.var_name
1328+
}
1329+
for varid in candidate_varids:
1330+
for i in reversed(
1331+
range(1, len(checker_data.varid_map[varid][attr_name]))
1332+
):
1333+
change_time = checker_data.varid_map[varid][attr_name][
1334+
i
1335+
].liveness.start_time
1336+
if change_time <= pre_time:
1337+
break
1338+
if change_time > post_time:
13281339
continue
1329-
for i in reversed(
1330-
range(1, len(checker_data.varid_map[varid][attr_name]))
1331-
):
1332-
1333-
change_time = checker_data.varid_map[varid][attr_name][
1334-
i
1335-
].liveness.start_time
1336-
if change_time <= pre_time:
1337-
break
1338-
if change_time > post_time:
1339-
continue
1340-
new_state = checker_data.varid_map[varid][attr_name][i]
1341-
old_state = checker_data.varid_map[varid][attr_name][i - 1]
1342-
if new_state.value == old_state.value:
1343-
continue
1344-
if new_state.liveness.end_time is None:
1345-
new_state = copy.deepcopy(new_state)
1346-
events.append((old_state, new_state))
1340+
new_state = checker_data.varid_map[varid][attr_name][i]
1341+
old_state = checker_data.varid_map[varid][attr_name][i - 1]
1342+
if new_state.value == old_state.value:
1343+
continue
1344+
if new_state.liveness.end_time is None:
1345+
new_state = copy.deepcopy(new_state)
1346+
events.append((old_state, new_state))
13471347

13481348
if check_relation_first:
13491349
for event in events:

traincheck/onlinechecker/streamhandler_filesystem.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def __init__(self, file_path, checker_data: Checker_data):
3434

3535
self.varid_map = checker_data.varid_map
3636
self.type_map = checker_data.type_map
37+
self.attr_map = checker_data.attr_map
3738
self.pt_map = checker_data.pt_map
3839
self.process_to_vars = checker_data.process_to_vars
3940
self.args_map = checker_data.args_map
@@ -155,6 +156,11 @@ def _set_var_map(self, trace_record):
155156

156157
if attr_name not in self.varid_map[varid]:
157158
self.varid_map[varid][attr_name] = []
159+
if varid.var_type not in self.attr_map:
160+
self.attr_map[varid.var_type] = {}
161+
if attr_name not in self.attr_map[varid.var_type]:
162+
self.attr_map[varid.var_type][attr_name] = set()
163+
self.attr_map[varid.var_type][attr_name].add(varid)
158164
else:
159165
self.varid_map[varid][attr_name][-1].liveness.end_time = (
160166
trace_record["time"]

traincheck/onlinechecker/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def __init__(self, needed_data):
1717
self.check_queue = queue.Queue()
1818
self.varid_map = {}
1919
self.type_map = {}
20+
self.attr_map: dict[str, dict[str, set]] = {}
2021
self.pt_map = {}
2122
self.process_to_vars = {}
2223
self.args_map = {}
@@ -189,7 +190,7 @@ def query_var_changes_within_time_and_process(
189190
"""Extract all variable change events from the trace, within a specific time range and process."""
190191
events = []
191192
with checker_data.lock:
192-
for varid in checker_data.type_map[var_type]:
193+
for varid in checker_data.attr_map.get(var_type, {}).get(attr_name, set()):
193194
for i in reversed(range(1, len(checker_data.varid_map[varid][attr_name]))):
194195

195196
change_time = checker_data.varid_map[varid][attr_name][

0 commit comments

Comments
 (0)