Reference cycles can cause infinte loops
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 245
- Forks
- 93
- Avg merge
- 2d 8h
- Merged PRs (30d)
- 15
Description
I think this is a low priority for reasons at the end.
The following ASL demonstrates the issue:
DefinitionBlock("", "DSDT", 1, "RSACPI", "Refs", 1) {
Method(MAIN) {
Local0 = 1
Local1 = RefOf(Local0)
Local2 = RefOf(Local1)
Local0 = RefOf(Local2)
// This line doesn't cause an infinite loop, it just stores a reference
Local3 = Local0
// The following line causes an infinite loop trying to get the value
Return (Local3)
}
}
This actually fails with thread 'main' (19208) has overflowed its stack.
At present it isn't possible to test stores to the cycle (e.g. Local0 = 2 instead of Local3 = Local0), but the fix for issue #313 would unblock this - in that case Stores also cause infinite loops, but without the stack overflow.
Why is this a low priority?
- Surely no-one would write ASL like this? (insert "right? right?" meme here)
- uACPI also hangs in this case
acpiexecjust exits the process with no error messages
So this crate failing is not out line with other implementations (although I didn't test Windows). I think this should be a straightforward fix - just add a loop counter when unwrapping references?
There's a more complex fix - raising errors when trying to create cycles - but IMO it's not worth the extra complexity.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the ASL example from the issue and tracing reference resolution at Return (Local3), where the cycle causes the stack overflow. Read issue #313 for related store behavior. Done means cyclic references no longer loop indefinitely or overflow the stack, with a regression test covering the supplied example.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- operating-systems
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 68/100