From ac2f4e395175abedc53a1b5bb62119e142b24b32 Mon Sep 17 00:00:00 2001 From: Bing Guo Date: Tue, 23 Dec 2025 12:46:01 -0500 Subject: [PATCH] fix: use c_char instead of i8 when handling C strings --- .github/workflows/tests.yml | 4 ++-- src/metadata.rs | 3 ++- src/sys/edge_table.rs | 3 ++- src/sys/individual_table.rs | 3 ++- src/sys/migration_table.rs | 3 ++- src/sys/mutation_table.rs | 5 +++-- src/sys/node_table.rs | 3 ++- src/sys/population_table.rs | 3 ++- src/sys/provenance_table.rs | 5 +++-- src/sys/site_table.rs | 5 +++-- src/trees/treeseq.rs | 7 +++++-- 11 files changed, 28 insertions(+), 16 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 90a4315e7..3e49e8eb5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,7 +13,7 @@ jobs: # image: ubuntu:20.10 strategy: matrix: - os: [ubuntu-24.04, macos-latest] + os: [ubuntu-24.04, ubuntu-24.04-arm, macos-latest] rust: - stable steps: @@ -32,7 +32,7 @@ jobs: - uses: Swatinem/rust-cache@v2.8.2 - uses: taiki-e/install-action@cargo-hack - run: sudo apt-get update -y - if: matrix.os == 'ubuntu-24.04' + if: (matrix.os == 'ubuntu-24.04') || (matrix.os == 'ubuntu-24.04-arm') - name: update toolchain run: rustup toolchain install - name: cargo check (powerset) diff --git a/src/metadata.rs b/src/metadata.rs index 450b50095..975e1f3c0 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -239,13 +239,14 @@ pub use crate::sys::MetadataError; #[cfg(test)] mod tests { use super::*; + use std::ffi::c_char; #[test] fn test_vec8_cast_to_c_string() { let v: Vec = vec![0, 1, b'\0', 2, 3]; let c = v.as_ptr() as *const libc::c_char; for (i, vi) in v.iter().enumerate() { - assert_eq!(*vi as i8, unsafe { *c.add(i) }); + assert_eq!(*vi as c_char, unsafe { *c.add(i) }); } let _ = match Some(&v) { diff --git a/src/sys/edge_table.rs b/src/sys/edge_table.rs index 5f58223ab..29a77a824 100644 --- a/src/sys/edge_table.rs +++ b/src/sys/edge_table.rs @@ -1,3 +1,4 @@ +use std::ffi::c_char; use std::ptr::NonNull; use super::newtypes::EdgeId; @@ -64,7 +65,7 @@ impl EdgeTable { right, parent, child, - metadata.as_ptr().cast::(), + metadata.as_ptr().cast::(), metadata.len() as u64, )) } diff --git a/src/sys/individual_table.rs b/src/sys/individual_table.rs index 3125a859b..c8e9ace49 100644 --- a/src/sys/individual_table.rs +++ b/src/sys/individual_table.rs @@ -1,3 +1,4 @@ +use std::ffi::c_char; use std::ptr::NonNull; use super::bindings::tsk_size_t; @@ -65,7 +66,7 @@ impl IndividualTable { location.len() as u64, parents.as_ptr(), parents.len() as u64, - metadata.as_ptr().cast::(), + metadata.as_ptr().cast::(), metadata.len() as u64, )) } diff --git a/src/sys/migration_table.rs b/src/sys/migration_table.rs index 1ee3cfa66..e2e921ac2 100644 --- a/src/sys/migration_table.rs +++ b/src/sys/migration_table.rs @@ -1,3 +1,4 @@ +use std::ffi::c_char; use std::ptr::NonNull; use super::newtypes::MigrationId; @@ -71,7 +72,7 @@ impl MigrationTable { source, dest, time, - metadata.as_ptr().cast::(), + metadata.as_ptr().cast::(), metadata.len() as u64, )) } diff --git a/src/sys/mutation_table.rs b/src/sys/mutation_table.rs index c37abed3c..66fcffade 100644 --- a/src/sys/mutation_table.rs +++ b/src/sys/mutation_table.rs @@ -1,3 +1,4 @@ +use std::ffi::c_char; use std::ptr::NonNull; use super::newtypes::MutationId; @@ -70,14 +71,14 @@ impl MutationTable { parent, time, match derived_state { - Some(d) => d.as_ptr() as *const i8, + Some(d) => d.as_ptr() as *const c_char, None => std::ptr::null(), }, match derived_state { Some(d) => d.len() as u64, None => 0, }, - metadata.as_ptr().cast::(), + metadata.as_ptr().cast::(), metadata.len() as u64, )) } diff --git a/src/sys/node_table.rs b/src/sys/node_table.rs index f529f374e..603cc7a04 100644 --- a/src/sys/node_table.rs +++ b/src/sys/node_table.rs @@ -1,3 +1,4 @@ +use std::ffi::c_char; use std::ptr::NonNull; use super::flags::NodeFlags; @@ -80,7 +81,7 @@ impl NodeTable { time.into().into(), population.into().into(), individual.into().into(), - metadata.as_ptr().cast::(), + metadata.as_ptr().cast::(), metadata.len() as u64, ) } { diff --git a/src/sys/population_table.rs b/src/sys/population_table.rs index 49051bdca..b93a7c979 100644 --- a/src/sys/population_table.rs +++ b/src/sys/population_table.rs @@ -1,3 +1,4 @@ +use std::ffi::c_char; use std::ptr::NonNull; use super::bindings::tsk_id_t; @@ -44,7 +45,7 @@ impl PopulationTable { unsafe { Ok(tsk_population_table_add_row( self.as_mut(), - metadata.as_ptr().cast::(), + metadata.as_ptr().cast::(), metadata.len() as u64, )) } diff --git a/src/sys/provenance_table.rs b/src/sys/provenance_table.rs index c52591e17..2aa0b9a3a 100644 --- a/src/sys/provenance_table.rs +++ b/src/sys/provenance_table.rs @@ -10,6 +10,7 @@ use super::bindings::tsk_provenance_table_t; use super::bindings::tsk_size_t; use super::tskbox::TskBox; use super::TskitError; +use std::ffi::c_char; #[derive(Debug)] pub struct ProvenanceTable(TskBox); @@ -49,9 +50,9 @@ impl ProvenanceTable { let rv = unsafe { tsk_provenance_table_add_row( self.as_mut(), - timestamp.as_ptr() as *mut i8, + timestamp.as_ptr() as *const c_char, timestamp.len() as tsk_size_t, - record.as_ptr() as *mut i8, + record.as_ptr() as *const c_char, record.len() as tsk_size_t, ) }; diff --git a/src/sys/site_table.rs b/src/sys/site_table.rs index 6ccf0c551..74f1058fb 100644 --- a/src/sys/site_table.rs +++ b/src/sys/site_table.rs @@ -1,3 +1,4 @@ +use std::ffi::c_char; use std::ptr::NonNull; use super::bindings::tsk_size_t; @@ -58,14 +59,14 @@ impl SiteTable { self.as_mut(), position, match ancestral_state { - Some(d) => d.as_ptr() as *const i8, + Some(d) => d.as_ptr() as *const c_char, None => std::ptr::null(), }, match ancestral_state { Some(d) => d.len() as u64, None => 0, }, - metadata.as_ptr().cast::(), + metadata.as_ptr().cast::(), metadata.len() as u64, )) } diff --git a/src/trees/treeseq.rs b/src/trees/treeseq.rs index 3f8002459..bca2e4ec4 100644 --- a/src/trees/treeseq.rs +++ b/src/trees/treeseq.rs @@ -18,6 +18,9 @@ use crate::TreeSequenceFlags; use crate::TskReturnValue; use sys::bindings as ll_bindings; +#[cfg(feature = "provenance")] +use std::ffi::c_char; + use super::Tree; /// A tree sequence. @@ -468,9 +471,9 @@ impl TreeSequence { let rv = unsafe { ll_bindings::tsk_provenance_table_add_row( &mut (*self.inner.as_ref().tables).provenances, - timestamp.as_ptr() as *mut i8, + timestamp.as_ptr() as *const c_char, timestamp.len() as ll_bindings::tsk_size_t, - record.as_ptr() as *mut i8, + record.as_ptr() as *const c_char, record.len() as ll_bindings::tsk_size_t, ) };