Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Position tracking by global variable isn't robust #2128

Open
sauclovian-g opened this issue Oct 12, 2024 · 0 comments
Open

Position tracking by global variable isn't robust #2128

sauclovian-g opened this issue Oct 12, 2024 · 0 comments
Assignees
Labels
tech debt Issues that document or involve technical debt topics: error-handling Issues involving the way SAW responds to an error condition topics: error-messages Issues involving the messages SAW produces on error type: bug Issues reporting bugs or unexpected/unwanted behavior
Milestone

Comments

@sauclovian-g
Copy link
Contributor

The "read-only" part of the large state monad TopLevel in Value.hs contains a roPosition member that's supposed to hold the "current position" while executing saw-script code and maybe also at other times.

This is inadequate (even for runtime errors) because in general there are multiple objects with different positions; for example, currently in llvm_points_to there are number of possible errors, some of which are problems with either of the two arguments and should really be reported with their positions, and some of which are problems with the call and should be reported against its position. (Plus if you use llvm_points_to twice on the same pointer, that's an error and it would be nice to report the locations of both uses.)

It's also problematic because it's difficult to know what position is in the global at any given time. It's ostensibly read-only, and it's in the read-only part set up with ReaderT, but all that means is that the position you have at any given point can't be changed by things you call; it can be assigned by anything that calls you. Meanwhile the scope of this monad is nearly all of SAW, so it really is a global variable and it's as difficult to reason about as any other global variable.

Meanwhile, it's also broken in that it's assigned in assorted places in Value.hs and Interpreter.hs, but nowhere near enough of them to actually reflect the current execution position. It's possible that if the interpreter logic were neatly contained within one module, it would be feasible to make sure it gets assigned specifically before any call that leaves the interpreter. However, right now that's not realistic.

On the flip side, because it reaches almost all of SAW it's also used everywhere, and just trying to remove it breaks in all directions. Furthermore, there are lots and lots of error prints that implicitly use it by throwing exceptions that get it added (which is even less robust than fetching it out of the global directly, since the value where the exception's caught and rethrown might not be the same as the one where it was thrown and that might or might not be correct, and even more problematic because that way you really don't know what position you're using) and these should be sorted out as well.

My current inclination is that we should go ahead and rip out the global position and pass positions around explicitly, even though this is bound to be somewhat messy. It will have to be done in multiple stages (one being updating the builtins table so it's possible to pass builtins their invocation position, and ideally also positions for their arguments), and it's even possible that in the long run we'll end up putting it back once things are structured enough to be able to use it reliably. However, for the time being I don't think there's a great deal of choice.

I am thinking though that it might be better to put this on hold until we systematize the error reporting functions, because that will at least move us to explicit positions in places where they're needed and then we know for real where positions need to propagate to.

(Note: there's also a call stack in there with the position, and this should probably get handled the same way; the call stack is part of the position reporting for runtime errors. The way it's updated is even more rickety and I'm kind of surprised it works at all...)

@sauclovian-g sauclovian-g added topics: error-messages Issues involving the messages SAW produces on error topics: error-handling Issues involving the way SAW responds to an error condition labels Oct 12, 2024
@sauclovian-g sauclovian-g self-assigned this Oct 12, 2024
@sauclovian-g sauclovian-g added the tech debt Issues that document or involve technical debt label Oct 12, 2024
@sauclovian-g sauclovian-g added this to the 2025T1 milestone Nov 8, 2024
@sauclovian-g sauclovian-g added the type: bug Issues reporting bugs or unexpected/unwanted behavior label Nov 8, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
tech debt Issues that document or involve technical debt topics: error-handling Issues involving the way SAW responds to an error condition topics: error-messages Issues involving the messages SAW produces on error type: bug Issues reporting bugs or unexpected/unwanted behavior
Projects
None yet
Development

No branches or pull requests

1 participant