Commit Graph

321 Commits

Author SHA1 Message Date
Your Name
d470abe976 symbolic: Remove support for stack-spilled arguments
Many ABIs impose some kind of alignment constraints on the stack
pointer. For example, both the AArch32 and x86_64 SysV ABIs specify
that the end of the spilled argument list is aligned to 2*w where w
is the number of bytes in a word. Since macaw-symbolic has no notion
of the ABI in use, its ABI-agnostic code could only ever satisfy such
alignment constraints accidentally. Clients wishing to spill arguments
to the stack should do so with ABI-specific functionality.
2024-09-24 10:09:55 -04:00
Your Name
e9f939a245 {aarch32-,}symbolic: Additional commentary 2024-09-23 16:30:55 -04:00
Your Name
94195b485c symbolic: Sort imports 2024-09-23 15:50:44 -04:00
Your Name
3cdbb2c962 symbolic: Fix off-by-one error in stack setup code 2024-09-23 13:16:43 -04:00
Your Name
2398322a2c symbolic: Upstream stack spilled argument code from x86-symbolic
...so that it can also be used by AArch32.
2024-09-20 17:29:10 -04:00
Langston Barrett
4e4a047d45
Merge pull request #433 from GaloisInc/lb/stack-abi
x86-symbolic: Setting up a SysV-compatible stack
2024-09-17 16:42:19 -04:00
Langston Barrett
e1886a8892 symbolic: Address review comments 2024-09-11 20:19:43 -04:00
Langston Barrett
ecb2a3650c symbolic: Remove redundant unwrapping/rewrapping of register struct
There was a lot of redundant unwrapping and re-wrapping of the
assignment of `TypeRepr`s to the architecture register context into and
out of a `StructRepr`. Remove this.

Also, add an hlint configuration file to help avoid this in the future,
and a Github Actions workflow to enforce this in CI.
2024-09-11 16:26:10 -07:00
Langston Barrett
edc9635fe7 x86-symbolic: Use SysV-compatible stack setup in test suite
Fix a logic bug (bytes, not bits!) along the way
2024-09-11 17:57:06 -04:00
Langston Barrett
b37e90782e symbolic: Remove redundant constraints in testing code 2024-09-11 14:35:10 -04:00
Langston Barrett
d005b9c20a symbolic: More refactoring of testing code 2024-09-11 14:32:07 -04:00
Langston Barrett
672e0c5497 symbolic: Generalize and simplify simMacawCfg 2024-09-11 14:15:07 -04:00
Langston Barrett
ce96ba9112 symbolic: Factor out simulation of discovered functions 2024-09-11 13:50:10 -04:00
Langston Barrett
9f2da79c29 symbolic: Try proving *all* safety conditions 2024-09-11 13:11:48 -04:00
Langston Barrett
ec0b522a11 symbolic: Further split up simulateAndVerify 2024-09-06 16:30:48 -04:00
Langston Barrett
be0a57f555 symbolic: Don't feed the stack pointer to the ResultExtractor
None of the supported architectures return values via the stack, and
tracking the stack pointer needlessly complicates the code.
2024-09-05 11:22:55 -04:00
Langston Barrett
2033a7d20a symbolic: Further split up simulateFunction 2024-09-04 16:02:40 -04:00
Langston Barrett
2372f699da symbolic: Factor out construction of initial registers and stack 2024-09-04 15:45:16 -04:00
Langston Barrett
6fcdb938f0 symbolic: Pass initial memory into simulateFunction as an argument 2024-09-04 15:34:30 -04:00
Langston Barrett
c65ad34343 symbolic: Data type for (mem, mmConf) tuple 2024-09-04 15:29:27 -04:00
Langston Barrett
820401d12e symbolic: Factor out fresh register assignment generator 2024-09-04 15:25:10 -04:00
Langston Barrett
0c5ed97e84 symbolic: Rename and move a helper function in Testing 2024-09-04 15:21:07 -04:00
Langston Barrett
f3fd0e0fcf symbolic: Small refactoring in Testing module 2024-09-04 15:16:54 -04:00
Langston Barrett
c68cda07ac symbolic: Remove unused LANGUAGE pragmas 2024-09-04 15:03:19 -04:00
Langston Barrett
897960d722 symbolic: Haddocks on stack setup code 2024-09-03 15:35:08 -04:00
Langston Barrett
761f6587c5 symbolic: Remove dead code 2024-09-03 15:35:08 -04:00
Langston Barrett
3797214312 symbolic: Support allocating stack slots for spilled arguments 2024-09-03 15:35:08 -04:00
Langston Barrett
a28c96e5ed symbolic: Refine discussion about the placement of the stack pointer
dbb4c83 introduced this stack-pointer-in-the-middle approach, but
the commit message has no further commentary on why it was seen as
necessary. I've written up why *I* believe it to be necessary, and
removed what I see as a misleading comment.

Also, return a pointer to the end of the stack, because that's what
most clients will want.
2024-09-03 15:35:08 -04:00
Langston Barrett
caef1d30c1 symbolic: Factor stack setup out of Testing into its own module
Several Macaw-based projects use a similar stack setup:

* `pate`: c43542818b/src/Pate/Verification/InlineCallee.hs (L135-L143)
* `ambient-verifier`: https://github.com/GaloisInc/ambient-verifier/blob/open-source/src/Ambient/Verifier/SymbolicExecution.hs#L1272-L1280

We can share code by factoring it into its own module.
2024-09-03 15:35:08 -04:00
Ryan Scott
9954dd6d01 Fix -Wx-partial warnings uncovered by GHC 9.8 2024-08-08 09:34:03 -04:00
Langston Barrett
83d3907054 Use Crucible goal-proving helpers in testing code 2024-07-16 15:30:35 -04:00
Ryan Scott
4db0341e0a Bump submodules to allow building with what4-1.6.*
This bumps the `what4` submodule to the 1.6.* version series and updates the
`.cabal` files in the `macaw` repo accordingly.

Bumping the `what4` submodule also requires bringing in corresponding changes
in the `crucible`, `llvm-pretty`, and `llvm-pretty-bc-parser` submodules, so I
have done that as well.
2024-06-13 04:25:12 -04:00
Ryan Scott
7e1694b0ef macaw-symbolic: Fix interval bounds in mkGlobalPointerValidityPred
Fixes #279.
2024-01-24 18:50:11 -05:00
Ryan Scott
aaa5ea1234 Generalize lazy memory model using HasMacawLazySimulatorState
This introduces a `HasMacawLazySimulatorState` data type, which provides a
"classy lens" for accessing a `MacawLazySimulatorState` within some Crucible
personality type. It also generalizes the lazy `macaw-symbolic` memory model in
`Data.Macaw.Symbolic.Memory.Lazy` to be polymorphic over
`HasMacawLazySimulatorState` instances. The upside is that it is now possible
to use the lazy memory model at other personality types besides just
`MacawLazySimulatorState`, making it much easier to extend the memory model.

Because there is a `HasMacawLazySimulatorState` instance for
`MacawLazySimulatorState`, existing code that uses `MacawLazySimulatorState`
should continue to compile without changes.

Fixes #357.
2023-12-12 15:29:48 -05:00
Ryan Scott
c2c2a3d6bd macaw-symbolic: Implement MacawFreshSymbolic for all macaw Types
Rather than `error`ing, we now generate fresh constants for all possible
`macaw` `Type`s that are supplied to the `MacawFreshSymbolic` operation.

Fixes #301.
2023-11-17 17:08:34 -05:00
Ryan Scott
984f7cb368 Support building with GHC 9.6
This patch contains a handful of tweaks needed to make the libraries in the
`macaw` repo build with GHC 9.6:

* GHC 9.6 bundles `mtl-2.3.*`, which no longer re-exports `Control.Monad`,
  `Control.Monad.Trans`, and similar modules from `mtl`-related modules. To
  accommodate this, various imports have been made more explicit.
* I have disambiguated a use of `Data.Parameterized.NatRepr.withKnownNat` in
  `macaw-aarch32` to avoid clashing with a newly exported function of the same
  name in `GHC.TypeNats`.
* I have bumped various upper version bounds on `doctest`,
  `optparse-applicative`, and `what4` to allow building these libraries with
  GHC 9.6.
* I have bumped the following submodules to bring in GHC 9.6–related changes:
  * `asl-translator`: GaloisInc/asl-translator#53
  * `crucible`: GaloisInc/crucible#1102
  * `dwarf`: GaloisInc/dwarf#6
  * `elf-edit`: GaloisInc/elf-edit#38
  * `flexdis86`: GaloisInc/flexdis86#54
  * `grift`: GaloisInc/grift#9
  * `llvm-pretty`: elliottt/llvm-pretty#112
  * `llvm-pretty-bc-parser`: GaloisInc/llvm-pretty-bc-parser#225
  * `semmc`: GaloisInc/semmc#80
  * `what4`: GaloisInc/what4#235
2023-08-21 08:16:10 -04:00
Ryan Scott
e6a3fb0b87 Bump what4 submodule to version 1.4
The only other changes required are (1) deleting an unused dependency on
`what4-serialize`, and (2) raising upper version bounds on `what4`.

This brings in submodule changes from the following:

* GaloisInc/asl-translator#48, which performed a similar `what4` adaptation.
* GaloisInc/semmc#78, which performed a similar `what4` adaptation.
* GaloisIns/crucible#1068, which ensures that everything can build against
  `tasty-sugar >= 2.0` (the version of the library that `what4-1.4` depends on).
2023-03-21 16:05:53 -04:00
Ryan Scott
88d024990b macaw-symbolic: Note lazy memory model in the changelog 2023-03-14 13:27:07 -04:00
Ryan Scott
73b8a49d38 macaw-symbolic: Support newGlobalMemory{,With} in lazy memory model as well 2023-03-14 13:27:07 -04:00
Ryan Scott
dc7c1759f1 macaw-symbolic: Test both memory model configurations in test suites 2023-03-14 13:27:07 -04:00
Ryan Scott
d8fbe228ef macaw-symbolic: Clarify that lazy memory model sacrifices space for time 2023-03-14 13:27:07 -04:00
Ryan Scott
36cade1690 Bundle more options into MemModelConfig
This folds the menagerie of various configuration option arguments to
`macawExtensions` into the `MemModelConfig` data type. The advantage to doing
this is that is will make it easier to extend the memory model configuration
options in the future without needlessly foisting breaking changes on all
`macaw-symbolic` users.

Unfortunately, it does require a breaking change to get to this point, but the
migration path is straightforward for existing code. I have included this
migration story in the `macaw-symbolic` changelog.
2023-03-14 13:27:07 -04:00
Ryan Scott
4a28748030 macaw-symbolic: Add alternative, lazy memory model
The current `macaw-symbolic` memory model has issues when scaling up to
binaries that have several megabytes or more in size. This patch introduces a
new memory model (in `Data.Macaw.Symbolic.Memory.Lazy`) that serves as a mostly
drop-in replacement for the existing memory model (which I now refer to as the
"default" memoy model). The lazy memory model scales better by incrementally
populating the SMT array backing global memory over the course of a run of the
simulator. For the full details, see `Note [Lazy memory model]`.

I performed some refactoring to share common bits between the default and lazy
memory models.

Fixes #282.
2023-03-14 13:27:07 -04:00
Ryan Scott
b5e656c663 Add MemoryModelConfig option for concretizing pointers
This patch introduces a `MemModelConfig` data type for configuring the finer
details of `macaw-symbolic`'s memory model. For now, there is a single option,
which configures whether the memory model should attempt to concretize pointers
during a read or write, which can sometimes be beneficial for performance
reasons. The details of how concretization work can be found in the new
`Data.Macaw.Symbolic.Concretize` module.

Subsequent commits will add more configurable knobs to `MemModelConfig`.

Fixes #323.
2023-03-14 13:27:07 -04:00
Ryan Scott
97c61e471a Add basic support for simulating PLT stubs and shared libraries
This extends `Data.Macaw.Symbolic.Testing` in `macaw-symbolic` to be able to
handle binaries that depend on shared libraries. This is fully functional for
the x86-64 and AArch32 symbolic backends, and I have added test cases to the
respective repos demonstrating that it works. (The PowerPC backend is not yet
supported. At a minimum, this is blocked on GaloisInc/elf-edit#35.)

To implement this, I also needed to add some additional infrastructure to
`macaw-base` (I put this infrastructure here as it doesn't depend on any
Crucible-specific functionality):

* `Data.Macaw.Memory.ElfLoader.DynamicDependencies`: a basic ELF dynamic
  loader that performs a breadth-first search over all `DT_NEEDED` entries
  that an ELF binary depends on (both directly and indirectly).
* `Data.Macaw.Memory.ElfLoader.PLTStubs`: a collection of heuristics for
  detecting the addresses of PLT stubs in a dynamically linked binary.

It is worth noting that shared libraries are rife with nuance and subtlety,
and the way `macaw` models shared libraries is not 100% accurate. I have
written a length `Note [Shared libraries]` in `Data.Macaw.Symbolic.Testing`
to describe where corners had to be cut.

Fixes #318.
2023-02-23 17:16:12 -05:00
Ryan Scott
e6420fc006 macaw-symbolic: Include addresses in populateRelocation
When populating `COPY` relocations, it is helpful to know the address of the
relocation so that it can be related back to the name of the global symbol
whose value it is copying. Unfortunately, the type of `populateRelocation` does
not make it straightforward to compute this address. This patch includes three
additional arguments to `populateRelocation` (the relocation's `Memory`, its
`MemSegment`, and its `MemAddr`) to more easily facilitate computing the
address.

This is a breaking API change, albet it is a fairly straightforward change to
adapt to for most consumers.

This is related to #47, although this is not a full fix for the issue.
2022-09-13 15:26:12 -04:00
robdockins
d9525554ca
Merge pull request #310 from GaloisInc/rwd/redundant-checks
Remove redundant "valid pointer" checks from memory loads and stores.
2022-08-08 14:26:40 -07:00
Tristan Ravitch
20c4083330 Add a ChangeLog entry 2022-08-08 12:37:34 -07:00
Robert Dockins
8cf16cdfcd Remove redundant "valid pointer" checks from memory loads and stores.
The internal memory model operations already assert the same checks.
2022-08-03 09:41:58 -07:00
Ryan Scott
734039274d macaw-symbolic: Generalize some uses of CrucibleState to SimState
This patch was motivated by the need to call `doGetGlobal` from a Crucible
override, where the `SimState` is instantiated with `OverrideLang` rather than
`CrucibleLang`, the latter of which is used in the `CrucibleState` type
synonym. While I was in town, I generalized the types of other operations in
`Data.Macaw.Symbolic.MemOps` where it was reasonable.
2022-07-19 17:03:44 -04:00