From: Wander Lairson Costa <wander@redhat.com>
To: Steven Rostedt <rostedt@goodmis.org>,
Gabriele Monaco <gmonaco@redhat.com>,
Nam Cao <namcao@linutronix.de>,
Wander Lairson Costa <wander@redhat.com>,
linux-kernel@vger.kernel.org (open list),
linux-trace-kernel@vger.kernel.org (open list:RUNTIME
VERIFICATION (RV))
Subject: [PATCH 16/26] rv/rvgen: fix unbound initial_state variable
Date: Mon, 19 Jan 2026 17:45:52 -0300 [thread overview]
Message-ID: <20260119205601.105821-17-wander@redhat.com> (raw)
In-Reply-To: <20260119205601.105821-1-wander@redhat.com>
Initialize initial_state to None and validate its assignment after
parsing DOT file state nodes. The previous implementation left
initial_state uninitialized if the DOT file contained no state with
the init_marker prefix, which would cause an UnboundLocalError when
the code attempted to use the variable at the end of the function.
This bug was identified by pyright static type checker, which correctly
flagged that initial_state could be referenced before assignment. The
fix adds proper initialization and validation, raising a AutomataError if
no initial state marker is found in the automaton definition. This
ensures that malformed DOT files missing an initial state are caught
early with a clear error message rather than causing cryptic runtime
exceptions.
The change also includes minor code formatting improvements to comply
with PEP 8 style guidelines, including consistent use of double quotes
for string literals and proper line length formatting for improved
readability.
Signed-off-by: Wander Lairson Costa <wander@redhat.com>
---
tools/verification/rvgen/rvgen/automata.py | 26 +++++++++++++++-------
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/tools/verification/rvgen/rvgen/automata.py b/tools/verification/rvgen/rvgen/automata.py
index 8548265955570..083d0f5cfb773 100644
--- a/tools/verification/rvgen/rvgen/automata.py
+++ b/tools/verification/rvgen/rvgen/automata.py
@@ -10,6 +10,7 @@
import ntpath
+
class AutomataError(OSError):
"""Exception raised for errors in automata parsing and validation.
@@ -17,6 +18,7 @@ class AutomataError(OSError):
or malformed automaton definitions.
"""
+
class Automata:
"""Automata class: Reads a dot file and parses it as an automata.
@@ -31,7 +33,9 @@ class Automata:
self.__dot_path = file_path
self.name = model_name or self.__get_model_name()
self.__dot_lines = self.__open_dot()
- self.states, self.initial_state, self.final_states = self.__get_state_variables()
+ self.states, self.initial_state, self.final_states = (
+ self.__get_state_variables()
+ )
self.events = self.__get_event_variables()
self.function = self.__create_matrix()
self.events_start, self.events_start_run = self.__store_init_events()
@@ -86,6 +90,7 @@ class Automata:
# wait for node declaration
states = []
final_states = []
+ initial_state = None
has_final_states = False
cursor = self.__get_cursor_begin_states()
@@ -96,9 +101,9 @@ class Automata:
raw_state = line[-1]
# "enabled_fired"}; -> enabled_fired
- state = raw_state.replace('"', '').replace('};', '').replace(',', '_')
+ state = raw_state.replace('"', "").replace("};", "").replace(",", "_")
if state.startswith(self.init_marker):
- initial_state = state[len(self.init_marker):]
+ initial_state = state[len(self.init_marker) :]
else:
states.append(state)
if "doublecircle" in self.__dot_lines[cursor]:
@@ -111,6 +116,9 @@ class Automata:
cursor += 1
+ if initial_state is None:
+ raise AutomataError("The automaton doesn't have a initial state")
+
states = sorted(set(states))
# Insert the initial state at the beginning of the states
@@ -132,7 +140,7 @@ class Automata:
# ------------ event is here ------------^^^^^
if self.__dot_lines[cursor].split()[1] == "->":
line = self.__dot_lines[cursor].split()
- event = line[-2].replace('"', '')
+ event = line[-2].replace('"', "")
# when a transition has more than one labels, they are like this
# "local_irq_enable\nhw_local_irq_enable_n"
@@ -162,7 +170,9 @@ class Automata:
nr_state += 1
# declare the matrix....
- matrix = [[self.invalid_state_str for x in range(nr_event)] for y in range(nr_state)]
+ matrix = [
+ [self.invalid_state_str for x in range(nr_event)] for y in range(nr_state)
+ ]
# and we are back! Let's fill the matrix
cursor = self.__get_cursor_begin_events()
@@ -170,9 +180,9 @@ class Automata:
while self.__dot_lines[cursor].lstrip()[0] == '"':
if self.__dot_lines[cursor].split()[1] == "->":
line = self.__dot_lines[cursor].split()
- origin_state = line[0].replace('"', '').replace(',', '_')
- dest_state = line[2].replace('"', '').replace(',', '_')
- possible_events = line[-2].replace('"', '').replace("\\n", " ")
+ origin_state = line[0].replace('"', "").replace(",", "_")
+ dest_state = line[2].replace('"', "").replace(",", "_")
+ possible_events = line[-2].replace('"', "").replace("\\n", " ")
for event in possible_events.split():
matrix[states_dict[origin_state]][events_dict[event]] = dest_state
cursor += 1
--
2.52.0
next prev parent reply other threads:[~2026-01-19 21:05 UTC|newest]
Thread overview: 95+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-19 20:45 [PATCH 00/26] rv/rvgen: Robustness, modernization, and fixes Wander Lairson Costa
2026-01-19 20:45 ` [PATCH 01/26] rv/rvgen: introduce AutomataError exception class Wander Lairson Costa
2026-01-20 7:33 ` Gabriele Monaco
2026-01-20 12:39 ` Wander Lairson Costa
2026-01-20 15:08 ` Gabriele Monaco
2026-01-22 14:39 ` Nam Cao
2026-01-19 20:45 ` [PATCH 02/26] rv/rvgen: remove bare except clauses in generator Wander Lairson Costa
2026-01-20 10:05 ` Gabriele Monaco
2026-01-22 14:43 ` Nam Cao
2026-01-19 20:45 ` [PATCH 03/26] rv/rvgen: replace % string formatting with f-strings Wander Lairson Costa
2026-01-20 10:02 ` Gabriele Monaco
2026-01-22 14:46 ` Nam Cao
2026-01-19 20:45 ` [PATCH 04/26] rv/rvgen: replace __len__() calls with len() Wander Lairson Costa
2026-01-20 7:41 ` Gabriele Monaco
2026-01-22 14:46 ` Nam Cao
2026-01-19 20:45 ` [PATCH 05/26] rv/rvgen: remove unnecessary semicolons Wander Lairson Costa
2026-01-20 7:42 ` Gabriele Monaco
2026-01-22 14:47 ` Nam Cao
2026-01-19 20:45 ` [PATCH 06/26] rv/rvgen: use context managers for file operations Wander Lairson Costa
2026-01-20 7:44 ` Gabriele Monaco
2026-01-22 14:50 ` Nam Cao
2026-01-19 20:45 ` [PATCH 07/26] rv/rvgen: replace __contains__() with in operator Wander Lairson Costa
2026-01-20 7:45 ` Gabriele Monaco
2026-01-22 14:51 ` Nam Cao
2026-01-19 20:45 ` [PATCH 08/26] rv/rvgen: simplify boolean comparison Wander Lairson Costa
2026-01-20 7:48 ` Gabriele Monaco
2026-01-22 14:51 ` Nam Cao
2026-01-19 20:45 ` [PATCH 09/26] rv/rvgen: replace inline NotImplemented with decorator Wander Lairson Costa
2026-01-21 13:43 ` Gabriele Monaco
2026-01-21 17:49 ` Wander Lairson Costa
2026-01-22 14:57 ` Nam Cao
2026-01-19 20:45 ` [PATCH 10/26] rv/rvgen: fix typos in automata docstring and comments Wander Lairson Costa
2026-01-22 14:58 ` Nam Cao
2026-01-19 20:45 ` [PATCH 11/26] rv/rvgen: fix typo in generator module docstring Wander Lairson Costa
2026-01-20 7:51 ` Gabriele Monaco
2026-01-22 14:59 ` Nam Cao
2026-01-19 20:45 ` [PATCH 12/26] rv/rvgen: fix PEP 8 whitespace violations Wander Lairson Costa
2026-01-20 7:53 ` Gabriele Monaco
2026-01-22 14:59 ` Nam Cao
2026-01-19 20:45 ` [PATCH 13/26] rv/rvgen: fix DOT file validation logic error Wander Lairson Costa
2026-01-20 7:56 ` Gabriele Monaco
2026-01-22 15:01 ` Nam Cao
2026-01-19 20:45 ` [PATCH 14/26] rv/rvgen: remove redundant initial_state removal Wander Lairson Costa
2026-01-20 8:01 ` Gabriele Monaco
2026-01-20 12:05 ` Wander Lairson Costa
2026-01-19 20:45 ` [PATCH 15/26] rv/rvgen: use class constant for init marker Wander Lairson Costa
2026-01-20 8:06 ` Gabriele Monaco
2026-01-22 15:02 ` Nam Cao
2026-01-19 20:45 ` Wander Lairson Costa [this message]
2026-01-20 8:21 ` [PATCH 16/26] rv/rvgen: fix unbound initial_state variable Gabriele Monaco
2026-01-20 11:42 ` Wander Lairson Costa
2026-01-20 11:53 ` Gabriele Monaco
2026-01-19 20:45 ` [PATCH 17/26] rv/rvgen: fix possibly unbound variable in ltl2k Wander Lairson Costa
2026-01-20 8:59 ` Gabriele Monaco
2026-01-20 11:37 ` Wander Lairson Costa
2026-01-20 12:30 ` Gabriele Monaco
2026-01-20 19:38 ` Wander Lairson Costa
2026-01-21 6:31 ` Gabriele Monaco
2026-01-22 15:31 ` Nam Cao
2026-01-19 20:45 ` [PATCH 18/26] rv/rvgen: add fill_tracepoint_args_skel stub to ltl2k Wander Lairson Costa
2026-01-21 13:57 ` Gabriele Monaco
2026-01-21 17:53 ` Wander Lairson Costa
2026-01-22 13:10 ` Wander Lairson Costa
2026-01-22 13:49 ` Gabriele Monaco
2026-01-23 12:19 ` Wander Lairson Costa
2026-01-23 12:26 ` Gabriele Monaco
2026-01-23 14:04 ` Wander Lairson Costa
2026-01-19 20:45 ` [PATCH 19/26] rv/rvgen: add abstract method stubs to Container class Wander Lairson Costa
2026-01-21 13:59 ` Gabriele Monaco
2026-01-21 17:56 ` Wander Lairson Costa
2026-01-22 15:33 ` Nam Cao
2026-01-19 20:45 ` [PATCH 20/26] rv/rvgen: refactor automata.py to use iterator-based parsing Wander Lairson Costa
2026-01-20 9:43 ` Gabriele Monaco
2026-01-22 15:35 ` Nam Cao
2026-01-22 15:40 ` Gabriele Monaco
2026-01-22 16:01 ` Nam Cao
2026-01-19 20:45 ` [PATCH 21/26] rv/rvgen: remove unused sys import from dot2c Wander Lairson Costa
2026-01-20 9:16 ` Gabriele Monaco
2026-01-19 20:45 ` [PATCH 22/26] rv/rvgen: remove unused __get_main_name method Wander Lairson Costa
2026-01-20 9:08 ` Gabriele Monaco
2026-01-19 20:45 ` [PATCH 23/26] rv/rvgen: add type annotations to fix pyright errors Wander Lairson Costa
2026-01-22 15:43 ` Nam Cao
2026-01-19 20:46 ` [PATCH 24/26] rv/rvgen: make monitor arguments required in rvgen Wander Lairson Costa
2026-01-20 9:07 ` Gabriele Monaco
2026-01-22 15:44 ` Nam Cao
2026-01-19 20:46 ` [PATCH 25/26] rv/rvgen: fix isinstance check in Variable.expand() Wander Lairson Costa
2026-01-22 15:53 ` Nam Cao
2026-01-19 20:46 ` [PATCH 26/26] rv/rvgen: extract node marker string to class constant Wander Lairson Costa
2026-01-20 9:03 ` Gabriele Monaco
2026-01-20 11:34 ` Wander Lairson Costa
2026-01-20 12:36 ` Gabriele Monaco
2026-01-20 13:11 ` Gabriele Monaco
2026-01-20 18:56 ` Wander Lairson Costa
2026-01-21 6:16 ` Gabriele Monaco
2026-01-20 7:20 ` [PATCH 00/26] rv/rvgen: Robustness, modernization, and fixes Nam Cao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260119205601.105821-17-wander@redhat.com \
--to=wander@redhat.com \
--cc=gmonaco@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=namcao@linutronix.de \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox