summaryrefslogtreecommitdiff
path: root/plugins/warp/tests
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/warp/tests')
-rw-r--r--plugins/warp/tests/container.rs280
-rw-r--r--plugins/warp/tests/determinism.rs40
-rw-r--r--plugins/warp/tests/matcher.rs182
-rw-r--r--plugins/warp/tests/processor.rs62
-rw-r--r--plugins/warp/tests/snapshots/determinism___ctype.obj.snap126
-rw-r--r--plugins/warp/tests/snapshots/determinism___fptostr.obj.snap9
-rw-r--r--plugins/warp/tests/snapshots/determinism___mbslen.obj.snap39
-rw-r--r--plugins/warp/tests/snapshots/determinism___memicmp.obj.snap9
-rw-r--r--plugins/warp/tests/snapshots/determinism___strnicm.obj.snap9
-rw-r--r--plugins/warp/tests/snapshots/determinism___wctype.obj.snap117
-rw-r--r--plugins/warp/tests/snapshots/determinism__atof.obj.snap390
-rw-r--r--plugins/warp/tests/snapshots/determinism__atoldbl.obj.snap192
-rw-r--r--plugins/warp/tests/snapshots/determinism__atox.obj.snap186
13 files changed, 1641 insertions, 0 deletions
diff --git a/plugins/warp/tests/container.rs b/plugins/warp/tests/container.rs
new file mode 100644
index 00000000..31b47377
--- /dev/null
+++ b/plugins/warp/tests/container.rs
@@ -0,0 +1,280 @@
+use std::collections::HashSet;
+use std::path::PathBuf;
+use std::str::FromStr;
+use uuid::Uuid;
+use warp::r#type::class::BooleanClass;
+use warp::r#type::class::TypeClass::Void;
+use warp::r#type::guid::TypeGUID;
+use warp::r#type::{ComputedType, Type};
+use warp::signature::function::{Function, FunctionGUID};
+use warp::symbol::{Symbol, SymbolClass};
+use warp::target::Target;
+use warp_ninja::container::disk::DiskContainer;
+use warp_ninja::container::memory::{MemoryContainer, MemorySource};
+use warp_ninja::container::{Container, ContainerError, SourceId, SourcePath};
+
+fn type_0() -> (TypeGUID, Type) {
+ let ty = Type::builder()
+ .name("type_0")
+ .class(BooleanClass::builder().width(1).build())
+ .build();
+ (TypeGUID::from(&ty), ty)
+}
+
+fn type_1() -> (TypeGUID, Type) {
+ let ty = Type::builder()
+ .name("type_1")
+ .class(BooleanClass::builder().width(4).build())
+ .build();
+ (TypeGUID::from(&ty), ty)
+}
+
+fn type_2() -> (TypeGUID, Type) {
+ let ty = Type::builder()
+ .name("type_2")
+ .class(BooleanClass::builder().width(8).build())
+ .build();
+ (TypeGUID::from(&ty), ty)
+}
+
+fn func_0() -> (FunctionGUID, Function) {
+ let guid = FunctionGUID::from(Uuid::from_str("d4e56ec8-1f2b-4a87-9f2c-bc3f10c4d8e9").unwrap());
+ let function = Function {
+ guid,
+ symbol: Symbol {
+ name: "func_0".to_string(),
+ modifiers: Default::default(),
+ class: SymbolClass::Function,
+ },
+ // TODO: We might want to give this an actual function type.
+ ty: Some(Type::builder::<String, _>().class(Void).build()),
+ constraints: Default::default(),
+ comments: vec![],
+ variables: vec![],
+ };
+ (guid, function)
+}
+
+fn func_1() -> (FunctionGUID, Function) {
+ let guid = FunctionGUID::from(Uuid::from_str("b713c293-463a-5baa-b31b-ed010510d5c0").unwrap());
+ let function = Function {
+ guid,
+ symbol: Symbol {
+ name: "func_1".to_string(),
+ modifiers: Default::default(),
+ class: SymbolClass::Function,
+ },
+ // TODO: We might want to give this an actual function type.
+ ty: Some(Type::builder::<String, _>().class(Void).build()),
+ constraints: Default::default(),
+ comments: vec![],
+ variables: vec![],
+ };
+ (guid, function)
+}
+
+#[test]
+fn test_sources_with_type_guid() {
+ let source1 = SourceId::new();
+ let source2 = SourceId::new();
+ let (guid_1, ty_1) = type_0();
+ let (guid_2, ty_2) = type_1();
+
+ let container = MemoryContainer::new()
+ .with_source_type(source1, guid_1, ty_1)
+ .with_source_type(source1, guid_2, ty_2.clone())
+ .with_source_type(source2, guid_2, ty_2);
+
+ let result = container
+ .sources_with_type_guid(&guid_2)
+ .expect("Failed to get sources");
+ // HashSet used for unordered comparison
+ let result_set: HashSet<_> = result.into_iter().collect();
+ let expected_set: HashSet<_> = vec![source1, source2].into_iter().collect();
+ assert_eq!(result_set, expected_set);
+
+ let result = container
+ .sources_with_type_guid(&guid_1)
+ .expect("Failed to get sources");
+ // HashSet used for unordered comparison
+ let result_set: HashSet<_> = result.into_iter().collect();
+ let expected_set: HashSet<_> = vec![source1].into_iter().collect();
+ assert_eq!(result_set, expected_set);
+}
+
+#[test]
+fn test_sources_with_function_guid() {
+ let target = Target::default();
+
+ let source1 = SourceId::new();
+ let source2 = SourceId::new();
+ let (guid_1, fn_1) = func_0();
+ let (guid_2, fn_2) = func_1();
+
+ let container = MemoryContainer::new()
+ .with_source_function(source1, guid_1, fn_1)
+ .with_source_function(source1, guid_2, fn_2.clone())
+ .with_source_function(source2, guid_2, fn_2);
+
+ let result = container
+ .sources_with_function_guid(&target, &guid_2)
+ .expect("Failed to get sources");
+ // HashSet used for unordered comparison
+ let result_set: HashSet<_> = result.into_iter().collect();
+ let expected_set: HashSet<_> = vec![source1, source2].into_iter().collect();
+ assert_eq!(result_set, expected_set);
+
+ let result = container
+ .sources_with_function_guid(&target, &guid_1)
+ .expect("Failed to get sources");
+ assert_eq!(result, vec![source1]);
+}
+
+#[test]
+fn test_sources_with_type_guids() {
+ let source1 = SourceId::new();
+ let source2 = SourceId::new();
+ let (guid_1, ty_1) = type_0();
+ let (guid_2, ty_2) = type_1();
+ let (guid_3, ty_3) = type_2();
+
+ let container = MemoryContainer::new()
+ .with_source_type(source1, guid_1, ty_1)
+ .with_source_type(source1, guid_2, ty_2.clone())
+ .with_source_type(source2, guid_2, ty_2)
+ .with_source_type(source2, guid_3, ty_3);
+
+ let result = container
+ .sources_with_type_guids(&[guid_2.clone(), guid_3.clone()])
+ .expect("Failed to get sources");
+ assert_eq!(result.len(), 2);
+ assert!(result.get(&guid_2).unwrap().contains(&source1));
+ assert!(result.get(&guid_2).unwrap().contains(&source2));
+ assert!(result.get(&guid_3).unwrap().contains(&source2));
+}
+
+#[test]
+fn test_add_types() {
+ let source1 = SourceId::new();
+ let source2 = SourceId::new();
+ let (guid_1, ty_1) = type_0();
+ let (guid_2, ty_2) = type_1();
+ let mut container = MemoryContainer::new()
+ .with_source(
+ source1,
+ MemorySource {
+ writable: false,
+ ..Default::default()
+ },
+ )
+ .with_source_type(source1, guid_1, ty_1.clone())
+ .with_source_type(source2, guid_2, ty_2.clone());
+
+ assert_eq!(
+ container.add_types(&source1, &[ty_1.clone()]),
+ Err(ContainerError::SourceNotWritable(source1)),
+ "Source should not be writable"
+ );
+ assert_eq!(
+ container.add_types(&source2, &[ty_1.clone()]),
+ Ok(()),
+ "Source should be writable"
+ );
+ container
+ .type_with_guid(&source1, &guid_1)
+ .expect("Failed to get existing type");
+ container
+ .type_with_guid(&source2, &guid_1)
+ .expect("Failed to get added type");
+ container
+ .type_with_guid(&source2, &guid_2)
+ .expect("Failed to get existing type");
+}
+
+#[test]
+fn test_disk_container() {
+ // We are going to use the OUT_DIR as the disk container path, this might have other artifacts in it
+ // so it's a good test to make sure that we handle bad files gracefully.
+ let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR environment variable is not set");
+ let out_dir_path: PathBuf = out_dir.parse().expect("Failed to parse OUT_DIR as path");
+
+ // TODO: Use a temp file for this instead lol.
+ let added_type_path = out_dir_path.join("added_type.warp");
+ // Make sure that we have deleted the previous runs artifacts.
+ if std::fs::exists(&added_type_path).unwrap() {
+ std::fs::remove_file(&added_type_path).expect("Failed to remove existing file");
+ }
+
+ // Write a simple test to open a file with DiskContainer
+ let mut container = DiskContainer::new_from_dir(out_dir_path.clone());
+
+ // Just pass in the default target, there is no target specified in the file.
+ let target = Target::default();
+
+ // Test type retrieval.
+ // Type -> type_10 : 2f6d2876-ec42-5ca1-bee3-f12fe91d7e13
+ let type_0 = TypeGUID::from(Uuid::from_str("2f6d2876-ec42-5ca1-bee3-f12fe91d7e13").unwrap());
+ let sources: Vec<SourceId> = container
+ .sources_with_type_guid(&type_0)
+ .expect("Failed to get sources")
+ .into_iter()
+ .collect();
+ assert_eq!(sources.len(), 1);
+ let result_type_0 = container
+ .type_with_guid(&sources[0], &type_0)
+ .expect("Failed to get type")
+ .expect("Type not found");
+ assert_eq!(result_type_0.name, Some("type_10".to_string()));
+ let result_type_guids_0 = container
+ .type_guids_with_name(&sources[0], "type_10")
+ .expect("Failed to get type guids");
+ assert_eq!(result_type_guids_0.len(), 1);
+ assert_eq!(result_type_guids_0[0], type_0);
+
+ // Test function retrieval.
+ // Function -> function_95 : d5da0413-a020-5db8-b838-4d0ea8bd3dcb
+ let func_0 =
+ FunctionGUID::from(Uuid::from_str("d5da0413-a020-5db8-b838-4d0ea8bd3dcb").unwrap());
+ let func_sources = container
+ .sources_with_function_guid(&target, &func_0)
+ .expect("Failed to get sources");
+ assert_eq!(func_sources.len(), 1);
+ let result_func_0 = container
+ .functions_with_guid(&target, &func_sources[0], &func_0)
+ .expect("Failed to get functions");
+ assert_eq!(result_func_0.len(), 1);
+ assert_eq!(result_func_0[0].symbol.name, "function_95".to_string());
+
+ // Test adding a type to an existing disk source.
+ let mut result_type_0_mut = result_type_0.clone();
+ result_type_0_mut.name = Some("added_type".to_string());
+ let computed_result_type_0 = ComputedType::new(result_type_0_mut);
+ container
+ .add_types(&sources[0], &[computed_result_type_0.ty])
+ .expect("Failed to add type");
+ let result_type_1 = container
+ .type_guids_with_name(&sources[0], "added_type")
+ .expect("Failed to get added type");
+ assert_eq!(
+ result_type_1,
+ vec![computed_result_type_0.guid],
+ "Added type was not found in the existing source"
+ );
+
+ // Test commiting the updated source.
+ // NOTE: Because we don't want to modify the file, we are going to change the source path
+ // before trying to commit it, this is a bit hacky and should not really be done in real code.
+ let source = container
+ .sources
+ .get_mut(&sources[0])
+ .expect("Container does not contain the source");
+ source.path = SourcePath::new(out_dir_path.join("added_type.warp"));
+ container
+ .commit_source(&sources[0])
+ .expect("Failed to commit source");
+ assert_eq!(
+ std::fs::exists(&added_type_path).unwrap(),
+ true,
+ "File was not created"
+ );
+}
diff --git a/plugins/warp/tests/determinism.rs b/plugins/warp/tests/determinism.rs
new file mode 100644
index 00000000..403fff1d
--- /dev/null
+++ b/plugins/warp/tests/determinism.rs
@@ -0,0 +1,40 @@
+//! This tests to make sure the function GUIDs are stable.
+use binaryninja::binary_view::BinaryViewExt;
+use binaryninja::headless::Session;
+use std::collections::BTreeMap;
+use std::path::PathBuf;
+use warp::signature::function::FunctionGUID;
+use warp_ninja::cache::cached_function_guid;
+
+// These are the target files present in OUT_DIR
+// Add the files to fixtures/bin
+static TARGET_FILES: [&str; 9] = [
+ "_ctype.obj",
+ "_fptostr.obj",
+ "_mbslen.obj",
+ "_memicmp.obj",
+ "_strnicm.obj",
+ "_wctype.obj",
+ "atof.obj",
+ "atoldbl.obj",
+ "atox.obj",
+];
+
+#[test]
+fn insta_signatures() {
+ let session = Session::new().expect("Failed to initialize session");
+ let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap();
+ for file_name in TARGET_FILES {
+ let path = out_dir.join(file_name);
+ let view = session.load(&path).expect("Failed to load view");
+ let functions: BTreeMap<u64, FunctionGUID> = view
+ .functions()
+ .iter()
+ .map(|f| {
+ let guid = cached_function_guid(&f, &f.lifted_il().unwrap());
+ (f.start(), guid)
+ })
+ .collect();
+ insta::assert_debug_snapshot!(file_name, functions);
+ }
+}
diff --git a/plugins/warp/tests/matcher.rs b/plugins/warp/tests/matcher.rs
new file mode 100644
index 00000000..13e2ce01
--- /dev/null
+++ b/plugins/warp/tests/matcher.rs
@@ -0,0 +1,182 @@
+use binaryninja::architecture::CoreArchitecture;
+use binaryninja::binary_view::{BinaryView, BinaryViewExt};
+use binaryninja::file_metadata::FileMetadata;
+use binaryninja::function::Function as BNFunction;
+use binaryninja::headless::Session;
+use binaryninja::platform::Platform;
+use binaryninja::rc::Ref;
+use binaryninja::symbol::{Symbol as BNSymbol, SymbolType};
+use binaryninja::types::TypeClass as BNTypeClass;
+use std::str::FromStr;
+use warp::mock::{mock_constraint, mock_function};
+use warp::r#type::class::{IntegerClass, ReferrerClass, StructureClass, StructureMember};
+use warp::r#type::guid::TypeGUID;
+use warp::r#type::Type;
+use warp::signature::function::FunctionGUID;
+use warp::target::Target;
+use warp_ninja::container::memory::MemoryContainer;
+use warp_ninja::container::{Container, SourceId};
+use warp_ninja::function_guid;
+use warp_ninja::matcher::{Matcher, MatcherSettings};
+
+const MOCK_FUNCTION_GUID: &'static str = "02e8690a-bd1e-54df-9a75-5e7bca594c30";
+const MOCK_FUNCTION_BYTES: &[u8] = &[
+ // first_function
+ 0xA1, 0xFA, 0xF8, 0xF0, 0x99, // ; mov eax, [0x99f0f8fa]
+ 0x83, 0xC0, 0x37, // ; add eax, 55
+ 0xC3, // ; ret
+ // second_function
+ 0xA1, 0xFA, 0xF8, 0xF0, 0x91, // ; mov eax, [0x91f0f8fa]
+ 0x83, 0xC0, 0x37, // ; add eax, 55
+ 0xC3, // ; ret
+];
+
+fn create_mock_bn_function(_session: &Session) -> Ref<BNFunction> {
+ let file = FileMetadata::new();
+ let view =
+ BinaryView::from_data(&file, MOCK_FUNCTION_BYTES).expect("Failed to create mock view");
+ let platform = Platform::by_name("x86").unwrap();
+ // Add the constraint symbol so that the matcher picks it up, so we can test constraint matching.
+ let constraint_symbol =
+ BNSymbol::builder(SymbolType::Function, "second_function", 0x9).create();
+ view.define_user_symbol(&constraint_symbol);
+ let function_symbol = BNSymbol::builder(SymbolType::Function, "first_function", 0x0).create();
+ view.define_user_symbol(&function_symbol);
+ // Define the constraint function.
+ view.add_user_function_with_platform(0x9, &platform)
+ .expect("Failed to create constraint function");
+ // Actually define the function and return it.
+ view.add_user_function_with_platform(0x0, &platform)
+ .expect("Failed to create mock function")
+}
+
+#[test]
+fn test_match_function() {
+ let mut matcher_settings = MatcherSettings::default();
+ matcher_settings.trivial_function_len = 0;
+ let matcher = Matcher::new(matcher_settings);
+
+ // The memory container does not currently reference a target.
+ let target = Target::default();
+
+ let func = mock_function(MOCK_FUNCTION_GUID);
+ let func_guid = func.guid.clone();
+
+ let source = SourceId::new();
+ let memory_container =
+ MemoryContainer::new().with_source_function(source, func_guid, func.clone());
+
+ // Create mock binary ninja function.
+ let session = Session::new().expect("Failed to create session");
+ let bn_function = create_mock_bn_function(&session);
+
+ let possible_funcs = memory_container
+ .functions_with_guid(&target, &source, &func_guid)
+ .expect("Failed to get functions");
+
+ // Because there is only a single possible function this should just return that function.
+ let matched_function = matcher
+ .match_function_from_constraints(&bn_function, &possible_funcs)
+ .expect("Failed to match function");
+ assert_eq!(matched_function, &func);
+}
+
+#[test]
+fn test_match_function_from_constraints() {
+ let mut matcher_settings = MatcherSettings::default();
+ // TODO: This is needed to make the test pass, the functions are "trivial" in length.
+ matcher_settings.trivial_function_adjacent_allowed = true;
+ let matcher = Matcher::new(matcher_settings);
+ let mut function = mock_function("first_function");
+ function.guid = FunctionGUID::from_str(MOCK_FUNCTION_GUID).expect("Failed to parse guid");
+ let func_guid = function.guid.clone();
+ // Add constraint
+ function
+ .constraints
+ .insert(mock_constraint("second_function", Some(0x9)));
+
+ let matched_func_1 = function.clone();
+ let mut matched_func_2 = function.clone();
+ // Remove the constraint from 2, this means that the first matched_func should match.
+ matched_func_2.constraints.clear();
+ let mut matched_functions = vec![matched_func_1.clone(), matched_func_2];
+
+ // Create a mock binary ninja function.
+ let session = Session::new().expect("Failed to create session");
+ let bn_function = create_mock_bn_function(&session);
+ let bn_function_guid = function_guid(&bn_function, &bn_function.lifted_il().unwrap());
+ assert_eq!(bn_function_guid, func_guid);
+
+ // We should match on the first as it has the adjacent constraint still.
+ let matched_0 = matcher
+ .match_function_from_constraints(&bn_function, &matched_functions)
+ .expect("Failed to match function");
+ assert_eq!(matched_0, &function);
+
+ // Now we want to verify we do not match when the matched function is duplicated.
+ // NOTE: That in the case of identical functions in a set, we would prune them eagerly, so this is
+ // NOTE: not really indicative of a real scenario.
+ matched_functions.push(matched_func_1);
+
+ let matched_1 = matcher.match_function_from_constraints(&bn_function, &matched_functions);
+ assert_eq!(matched_1, None);
+}
+
+fn create_mock_type() -> Type {
+ // Build the type, this is quite annoying.
+ let int_class = IntegerClass::builder().width(64).signed(true).build();
+ let int_type = Type::builder()
+ .name("my_int".to_owned())
+ .class(int_class)
+ .build();
+
+ let struct_member_0 = StructureMember::builder()
+ .name("field_0")
+ .ty(int_type)
+ .offset(0)
+ .build();
+ let struct_class = StructureClass::builder()
+ .members(vec![struct_member_0])
+ .build();
+
+ Type::builder()
+ .name("my_struct")
+ .class(struct_class)
+ .build()
+}
+
+#[test]
+fn test_add_type_to_view() {
+ let matcher_settings = MatcherSettings::default();
+ let matcher = Matcher::new(matcher_settings);
+
+ // Add a source type that we can reference and pull in from the container.
+ let struct_type = create_mock_type();
+ let struct_type_guid = TypeGUID::from(&struct_type);
+ let struct_type_name = struct_type.name.clone().expect("Type should have name");
+
+ let source = SourceId::new();
+ let container = MemoryContainer::new().with_source_type(source, struct_type_guid, struct_type);
+
+ let _session = Session::new().expect("Failed to create session");
+ let file = FileMetadata::new();
+ let view = BinaryView::from_data(&file, &[]).expect("Failed to create view");
+ let arch = CoreArchitecture::by_name("x86").expect("Failed to get architecture");
+
+ // Try and add a NTR to the view, this should also add the referenced struct type.
+ let ref_class = ReferrerClass::builder()
+ .name(struct_type_name)
+ .guid(struct_type_guid)
+ .build();
+ let ref_type = Type::builder().name("my_ref").class(ref_class).build();
+ matcher.add_type_to_view(&container, &source, &view, &arch, &ref_type);
+
+ println!("{:#?}", view.types().to_vec());
+
+ // Verify the type was added to the view.
+ let found_type = view
+ .type_by_name("my_struct")
+ .expect("Failed to find added type");
+ // Make sure we actually added it as a structure type.
+ assert_eq!(found_type.type_class(), BNTypeClass::StructureTypeClass);
+}
diff --git a/plugins/warp/tests/processor.rs b/plugins/warp/tests/processor.rs
new file mode 100644
index 00000000..12749779
--- /dev/null
+++ b/plugins/warp/tests/processor.rs
@@ -0,0 +1,62 @@
+use std::path::PathBuf;
+use tempdir::TempDir;
+use warp_ninja::processor::WarpFileProcessor;
+
+// These are the target files present in OUT_DIR
+// Add the files to fixtures/bin
+static BIN_TARGET_FILES: [&str; 9] = [
+ "_ctype.obj",
+ "_fptostr.obj",
+ "_mbslen.obj",
+ "_memicmp.obj",
+ "_strnicm.obj",
+ "_wctype.obj",
+ "atof.obj",
+ "atoldbl.obj",
+ "atox.obj",
+];
+
+#[test]
+fn test_processor() {
+ let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap();
+ let _headless_session =
+ binaryninja::headless::Session::new().expect("Failed to initialize session");
+
+ let processor = WarpFileProcessor::new();
+
+ // All files should process and not error.
+ for file_name in BIN_TARGET_FILES {
+ let path = out_dir.join(file_name);
+ processor.process(path).unwrap();
+ }
+
+ // We should be able to process a warp file.
+ let warp_path = out_dir.join("random.warp");
+ processor.process(warp_path).unwrap();
+}
+
+#[test]
+fn test_caching() {
+ let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap();
+ let cache_dir = TempDir::new("tmp_cache").unwrap();
+ let _headless_session =
+ binaryninja::headless::Session::new().expect("Failed to initialize session");
+
+ let processor = WarpFileProcessor::new().with_cache_path(cache_dir.path().to_path_buf());
+
+ // Go through files, this should cache the databases.
+ for file_name in BIN_TARGET_FILES {
+ let path = out_dir.join(file_name);
+ processor.process(path).unwrap();
+ }
+
+ // Verify the databases were saved to the cache.
+ let mut cached_paths = Vec::new();
+ for entry in std::fs::read_dir(cache_dir.path()).expect("Failed to read cache dir") {
+ let entry = entry.expect("Failed to read cache dir entry");
+ let path = entry.path();
+ assert!(path.is_file());
+ cached_paths.push(path);
+ }
+ assert_eq!(BIN_TARGET_FILES.len(), cached_paths.len());
+}
diff --git a/plugins/warp/tests/snapshots/determinism___ctype.obj.snap b/plugins/warp/tests/snapshots/determinism___ctype.obj.snap
new file mode 100644
index 00000000..a0ef5ea0
--- /dev/null
+++ b/plugins/warp/tests/snapshots/determinism___ctype.obj.snap
@@ -0,0 +1,126 @@
+---
+source: plugins/warp/tests/determinism.rs
+expression: functions
+---
+{
+ 181712: FunctionGUID {
+ guid: 29690354-fa27-54d1-a8be-18535b19b1c3,
+ },
+ 182032: FunctionGUID {
+ guid: 1e794537-6289-59e7-bef9-0c72f3989db8,
+ },
+ 182720: FunctionGUID {
+ guid: 6abe3fc2-6d29-5fde-a31e-bb8249db6bf9,
+ },
+ 183072: FunctionGUID {
+ guid: 13b16f81-0c6f-5aee-ad9f-0d142658cf18,
+ },
+ 183376: FunctionGUID {
+ guid: 8a2b7bda-5fdb-5ba3-888b-20d5b8d7b2cd,
+ },
+ 183712: FunctionGUID {
+ guid: 53b484f3-751a-505d-beae-acc9d69c261d,
+ },
+ 184032: FunctionGUID {
+ guid: 88d9b26b-3884-58d6-b164-435d8d888e5c,
+ },
+ 184400: FunctionGUID {
+ guid: 3cc2e827-b707-5c9d-82e9-d76ac3abc904,
+ },
+ 184736: FunctionGUID {
+ guid: 7f0e055b-1e83-5f7b-a1fd-6a0a3d0b74f5,
+ },
+ 185040: FunctionGUID {
+ guid: c7bd1444-8f5c-5bc6-87c3-48f010b00455,
+ },
+ 185376: FunctionGUID {
+ guid: 18cfce71-47bc-5595-89cb-06e0563b211d,
+ },
+ 185712: FunctionGUID {
+ guid: 8ff1fc25-6912-5772-8fa3-19e1b996aea7,
+ },
+ 186000: FunctionGUID {
+ guid: 5b7f41e9-de1e-558c-ac7d-888acca3a76c,
+ },
+ 186352: FunctionGUID {
+ guid: cdb3f650-974f-5686-b81f-10b6544680f4,
+ },
+ 186784: FunctionGUID {
+ guid: 9e30f7d4-0a31-50cf-93f8-490a9e8c300b,
+ },
+ 187216: FunctionGUID {
+ guid: 0df54a49-5267-52f7-9665-70a8e66ad0dd,
+ },
+ 187664: FunctionGUID {
+ guid: 43a8c54b-dd4f-5334-ae00-218cb758ad4c,
+ },
+ 188096: FunctionGUID {
+ guid: 5b7cc78f-3b2f-5b82-9726-37c26ad087b4,
+ },
+ 188512: FunctionGUID {
+ guid: 7cae2466-6b19-5fff-869e-9a9717043df4,
+ },
+ 188864: FunctionGUID {
+ guid: 7cae2466-6b19-5fff-869e-9a9717043df4,
+ },
+ 189216: FunctionGUID {
+ guid: 1b6aa5a3-ac7f-542d-a0ab-bae8f142d8d8,
+ },
+ 189632: FunctionGUID {
+ guid: 951d5c60-d457-5b62-98e7-ade4a37d7cbe,
+ },
+ 190064: FunctionGUID {
+ guid: a7acb567-eb98-53e4-a843-5c60a8c59f19,
+ },
+ 190480: FunctionGUID {
+ guid: d5456209-db22-53a1-906d-1ecb3254ab2d,
+ },
+ 190912: FunctionGUID {
+ guid: bc4d18a4-96d5-5322-ba99-fcee83648701,
+ },
+ 191328: FunctionGUID {
+ guid: ec40932b-8293-5ffb-9d31-04c282b6530d,
+ },
+ 191744: FunctionGUID {
+ guid: 15d686e8-3e80-5632-9ce7-17c3510f8238,
+ },
+ 192160: FunctionGUID {
+ guid: faedbe75-8451-525b-83da-7a57ec96166e,
+ },
+ 192592: FunctionGUID {
+ guid: 06ff982d-b167-5dce-9689-71a631820da6,
+ },
+ 192944: FunctionGUID {
+ guid: 3b992cd7-1721-5f30-b59c-84ea682be808,
+ },
+ 193296: FunctionGUID {
+ guid: 6db530d1-8ea4-568e-a089-c61164851f04,
+ },
+ 193680: FunctionGUID {
+ guid: 95bf9d56-3b11-515f-960f-07abf69aed95,
+ },
+ 194032: FunctionGUID {
+ guid: cacf9fe4-7518-5b22-ae3a-ab775dea4c9a,
+ },
+ 194384: FunctionGUID {
+ guid: 00c71b63-3039-5aa3-94f7-1737530239d9,
+ },
+ 194736: FunctionGUID {
+ guid: 33e6bc5f-eeb6-5a07-810e-f04a2dba36cf,
+ },
+ 195088: FunctionGUID {
+ guid: d344f254-4903-581d-ad93-713c9ff2be2e,
+ },
+ 195440: FunctionGUID {
+ guid: 3ba4d0cb-9c07-5904-aafe-34e051b89be5,
+ },
+ 195792: FunctionGUID {
+ guid: b8b2746b-20aa-5ad2-bcfd-ab5448d952eb,
+ },
+ 196144: FunctionGUID {
+ guid: ae6f9d26-872c-5b6e-925e-40c0ec95c702,
+ },
+ 196496: FunctionGUID {
+ guid: 0d6d3685-7a8a-5d1c-8b7a-fe14871218ff,
+ },
+}
diff --git a/plugins/warp/tests/snapshots/determinism___fptostr.obj.snap b/plugins/warp/tests/snapshots/determinism___fptostr.obj.snap
new file mode 100644
index 00000000..717dc070
--- /dev/null
+++ b/plugins/warp/tests/snapshots/determinism___fptostr.obj.snap
@@ -0,0 +1,9 @@
+---
+source: plugins/warp/tests/determinism.rs
+expression: functions
+---
+{
+ 180832: FunctionGUID {
+ guid: 9d4dba66-7106-5215-8e64-a47279f67dfe,
+ },
+}
diff --git a/plugins/warp/tests/snapshots/determinism___mbslen.obj.snap b/plugins/warp/tests/snapshots/determinism___mbslen.obj.snap
new file mode 100644
index 00000000..848666d9
--- /dev/null
+++ b/plugins/warp/tests/snapshots/determinism___mbslen.obj.snap
@@ -0,0 +1,39 @@
+---
+source: plugins/warp/tests/determinism.rs
+expression: functions
+---
+{
+ 178448: FunctionGUID {
+ guid: 29690354-fa27-54d1-a8be-18535b19b1c3,
+ },
+ 178768: FunctionGUID {
+ guid: 1e794537-6289-59e7-bef9-0c72f3989db8,
+ },
+ 179456: FunctionGUID {
+ guid: 6abe3fc2-6d29-5fde-a31e-bb8249db6bf9,
+ },
+ 179808: FunctionGUID {
+ guid: 13b16f81-0c6f-5aee-ad9f-0d142658cf18,
+ },
+ 180112: FunctionGUID {
+ guid: 8a2b7bda-5fdb-5ba3-888b-20d5b8d7b2cd,
+ },
+ 180448: FunctionGUID {
+ guid: 6b0d368e-83d9-55fc-9683-5812e651a49b,
+ },
+ 181632: FunctionGUID {
+ guid: 3cc2e827-b707-5c9d-82e9-d76ac3abc904,
+ },
+ 181968: FunctionGUID {
+ guid: f034945d-32e2-5d86-8a86-3761cc54f419,
+ },
+ 182352: FunctionGUID {
+ guid: 6a7eb6dd-be3e-50dd-ae91-cea8f3eb4f06,
+ },
+ 182688: FunctionGUID {
+ guid: bfaf2f0a-d92d-5ef7-879d-86eb0ca01257,
+ },
+ 183024: FunctionGUID {
+ guid: f552d8ee-3064-50ed-af18-4e60f095c9ea,
+ },
+}
diff --git a/plugins/warp/tests/snapshots/determinism___memicmp.obj.snap b/plugins/warp/tests/snapshots/determinism___memicmp.obj.snap
new file mode 100644
index 00000000..3c9b0358
--- /dev/null
+++ b/plugins/warp/tests/snapshots/determinism___memicmp.obj.snap
@@ -0,0 +1,9 @@
+---
+source: plugins/warp/tests/determinism.rs
+expression: functions
+---
+{
+ 65728: FunctionGUID {
+ guid: cf6e80f2-69aa-5757-a06f-fb2e4866ab14,
+ },
+}
diff --git a/plugins/warp/tests/snapshots/determinism___strnicm.obj.snap b/plugins/warp/tests/snapshots/determinism___strnicm.obj.snap
new file mode 100644
index 00000000..4a118098
--- /dev/null
+++ b/plugins/warp/tests/snapshots/determinism___strnicm.obj.snap
@@ -0,0 +1,9 @@
+---
+source: plugins/warp/tests/determinism.rs
+expression: functions
+---
+{
+ 65728: FunctionGUID {
+ guid: 7c350a2d-2282-5625-943e-009f317b8d2c,
+ },
+}
diff --git a/plugins/warp/tests/snapshots/determinism___wctype.obj.snap b/plugins/warp/tests/snapshots/determinism___wctype.obj.snap
new file mode 100644
index 00000000..3da522a5
--- /dev/null
+++ b/plugins/warp/tests/snapshots/determinism___wctype.obj.snap
@@ -0,0 +1,117 @@
+---
+source: plugins/warp/tests/determinism.rs
+expression: functions
+---
+{
+ 181536: FunctionGUID {
+ guid: 29690354-fa27-54d1-a8be-18535b19b1c3,
+ },
+ 181856: FunctionGUID {
+ guid: 1e794537-6289-59e7-bef9-0c72f3989db8,
+ },
+ 182544: FunctionGUID {
+ guid: 6abe3fc2-6d29-5fde-a31e-bb8249db6bf9,
+ },
+ 182896: FunctionGUID {
+ guid: 13b16f81-0c6f-5aee-ad9f-0d142658cf18,
+ },
+ 183200: FunctionGUID {
+ guid: 8a2b7bda-5fdb-5ba3-888b-20d5b8d7b2cd,
+ },
+ 183536: FunctionGUID {
+ guid: 3cc2e827-b707-5c9d-82e9-d76ac3abc904,
+ },
+ 183872: FunctionGUID {
+ guid: 1b434f0e-26b8-539b-9679-33d96a683190,
+ },
+ 184208: FunctionGUID {
+ guid: b3723a76-a709-510c-9d93-97dc42b163a3,
+ },
+ 184544: FunctionGUID {
+ guid: 576f40fd-30a0-53af-8102-7e1b5298d38a,
+ },
+ 184960: FunctionGUID {
+ guid: 33ce8a60-e3fa-5941-9ca6-09707bb1f579,
+ },
+ 185280: FunctionGUID {
+ guid: b2339a04-7dcf-5791-b74e-806220d37f56,
+ },
+ 185600: FunctionGUID {
+ guid: b08dcc9b-b766-56e0-a9af-1d24cc6c6574,
+ },
+ 185952: FunctionGUID {
+ guid: 1e34d278-fd31-5cdf-98dc-395cb29419a7,
+ },
+ 186272: FunctionGUID {
+ guid: 1b434f0e-26b8-539b-9679-33d96a683190,
+ },
+ 186624: FunctionGUID {
+ guid: b3723a76-a709-510c-9d93-97dc42b163a3,
+ },
+ 186976: FunctionGUID {
+ guid: eed08c42-3616-5c27-82ad-719db5cce36e,
+ },
+ 187296: FunctionGUID {
+ guid: 23ba7382-bd48-5d47-a1f0-79ad5db87730,
+ },
+ 187616: FunctionGUID {
+ guid: 90cb6aa0-f402-5874-ae2d-e10752ad6462,
+ },
+ 187936: FunctionGUID {
+ guid: 75b0aba8-582a-5085-abbb-cebf55d2498d,
+ },
+ 188256: FunctionGUID {
+ guid: cc259c7e-0ada-5680-8ad7-b077d60bd2a1,
+ },
+ 188576: FunctionGUID {
+ guid: 607a10c5-8943-5dec-b888-f5210f08b311,
+ },
+ 188896: FunctionGUID {
+ guid: f6535880-21d4-5272-b2c0-5e63cbc208e7,
+ },
+ 189216: FunctionGUID {
+ guid: 9dd8ec46-e680-5fbe-b28b-30505b505fa3,
+ },
+ 189552: FunctionGUID {
+ guid: b098f8a1-ecdd-5938-8da3-bb37935c6b7e,
+ },
+ 189856: FunctionGUID {
+ guid: 33ce8a60-e3fa-5941-9ca6-09707bb1f579,
+ },
+ 190160: FunctionGUID {
+ guid: b2339a04-7dcf-5791-b74e-806220d37f56,
+ },
+ 190464: FunctionGUID {
+ guid: 6cebba56-9929-5f3d-9dd3-fc56f8e84593,
+ },
+ 190768: FunctionGUID {
+ guid: b08dcc9b-b766-56e0-a9af-1d24cc6c6574,
+ },
+ 191088: FunctionGUID {
+ guid: 1e34d278-fd31-5cdf-98dc-395cb29419a7,
+ },
+ 191392: FunctionGUID {
+ guid: eed08c42-3616-5c27-82ad-719db5cce36e,
+ },
+ 191696: FunctionGUID {
+ guid: 23ba7382-bd48-5d47-a1f0-79ad5db87730,
+ },
+ 192000: FunctionGUID {
+ guid: 90cb6aa0-f402-5874-ae2d-e10752ad6462,
+ },
+ 192304: FunctionGUID {
+ guid: 75b0aba8-582a-5085-abbb-cebf55d2498d,
+ },
+ 192608: FunctionGUID {
+ guid: cc259c7e-0ada-5680-8ad7-b077d60bd2a1,
+ },
+ 192912: FunctionGUID {
+ guid: 607a10c5-8943-5dec-b888-f5210f08b311,
+ },
+ 193216: FunctionGUID {
+ guid: f6535880-21d4-5272-b2c0-5e63cbc208e7,
+ },
+ 193520: FunctionGUID {
+ guid: 9dd8ec46-e680-5fbe-b28b-30505b505fa3,
+ },
+}
diff --git a/plugins/warp/tests/snapshots/determinism__atof.obj.snap b/plugins/warp/tests/snapshots/determinism__atof.obj.snap
new file mode 100644
index 00000000..a4841378
--- /dev/null
+++ b/plugins/warp/tests/snapshots/determinism__atof.obj.snap
@@ -0,0 +1,390 @@
+---
+source: plugins/warp/tests/determinism.rs
+expression: functions
+---
+{
+ 234752: FunctionGUID {
+ guid: 29690354-fa27-54d1-a8be-18535b19b1c3,
+ },
+ 235072: FunctionGUID {
+ guid: d8ba616a-1747-587c-9265-cd4e26ae35c8,
+ },
+ 235536: FunctionGUID {
+ guid: 1b1669c2-4a81-5300-99f7-14cba1cc7b24,
+ },
+ 236016: FunctionGUID {
+ guid: 72452dc5-da9c-54fc-82de-032aab1780a4,
+ },
+ 236528: FunctionGUID {
+ guid: 87371a48-38c9-5e0e-81db-5e2d6da49202,
+ },
+ 237088: FunctionGUID {
+ guid: c74ed160-24fe-50d7-ba1c-9751c4599420,
+ },
+ 237600: FunctionGUID {
+ guid: 1eee5e05-95ef-5f99-8713-504c2003183c,
+ },
+ 238160: FunctionGUID {
+ guid: 65be15d9-ef02-58a4-af63-b40ddb3e56b7,
+ },
+ 238672: FunctionGUID {
+ guid: 3efd6327-6038-53ed-904c-a800bee86d2e,
+ },
+ 239232: FunctionGUID {
+ guid: 82e98c80-859c-5ab3-83ab-b597fc520a3f,
+ },
+ 239808: FunctionGUID {
+ guid: c44bdef1-d78a-57ec-bff5-4e7d32ff4337,
+ },
+ 240448: FunctionGUID {
+ guid: 7cbd1cef-0134-5a29-a8c6-82697f5717fe,
+ },
+ 240960: FunctionGUID {
+ guid: e4ba95bb-0221-5dbd-9884-13a39c4f9d55,
+ },
+ 241520: FunctionGUID {
+ guid: 0e6feb85-ff6f-5b86-bd2c-26fb9829241c,
+ },
+ 242464: FunctionGUID {
+ guid: 0e6feb85-ff6f-5b86-bd2c-26fb9829241c,
+ },
+ 243408: FunctionGUID {
+ guid: a0c07bfa-a027-5c19-9da4-d2d35d7beb40,
+ },
+ 244208: FunctionGUID {
+ guid: a0c07bfa-a027-5c19-9da4-d2d35d7beb40,
+ },
+ 245008: FunctionGUID {
+ guid: 06a9339a-7249-50f3-9c3d-131d3248d560,
+ },
+ 245408: FunctionGUID {
+ guid: 06a9339a-7249-50f3-9c3d-131d3248d560,
+ },
+ 245808: FunctionGUID {
+ guid: 06a9339a-7249-50f3-9c3d-131d3248d560,
+ },
+ 246208: FunctionGUID {
+ guid: 06a9339a-7249-50f3-9c3d-131d3248d560,
+ },
+ 246608: FunctionGUID {
+ guid: 1de88f85-a19c-5454-9122-ddc80f7509b4,
+ },
+ 246992: FunctionGUID {
+ guid: 1de88f85-a19c-5454-9122-ddc80f7509b4,
+ },
+ 247376: FunctionGUID {
+ guid: ce28e080-0609-5bcd-abe1-2a6e57c91f83,
+ },
+ 248672: FunctionGUID {
+ guid: ce28e080-0609-5bcd-abe1-2a6e57c91f83,
+ },
+ 249968: FunctionGUID {
+ guid: ce28e080-0609-5bcd-abe1-2a6e57c91f83,
+ },
+ 251264: FunctionGUID {
+ guid: 41fd6d24-0f8b-5848-9873-65b98bd370ab,
+ },
+ 255600: FunctionGUID {
+ guid: 89f0e45b-c1f6-5aeb-94a8-26e72bb66e6c,
+ },
+ 259968: FunctionGUID {
+ guid: 4f645f3c-3e89-5b5d-a185-9f1a25e94ed2,
+ },
+ 261152: FunctionGUID {
+ guid: 4b60a419-4ad1-5808-b41f-d341868c9234,
+ },
+ 262352: FunctionGUID {
+ guid: 7c43c697-22ef-57a9-a43a-2214e627749d,
+ },
+ 263792: FunctionGUID {
+ guid: cfa4374b-0fc7-575d-9ba1-4a37d2de0406,
+ },
+ 265248: FunctionGUID {
+ guid: 45770948-1c56-5b24-bd38-f5a559ae8d22,
+ },
+ 265792: FunctionGUID {
+ guid: 45770948-1c56-5b24-bd38-f5a559ae8d22,
+ },
+ 266336: FunctionGUID {
+ guid: cf4808fe-2fea-517d-8f85-f88ddc96cc78,
+ },
+ 266880: FunctionGUID {
+ guid: cf4808fe-2fea-517d-8f85-f88ddc96cc78,
+ },
+ 267424: FunctionGUID {
+ guid: 86ab6ab4-45e5-5c08-9a47-05344ea503ab,
+ },
+ 268912: FunctionGUID {
+ guid: 86ab6ab4-45e5-5c08-9a47-05344ea503ab,
+ },
+ 270400: FunctionGUID {
+ guid: 364c5864-0cd1-5527-8ca0-2378d5b4c0a5,
+ },
+ 271040: FunctionGUID {
+ guid: a5b947d4-a7e0-5072-86b3-240474c16595,
+ },
+ 271696: FunctionGUID {
+ guid: a707a2d3-c7d2-5b93-97c9-1db77d8ccfe5,
+ },
+ 272128: FunctionGUID {
+ guid: a707a2d3-c7d2-5b93-97c9-1db77d8ccfe5,
+ },
+ 272560: FunctionGUID {
+ guid: a707a2d3-c7d2-5b93-97c9-1db77d8ccfe5,
+ },
+ 272992: FunctionGUID {
+ guid: a707a2d3-c7d2-5b93-97c9-1db77d8ccfe5,
+ },
+ 273424: FunctionGUID {
+ guid: a707a2d3-c7d2-5b93-97c9-1db77d8ccfe5,
+ },
+ 273856: FunctionGUID {
+ guid: a707a2d3-c7d2-5b93-97c9-1db77d8ccfe5,
+ },
+ 274288: FunctionGUID {
+ guid: a482559e-6a69-505e-b692-147deeced692,
+ },
+ 274720: FunctionGUID {
+ guid: a482559e-6a69-505e-b692-147deeced692,
+ },
+ 275152: FunctionGUID {
+ guid: 1e794537-6289-59e7-bef9-0c72f3989db8,
+ },
+ 275840: FunctionGUID {
+ guid: bbb9b018-a0cd-5f98-b941-367f8707434d,
+ },
+ 276224: FunctionGUID {
+ guid: 879b1d59-7301-5cb7-911e-db05292bee8f,
+ },
+ 276592: FunctionGUID {
+ guid: b9111cf4-dcff-52a5-8755-2dedea6d5c72,
+ },
+ 277040: FunctionGUID {
+ guid: 2833f544-9acb-552d-aa4b-df7d51dbab64,
+ },
+ 277488: FunctionGUID {
+ guid: 7995ca73-04fe-5b30-9e88-1e69197007c1,
+ },
+ 277872: FunctionGUID {
+ guid: 7995ca73-04fe-5b30-9e88-1e69197007c1,
+ },
+ 278256: FunctionGUID {
+ guid: 6abe3fc2-6d29-5fde-a31e-bb8249db6bf9,
+ },
+ 278608: FunctionGUID {
+ guid: bbb9b018-a0cd-5f98-b941-367f8707434d,
+ },
+ 279008: FunctionGUID {
+ guid: 0c7b078d-dafb-5be7-8b10-a25b1e691b33,
+ },
+ 279536: FunctionGUID {
+ guid: 40358a63-7e16-52da-9270-434c7d444b10,
+ },
+ 279952: FunctionGUID {
+ guid: 40358a63-7e16-52da-9270-434c7d444b10,
+ },
+ 280368: FunctionGUID {
+ guid: 8c736b66-b63f-5000-a060-2e60a1b8952a,
+ },
+ 280784: FunctionGUID {
+ guid: 8c736b66-b63f-5000-a060-2e60a1b8952a,
+ },
+ 281200: FunctionGUID {
+ guid: 8c736b66-b63f-5000-a060-2e60a1b8952a,
+ },
+ 281616: FunctionGUID {
+ guid: 40358a63-7e16-52da-9270-434c7d444b10,
+ },
+ 282032: FunctionGUID {
+ guid: 13b16f81-0c6f-5aee-ad9f-0d142658cf18,
+ },
+ 282336: FunctionGUID {
+ guid: 8a2b7bda-5fdb-5ba3-888b-20d5b8d7b2cd,
+ },
+ 282672: FunctionGUID {
+ guid: 3eb2a4c5-84f5-5687-92a0-35ef66c8b746,
+ },
+ 283472: FunctionGUID {
+ guid: 5b55a8c8-1d3a-5825-a0d9-917f434e07af,
+ },
+ 284352: FunctionGUID {
+ guid: f3d57592-4cb1-5356-9591-1f9327c58565,
+ },
+ 284768: FunctionGUID {
+ guid: fb20fa7c-c796-58e4-a2f9-7a128baaf5b1,
+ },
+ 285216: FunctionGUID {
+ guid: 1c037c1e-9af1-59af-b19e-122fdf885148,
+ },
+ 285712: FunctionGUID {
+ guid: 4345609a-e619-5f33-84ca-7cc1ccdfa2d0,
+ },
+ 286208: FunctionGUID {
+ guid: c71f4559-f0af-54dc-a224-e1f341311988,
+ },
+ 286688: FunctionGUID {
+ guid: 479b6feb-0dff-5c33-8f30-fd0c563b9abc,
+ },
+ 288432: FunctionGUID {
+ guid: 7d4d1429-5fef-5c8b-9074-93e9d97ab57e,
+ },
+ 290768: FunctionGUID {
+ guid: c71f4559-f0af-54dc-a224-e1f341311988,
+ },
+ 291232: FunctionGUID {
+ guid: 9a9e3287-e407-5526-885b-1b5ee78a5300,
+ },
+ 291600: FunctionGUID {
+ guid: 84429ba2-9f72-585f-8cda-31e8ef4983fd,
+ },
+ 291984: FunctionGUID {
+ guid: 07c4bac9-cf7d-5e00-833d-d23ba44c07d9,
+ },
+ 292384: FunctionGUID {
+ guid: 4f0bdeb9-691c-52f8-8541-6c834f3fbe64,
+ },
+ 296016: FunctionGUID {
+ guid: ecca9a9d-1722-5344-b68f-54f4527c0d78,
+ },
+ 296912: FunctionGUID {
+ guid: ed23805d-3729-590d-83a3-3b0803a56870,
+ },
+ 297280: FunctionGUID {
+ guid: 410b1cab-55ff-5931-a894-54842e56bee2,
+ },
+ 297648: FunctionGUID {
+ guid: 11592e15-a2a6-51b3-bda2-534cc0434df0,
+ },
+ 303056: FunctionGUID {
+ guid: 3c38a678-9c4e-527a-b543-3075b345d532,
+ },
+ 303392: FunctionGUID {
+ guid: a603d813-2b33-567d-80c8-06e31562a400,
+ },
+ 303744: FunctionGUID {
+ guid: 56c82b1f-380c-52fe-ae70-a39962e5ffdc,
+ },
+ 304096: FunctionGUID {
+ guid: eefbc8a9-f4f1-5725-9a4f-9dcd04ea3478,
+ },
+ 304528: FunctionGUID {
+ guid: 1b969932-96ce-5a6f-b91c-82e5f7b7f33d,
+ },
+ 304848: FunctionGUID {
+ guid: a23505e4-e7cd-5543-897c-46b97c1eaef3,
+ },
+ 305216: FunctionGUID {
+ guid: 9ef21651-3eaf-5940-8e72-104bda834e85,
+ },
+ 305568: FunctionGUID {
+ guid: 6c01cd47-89a2-59f3-ac6a-cd7806fb8f79,
+ },
+ 306128: FunctionGUID {
+ guid: d72f40b9-0557-5695-aa4d-468515ec4b8e,
+ },
+ 306464: FunctionGUID {
+ guid: 3c38a678-9c4e-527a-b543-3075b345d532,
+ },
+ 306816: FunctionGUID {
+ guid: e480dd82-0b7d-5c75-ac67-ba8c0bb755cb,
+ },
+ 307168: FunctionGUID {
+ guid: e1b1e1df-fdb9-59d6-b966-5b7f926b5649,
+ },
+ 309232: FunctionGUID {
+ guid: f37337a6-4cf0-55b4-a0da-25a15e3d9bcb,
+ },
+ 309968: FunctionGUID {
+ guid: b0aca296-adc3-5b46-a6b1-e82ef2100ead,
+ },
+ 310352: FunctionGUID {
+ guid: db957206-4cca-5631-893d-1d3dc500c804,
+ },
+ 311760: FunctionGUID {
+ guid: adadfe23-cb3f-5c9f-ae8d-1dd2fd922367,
+ },
+ 312416: FunctionGUID {
+ guid: dd480d6b-04f7-5fb2-a7b2-236e1d78b2b0,
+ },
+ 312784: FunctionGUID {
+ guid: 5779439c-a22f-5d33-8868-4e1832ad49e9,
+ },
+ 313216: FunctionGUID {
+ guid: 0916139e-a5db-51c8-be24-2c6fb20a9e3a,
+ },
+ 313696: FunctionGUID {
+ guid: ccbd9943-6b24-59d8-ae4d-3ee868a2729c,
+ },
+ 314064: FunctionGUID {
+ guid: ccbd9943-6b24-59d8-ae4d-3ee868a2729c,
+ },
+ 314432: FunctionGUID {
+ guid: 669a32f2-f1e9-5b38-98aa-9eb8431ebc4e,
+ },
+ 315360: FunctionGUID {
+ guid: 02d864ef-80bc-5265-b78f-0e42815a4d1d,
+ },
+ 315696: FunctionGUID {
+ guid: 02d864ef-80bc-5265-b78f-0e42815a4d1d,
+ },
+ 316032: FunctionGUID {
+ guid: 8dca0c9d-bdb7-56a1-9832-431aec16a68f,
+ },
+ 318192: FunctionGUID {
+ guid: 9e4c3806-b291-569c-a687-0bcaa48e248b,
+ },
+ 318960: FunctionGUID {
+ guid: 4ba8a311-60f3-57d4-a17a-c0cc93f5c2a4,
+ },
+ 319616: FunctionGUID {
+ guid: 31a8e73e-74fe-5a33-b0ab-aa1b136e021d,
+ },
+ 320288: FunctionGUID {
+ guid: c3842e85-b9f2-54d5-b353-e9bb2a0b1203,
+ },
+ 320912: FunctionGUID {
+ guid: c3842e85-b9f2-54d5-b353-e9bb2a0b1203,
+ },
+ 321536: FunctionGUID {
+ guid: 8e490dee-4a47-5582-bb8d-0b502f4d70ba,
+ },
+ 322800: FunctionGUID {
+ guid: 88d9b26b-3884-58d6-b164-435d8d888e5c,
+ },
+ 323168: FunctionGUID {
+ guid: 3cc2e827-b707-5c9d-82e9-d76ac3abc904,
+ },
+ 323504: FunctionGUID {
+ guid: bfaf2f0a-d92d-5ef7-879d-86eb0ca01257,
+ },
+ 323824: FunctionGUID {
+ guid: e8290b3d-cf56-5c1b-8315-abce0f135559,
+ },
+ 324176: FunctionGUID {
+ guid: 53b484f3-751a-505d-beae-acc9d69c261d,
+ },
+ 324496: FunctionGUID {
+ guid: bfaf2f0a-d92d-5ef7-879d-86eb0ca01257,
+ },
+ 324816: FunctionGUID {
+ guid: e8290b3d-cf56-5c1b-8315-abce0f135559,
+ },
+ 325168: FunctionGUID {
+ guid: 5b7f41e9-de1e-558c-ac7d-888acca3a76c,
+ },
+ 325520: FunctionGUID {
+ guid: 43a8c54b-dd4f-5334-ae00-218cb758ad4c,
+ },
+ 325952: FunctionGUID {
+ guid: b098f8a1-ecdd-5938-8da3-bb37935c6b7e,
+ },
+ 326256: FunctionGUID {
+ guid: 53b484f3-751a-505d-beae-acc9d69c261d,
+ },
+ 326576: FunctionGUID {
+ guid: b098f8a1-ecdd-5938-8da3-bb37935c6b7e,
+ },
+ 326880: FunctionGUID {
+ guid: f37cf37b-b19d-5575-b2c7-a6604d3faa69,
+ },
+}
diff --git a/plugins/warp/tests/snapshots/determinism__atoldbl.obj.snap b/plugins/warp/tests/snapshots/determinism__atoldbl.obj.snap
new file mode 100644
index 00000000..2ff5221d
--- /dev/null
+++ b/plugins/warp/tests/snapshots/determinism__atoldbl.obj.snap
@@ -0,0 +1,192 @@
+---
+source: plugins/warp/tests/determinism.rs
+expression: functions
+---
+{
+ 223424: FunctionGUID {
+ guid: 29690354-fa27-54d1-a8be-18535b19b1c3,
+ },
+ 223744: FunctionGUID {
+ guid: c5717076-f595-525b-8db8-ca79496236ce,
+ },
+ 224800: FunctionGUID {
+ guid: c5717076-f595-525b-8db8-ca79496236ce,
+ },
+ 225856: FunctionGUID {
+ guid: 1de88f85-a19c-5454-9122-ddc80f7509b4,
+ },
+ 226240: FunctionGUID {
+ guid: c5766cb0-afbc-5701-ad2f-23d980f4bc15,
+ },
+ 226720: FunctionGUID {
+ guid: 29690354-fa27-54d1-a8be-18535b19b1c3,
+ },
+ 227024: FunctionGUID {
+ guid: ce28e080-0609-5bcd-abe1-2a6e57c91f83,
+ },
+ 228320: FunctionGUID {
+ guid: 41fd6d24-0f8b-5848-9873-65b98bd370ab,
+ },
+ 232656: FunctionGUID {
+ guid: 4f645f3c-3e89-5b5d-a185-9f1a25e94ed2,
+ },
+ 233840: FunctionGUID {
+ guid: 7c43c697-22ef-57a9-a43a-2214e627749d,
+ },
+ 235280: FunctionGUID {
+ guid: 45770948-1c56-5b24-bd38-f5a559ae8d22,
+ },
+ 235824: FunctionGUID {
+ guid: cf4808fe-2fea-517d-8f85-f88ddc96cc78,
+ },
+ 236368: FunctionGUID {
+ guid: 86ab6ab4-45e5-5c08-9a47-05344ea503ab,
+ },
+ 237872: FunctionGUID {
+ guid: 364c5864-0cd1-5527-8ca0-2378d5b4c0a5,
+ },
+ 238512: FunctionGUID {
+ guid: 9891b84c-000b-529a-8c5b-d762120eff9d,
+ },
+ 239136: FunctionGUID {
+ guid: 61d32a04-c077-5985-b241-c326dd5b1864,
+ },
+ 239760: FunctionGUID {
+ guid: 48551d5f-2e1f-557b-85a3-a122d3ce07cf,
+ },
+ 240384: FunctionGUID {
+ guid: a707a2d3-c7d2-5b93-97c9-1db77d8ccfe5,
+ },
+ 240816: FunctionGUID {
+ guid: a707a2d3-c7d2-5b93-97c9-1db77d8ccfe5,
+ },
+ 241248: FunctionGUID {
+ guid: a707a2d3-c7d2-5b93-97c9-1db77d8ccfe5,
+ },
+ 241680: FunctionGUID {
+ guid: a482559e-6a69-505e-b692-147deeced692,
+ },
+ 242112: FunctionGUID {
+ guid: 1e794537-6289-59e7-bef9-0c72f3989db8,
+ },
+ 242800: FunctionGUID {
+ guid: 7995ca73-04fe-5b30-9e88-1e69197007c1,
+ },
+ 243184: FunctionGUID {
+ guid: 6abe3fc2-6d29-5fde-a31e-bb8249db6bf9,
+ },
+ 243536: FunctionGUID {
+ guid: 8c736b66-b63f-5000-a060-2e60a1b8952a,
+ },
+ 243952: FunctionGUID {
+ guid: 8c736b66-b63f-5000-a060-2e60a1b8952a,
+ },
+ 244368: FunctionGUID {
+ guid: 8c736b66-b63f-5000-a060-2e60a1b8952a,
+ },
+ 244784: FunctionGUID {
+ guid: 13b16f81-0c6f-5aee-ad9f-0d142658cf18,
+ },
+ 245088: FunctionGUID {
+ guid: 8a2b7bda-5fdb-5ba3-888b-20d5b8d7b2cd,
+ },
+ 245424: FunctionGUID {
+ guid: a030f6f1-e29b-5e4a-8f83-56e6c6c51c15,
+ },
+ 245952: FunctionGUID {
+ guid: b9e4b6b0-47c3-54ca-9a01-56916ea0db8e,
+ },
+ 246352: FunctionGUID {
+ guid: b64bd893-5369-5ab2-a869-5f12d3fe313e,
+ },
+ 246768: FunctionGUID {
+ guid: 6763e6c5-c15f-5eed-9dc9-e0c73284bb59,
+ },
+ 247248: FunctionGUID {
+ guid: f489ca06-a1f3-5993-80ed-368eff1b7766,
+ },
+ 247728: FunctionGUID {
+ guid: e12a9f6c-c7cc-573d-b488-e617331aedd9,
+ },
+ 248208: FunctionGUID {
+ guid: 1556466b-b8ff-5131-b8f3-ce53b21e973b,
+ },
+ 248672: FunctionGUID {
+ guid: 73674636-a0a6-503a-bda7-55fc27f1bb58,
+ },
+ 249680: FunctionGUID {
+ guid: 9676fc90-ecba-595b-8d24-5df4e66ac683,
+ },
+ 250048: FunctionGUID {
+ guid: 3c83a5f5-215d-5d25-97c8-ffe65f73907c,
+ },
+ 250416: FunctionGUID {
+ guid: 4c636a77-6420-5996-95de-d3c1497d60b7,
+ },
+ 251088: FunctionGUID {
+ guid: a603d813-2b33-567d-80c8-06e31562a400,
+ },
+ 251440: FunctionGUID {
+ guid: 22c32840-7bb0-5d80-858c-55dd04553db0,
+ },
+ 252064: FunctionGUID {
+ guid: eefbc8a9-f4f1-5725-9a4f-9dcd04ea3478,
+ },
+ 252496: FunctionGUID {
+ guid: a23505e4-e7cd-5543-897c-46b97c1eaef3,
+ },
+ 252864: FunctionGUID {
+ guid: 8ccf8b37-65c5-525a-b96a-64f26d711c75,
+ },
+ 253424: FunctionGUID {
+ guid: f9a15815-d271-5c30-893a-239acdb42d21,
+ },
+ 255936: FunctionGUID {
+ guid: 7a4eafb9-4b86-5aac-b64f-af5d85be4a39,
+ },
+ 256768: FunctionGUID {
+ guid: 0e4df1e2-2b70-5087-8518-d9cbbe62e048,
+ },
+ 257264: FunctionGUID {
+ guid: 5779439c-a22f-5d33-8868-4e1832ad49e9,
+ },
+ 257696: FunctionGUID {
+ guid: ccbd9943-6b24-59d8-ae4d-3ee868a2729c,
+ },
+ 258064: FunctionGUID {
+ guid: bae57993-863a-5c22-b8bb-92b862148af3,
+ },
+ 258864: FunctionGUID {
+ guid: 02d864ef-80bc-5265-b78f-0e42815a4d1d,
+ },
+ 259200: FunctionGUID {
+ guid: 6ef93fa8-909e-596c-9454-74b89e8cabb7,
+ },
+ 259648: FunctionGUID {
+ guid: a45d9322-0d45-5dc9-b17b-32b843416c4b,
+ },
+ 260000: FunctionGUID {
+ guid: 4ba8a311-60f3-57d4-a17a-c0cc93f5c2a4,
+ },
+ 260656: FunctionGUID {
+ guid: c3842e85-b9f2-54d5-b353-e9bb2a0b1203,
+ },
+ 261280: FunctionGUID {
+ guid: 88d9b26b-3884-58d6-b164-435d8d888e5c,
+ },
+ 261648: FunctionGUID {
+ guid: 3cc2e827-b707-5c9d-82e9-d76ac3abc904,
+ },
+ 261984: FunctionGUID {
+ guid: bfaf2f0a-d92d-5ef7-879d-86eb0ca01257,
+ },
+ 262304: FunctionGUID {
+ guid: f25e7750-c61c-5ed8-a43d-959c3ba3a5b4,
+ },
+ 262976: FunctionGUID {
+ guid: 5b7f41e9-de1e-558c-ac7d-888acca3a76c,
+ },
+ 263328: FunctionGUID {
+ guid: 43a8c54b-dd4f-5334-ae00-218cb758ad4c,
+ },
+}
diff --git a/plugins/warp/tests/snapshots/determinism__atox.obj.snap b/plugins/warp/tests/snapshots/determinism__atox.obj.snap
new file mode 100644
index 00000000..57e4e2e9
--- /dev/null
+++ b/plugins/warp/tests/snapshots/determinism__atox.obj.snap
@@ -0,0 +1,186 @@
+---
+source: plugins/warp/tests/determinism.rs
+expression: functions
+---
+{
+ 220944: FunctionGUID {
+ guid: 29690354-fa27-54d1-a8be-18535b19b1c3,
+ },
+ 221264: FunctionGUID {
+ guid: 39d556f9-435a-5105-b56c-6558ddc63fc0,
+ },
+ 221760: FunctionGUID {
+ guid: 46eae5e0-61e2-5316-9e4d-030dd2240567,
+ },
+ 222304: FunctionGUID {
+ guid: 1de88f85-a19c-5454-9122-ddc80f7509b4,
+ },
+ 222688: FunctionGUID {
+ guid: 1de88f85-a19c-5454-9122-ddc80f7509b4,
+ },
+ 223072: FunctionGUID {
+ guid: 067d6811-472a-5e4a-b65f-3760df0b7bd5,
+ },
+ 225616: FunctionGUID {
+ guid: 33717d5d-a15f-5c10-bc4a-d85cce963aca,
+ },
+ 228160: FunctionGUID {
+ guid: 65cb411a-0ae9-546f-9293-3abaa3fd1c31,
+ },
+ 230912: FunctionGUID {
+ guid: 0244fa6b-6425-5aa9-ad87-2378cc4992e7,
+ },
+ 233680: FunctionGUID {
+ guid: 3f9f8782-0b8c-5843-8b1d-831a1ef9b024,
+ },
+ 234128: FunctionGUID {
+ guid: 3f9f8782-0b8c-5843-8b1d-831a1ef9b024,
+ },
+ 234592: FunctionGUID {
+ guid: 3f9f8782-0b8c-5843-8b1d-831a1ef9b024,
+ },
+ 235056: FunctionGUID {
+ guid: 3f9f8782-0b8c-5843-8b1d-831a1ef9b024,
+ },
+ 235520: FunctionGUID {
+ guid: a482559e-6a69-505e-b692-147deeced692,
+ },
+ 235952: FunctionGUID {
+ guid: a482559e-6a69-505e-b692-147deeced692,
+ },
+ 236384: FunctionGUID {
+ guid: 1e794537-6289-59e7-bef9-0c72f3989db8,
+ },
+ 237072: FunctionGUID {
+ guid: 7995ca73-04fe-5b30-9e88-1e69197007c1,
+ },
+ 237456: FunctionGUID {
+ guid: 7995ca73-04fe-5b30-9e88-1e69197007c1,
+ },
+ 237840: FunctionGUID {
+ guid: 6abe3fc2-6d29-5fde-a31e-bb8249db6bf9,
+ },
+ 238192: FunctionGUID {
+ guid: 13b16f81-0c6f-5aee-ad9f-0d142658cf18,
+ },
+ 238496: FunctionGUID {
+ guid: 8a2b7bda-5fdb-5ba3-888b-20d5b8d7b2cd,
+ },
+ 238832: FunctionGUID {
+ guid: a603d813-2b33-567d-80c8-06e31562a400,
+ },
+ 239184: FunctionGUID {
+ guid: 56c82b1f-380c-52fe-ae70-a39962e5ffdc,
+ },
+ 239536: FunctionGUID {
+ guid: a23505e4-e7cd-5543-897c-46b97c1eaef3,
+ },
+ 239904: FunctionGUID {
+ guid: 9ef21651-3eaf-5940-8e72-104bda834e85,
+ },
+ 240256: FunctionGUID {
+ guid: c66dd704-899b-5d58-9d4a-136063f5f552,
+ },
+ 240560: FunctionGUID {
+ guid: 283e5e36-a239-5f0c-8937-f48a4b1d86e0,
+ },
+ 240864: FunctionGUID {
+ guid: a8a9d162-b637-5ce6-82f8-a8ac0fb740dc,
+ },
+ 241168: FunctionGUID {
+ guid: f674b84a-7a05-5ca0-aac4-5b5598683087,
+ },
+ 241472: FunctionGUID {
+ guid: 5779439c-a22f-5d33-8868-4e1832ad49e9,
+ },
+ 241904: FunctionGUID {
+ guid: 0916139e-a5db-51c8-be24-2c6fb20a9e3a,
+ },
+ 242384: FunctionGUID {
+ guid: ccbd9943-6b24-59d8-ae4d-3ee868a2729c,
+ },
+ 242752: FunctionGUID {
+ guid: ccbd9943-6b24-59d8-ae4d-3ee868a2729c,
+ },
+ 243120: FunctionGUID {
+ guid: 02d864ef-80bc-5265-b78f-0e42815a4d1d,
+ },
+ 243456: FunctionGUID {
+ guid: 02d864ef-80bc-5265-b78f-0e42815a4d1d,
+ },
+ 243792: FunctionGUID {
+ guid: 4ba8a311-60f3-57d4-a17a-c0cc93f5c2a4,
+ },
+ 244448: FunctionGUID {
+ guid: 31a8e73e-74fe-5a33-b0ab-aa1b136e021d,
+ },
+ 245120: FunctionGUID {
+ guid: c3842e85-b9f2-54d5-b353-e9bb2a0b1203,
+ },
+ 245744: FunctionGUID {
+ guid: c3842e85-b9f2-54d5-b353-e9bb2a0b1203,
+ },
+ 246368: FunctionGUID {
+ guid: 8e490dee-4a47-5582-bb8d-0b502f4d70ba,
+ },
+ 247632: FunctionGUID {
+ guid: 88d9b26b-3884-58d6-b164-435d8d888e5c,
+ },
+ 248000: FunctionGUID {
+ guid: 3cc2e827-b707-5c9d-82e9-d76ac3abc904,
+ },
+ 248336: FunctionGUID {
+ guid: bdf90a04-d375-59b1-8a92-b962b3f914ae,
+ },
+ 248640: FunctionGUID {
+ guid: 580affd8-2657-50b2-9b65-3327422894de,
+ },
+ 248976: FunctionGUID {
+ guid: 580affd8-2657-50b2-9b65-3327422894de,
+ },
+ 249296: FunctionGUID {
+ guid: 580affd8-2657-50b2-9b65-3327422894de,
+ },
+ 249616: FunctionGUID {
+ guid: 580affd8-2657-50b2-9b65-3327422894de,
+ },
+ 249936: FunctionGUID {
+ guid: 5b7f41e9-de1e-558c-ac7d-888acca3a76c,
+ },
+ 250288: FunctionGUID {
+ guid: 43a8c54b-dd4f-5334-ae00-218cb758ad4c,
+ },
+ 250720: FunctionGUID {
+ guid: bdf90a04-d375-59b1-8a92-b962b3f914ae,
+ },
+ 251024: FunctionGUID {
+ guid: bdf90a04-d375-59b1-8a92-b962b3f914ae,
+ },
+ 251328: FunctionGUID {
+ guid: 580affd8-2657-50b2-9b65-3327422894de,
+ },
+ 251664: FunctionGUID {
+ guid: 580affd8-2657-50b2-9b65-3327422894de,
+ },
+ 251984: FunctionGUID {
+ guid: bdf90a04-d375-59b1-8a92-b962b3f914ae,
+ },
+ 252288: FunctionGUID {
+ guid: 580affd8-2657-50b2-9b65-3327422894de,
+ },
+ 252608: FunctionGUID {
+ guid: bdf90a04-d375-59b1-8a92-b962b3f914ae,
+ },
+ 252912: FunctionGUID {
+ guid: 580affd8-2657-50b2-9b65-3327422894de,
+ },
+ 253232: FunctionGUID {
+ guid: bdf90a04-d375-59b1-8a92-b962b3f914ae,
+ },
+ 253536: FunctionGUID {
+ guid: bdf90a04-d375-59b1-8a92-b962b3f914ae,
+ },
+ 253840: FunctionGUID {
+ guid: bdf90a04-d375-59b1-8a92-b962b3f914ae,
+ },
+}