Part of the exercise, whether it be making an existing codebase amenable to verification, or standing up a new one designed for it from scratch, is to identify, contain, and comprehend sources of entropy within the system.
At test time, you explore (as much as possible) the state space by replacing these components with data-deterministic mocks. On a run-to-run basis you can then vary the characteristics of the data they return; either with a set of derived known-edgy values, or by fuzzing, or a variety of the two.
This sounds daunting, and for a pre-existing codebase it can be a lot of work, but the upside is very often a substantial improvement in the robustness of and achievable confidence in the implementation.
Part of the exercise, whether it be making an existing codebase amenable to verification, or standing up a new one designed for it from scratch, is to identify, contain, and comprehend sources of entropy within the system.
At test time, you explore (as much as possible) the state space by replacing these components with data-deterministic mocks. On a run-to-run basis you can then vary the characteristics of the data they return; either with a set of derived known-edgy values, or by fuzzing, or a variety of the two.
This sounds daunting, and for a pre-existing codebase it can be a lot of work, but the upside is very often a substantial improvement in the robustness of and achievable confidence in the implementation.