Skip to content

Commit c7207dc

Browse files
domenukkrmalmain
andauthored
Rust 2024 edition (#3022)
* Rust 2024 edition * gen = generalized * Fixes * more fix * More fix * even more fix * fix libfuzzer * ignore clippy lint * even more * fix docs? * more? * More pub more better * win * docs * more * More * doc stuff? * counter_maps->counters_maps * libafl qemu fixes for rust 2024 * fix? * fmt * unsafe lint * final fixes * fmt * working? * not working * unused import * win? * update libafl qemu hash * fmt * fix * unused imports * fix * fix * more foix * less edition * fix --------- Co-authored-by: Romain Malmain <[email protected]>
1 parent 3d31adc commit c7207dc

File tree

336 files changed

+4360
-3117
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

336 files changed

+4360
-3117
lines changed

.github/workflows/build_and_test.yml

+1
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ jobs:
223223
steps:
224224
- uses: actions/checkout@v4
225225
- uses: taiki-e/install-action@cargo-hack
226+
- run: rustup upgrade
226227
# Note: We currently only specify minimum rust versions for the default workspace members
227228
- run: cargo hack check --rust-version -p libafl -p libafl_bolts -p libafl_derive -p libafl_cc -p libafl_targets
228229

.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,5 @@ libafl_nyx/packer
7474
harness
7575
program
7676
fuzzer_libpng*
77-
forkserver_simple
7877

7978
*.patch

bindings/pylibafl/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ version = "0.15.1"
55
license = "MIT OR Apache-2.0"
66
repository = "https://github.com/AFLplusplus/LibAFL/"
77
keywords = ["fuzzing", "testing", "security", "python"]
8-
edition = "2021"
8+
edition = "2024"
99
categories = ["development-tools::testing", "emulators", "embedded", "os"]
1010

1111
[dependencies]

docs/src/advanced_features/no_std.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Here, we use it in Rust. `external_current_millis` is then called from LibAFL.
3131
Note that it needs to be `no_mangle` in order to get picked up by LibAFL at linktime:
3232
3333
```rust,ignore
34-
#[no_mangle]
34+
#[unsafe(no_mangle)]
3535
pub extern "C" fn external_current_millis() -> u64 {
3636
unsafe { my_real_seconds()*1000 }
3737
}

docs/src/core_concepts/executor.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ As you can see from the forkserver example,
3232
//Coverage map shared between observer and executor
3333
let mut shmem = StdShMemProvider::new().unwrap().new_shmem(MAP_SIZE).unwrap();
3434
//let the forkserver know the shmid
35-
shmem.write_to_env("__AFL_SHM_ID").unwrap();
35+
unsafe {
36+
shmem.write_to_env("__AFL_SHM_ID").unwrap();
37+
}
3638
let mut shmem_buf = shmem.as_slice_mut();
3739
```
3840

fuzzers/baby/baby_fuzzer_swap_differential/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ debug = true
2121

2222
[build-dependencies]
2323
anyhow = "1.0.89"
24-
bindgen = "0.70.1"
24+
bindgen = "0.71.1"
2525
cc = "=1.2.7" # fix me later
2626

2727
[dependencies]

fuzzers/baby/backtrace_baby_fuzzers/forkserver_executor/src/main.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ pub fn main() {
4040

4141
let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap();
4242
//let the forkserver know the shmid
43-
shmem.write_to_env("__AFL_SHM_ID").unwrap();
43+
unsafe {
44+
shmem.write_to_env("__AFL_SHM_ID").unwrap();
45+
}
4446
let shmem_map: &mut [u8; MAP_SIZE] = shmem
4547
.as_slice_mut()
4648
.try_into()

fuzzers/forkserver/forkserver_libafl_cc/src/main.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@ pub fn main() {
9797
// The coverage map shared between observer and executor
9898
let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap();
9999
// let the forkserver know the shmid
100-
shmem.write_to_env("__AFL_SHM_ID").unwrap();
100+
unsafe {
101+
shmem.write_to_env("__AFL_SHM_ID").unwrap();
102+
}
101103
let shmem_buf = shmem.as_slice_mut();
102104
// the next line is not needed
103105
// unsafe { EDGES_MAP_PTR = shmem_buf.as_mut_ptr() };

fuzzers/forkserver/forkserver_simple/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "forkserver_simple"
33
version = "0.14.1"
44
authors = ["tokatoka <[email protected]>"]
5-
edition = "2021"
5+
edition = "2024"
66

77
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
88

fuzzers/forkserver/forkserver_simple/build.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::{
22
env,
33
path::Path,
4-
process::{exit, Command},
4+
process::{Command, exit},
55
};
66

77
const AFL_URL: &str = "https://github.com/AFLplusplus/AFLplusplus";
@@ -12,7 +12,9 @@ fn main() {
1212
exit(0);
1313
}
1414

15-
env::remove_var("DEBUG");
15+
unsafe {
16+
env::remove_var("DEBUG");
17+
}
1618
let cwd = env::current_dir().unwrap().to_string_lossy().to_string();
1719

1820
let afl = format!("{}/AFLplusplus", &cwd);

fuzzers/forkserver/forkserver_simple/src/main.rs

+8-7
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,26 @@ use std::path::PathBuf;
33

44
use clap::Parser;
55
use libafl::{
6+
HasMetadata,
67
corpus::{Corpus, InMemoryCorpus, OnDiskCorpus},
78
events::SimpleEventManager,
8-
executors::{forkserver::ForkserverExecutor, HasObservers},
9+
executors::{HasObservers, forkserver::ForkserverExecutor},
910
feedback_and_fast, feedback_or,
1011
feedbacks::{CrashFeedback, MaxMapFeedback, TimeFeedback},
1112
fuzzer::{Fuzzer, StdFuzzer},
1213
inputs::BytesInput,
1314
monitors::SimpleMonitor,
14-
mutators::{havoc_mutations, tokens_mutations, StdScheduledMutator, Tokens},
15+
mutators::{StdScheduledMutator, Tokens, havoc_mutations, tokens_mutations},
1516
observers::{CanTrack, HitcountsMapObserver, StdMapObserver, TimeObserver},
1617
schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler},
1718
stages::mutational::StdMutationalStage,
1819
state::{HasCorpus, StdState},
19-
HasMetadata,
2020
};
2121
use libafl_bolts::{
22-
current_nanos,
22+
AsSliceMut, Truncate, current_nanos,
2323
rands::StdRand,
2424
shmem::{ShMem, ShMemProvider, UnixShMemProvider},
25-
tuples::{tuple_list, Handled, Merge},
26-
AsSliceMut, Truncate,
25+
tuples::{Handled, Merge, tuple_list},
2726
};
2827
use nix::sys::signal::Signal;
2928

@@ -97,7 +96,9 @@ pub fn main() {
9796
// The coverage map shared between observer and executor
9897
let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap();
9998
// let the forkserver know the shmid
100-
shmem.write_to_env("__AFL_SHM_ID").unwrap();
99+
unsafe {
100+
shmem.write_to_env("__AFL_SHM_ID").unwrap();
101+
}
101102
let shmem_buf = shmem.as_slice_mut();
102103

103104
// Create an observation channel using the signals map

fuzzers/forkserver/fuzzbench_forkserver/src/main.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,9 @@ fn fuzz(
242242
// The coverage map shared between observer and executor
243243
let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap();
244244
// let the forkserver know the shmid
245-
shmem.write_to_env("__AFL_SHM_ID").unwrap();
245+
unsafe {
246+
shmem.write_to_env("__AFL_SHM_ID").unwrap();
247+
}
246248
let shmem_buf = shmem.as_slice_mut();
247249
// To let know the AFL++ binary that we have a big map
248250
std::env::set_var("AFL_MAP_SIZE", format!("{}", MAP_SIZE));
@@ -348,7 +350,9 @@ fn fuzz(
348350
// The cmplog map shared between observer and executor
349351
let mut cmplog_shmem = shmem_provider.uninit_on_shmem::<AFLppCmpLogMap>().unwrap();
350352
// let the forkserver know the shmid
351-
cmplog_shmem.write_to_env("__AFL_CMPLOG_SHM_ID").unwrap();
353+
unsafe {
354+
cmplog_shmem.write_to_env("__AFL_CMPLOG_SHM_ID").unwrap();
355+
}
352356
let cmpmap = unsafe { OwnedRefMut::<AFLppCmpLogMap>::from_shmem(&mut cmplog_shmem) };
353357

354358
let cmplog_observer = StdCmpObserver::new("cmplog", cmpmap, true);

fuzzers/forkserver/fuzzbench_forkserver_cmplog/src/main.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,9 @@ fn fuzz(
244244
// The coverage map shared between observer and executor
245245
let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap();
246246
// let the forkserver know the shmid
247-
shmem.write_to_env("__AFL_SHM_ID").unwrap();
247+
unsafe {
248+
shmem.write_to_env("__AFL_SHM_ID").unwrap();
249+
}
248250
let shmem_buf = shmem.as_slice_mut();
249251
// To let know the AFL++ binary that we have a big map
250252
std::env::set_var("AFL_MAP_SIZE", format!("{MAP_SIZE}"));
@@ -351,7 +353,9 @@ fn fuzz(
351353
// The cmplog map shared between observer and executor
352354
let mut cmplog_shmem = shmem_provider.uninit_on_shmem::<AFLppCmpLogMap>().unwrap();
353355
// let the forkserver know the shmid
354-
cmplog_shmem.write_to_env("__AFL_CMPLOG_SHM_ID").unwrap();
356+
unsafe {
357+
cmplog_shmem.write_to_env("__AFL_CMPLOG_SHM_ID").unwrap();
358+
}
355359
let cmpmap = unsafe { OwnedRefMut::from_shmem(&mut cmplog_shmem) };
356360

357361
let cmplog_observer = AFLppCmpLogObserver::new("cmplog", cmpmap, true);

fuzzers/forkserver/libafl-fuzz/src/executor.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ pub fn find_afl_binary(filename: &str, same_dir_as: Option<PathBuf>) -> Result<P
200200
false
201201
};
202202

203-
#[expect(clippy::useless_conversion)] // u16 on MacOS, u32 on Linux
203+
#[allow(clippy::useless_conversion)] // u16 on MacOS, u32 on Linux
204204
let permission = if is_library {
205205
u32::from(S_IRUSR) // user can read
206206
} else {

fuzzers/forkserver/libafl-fuzz/src/fuzzer.rs

+17-8
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ define_run_client!(state, mgr, fuzzer_dir, core_id, opt, is_main_node, {
122122
let mut shmem = shmem_provider
123123
.new_shmem(opt.map_size.unwrap_or(AFL_DEFAULT_MAP_SIZE))
124124
.unwrap();
125-
shmem.write_to_env(SHMEM_ENV_VAR).unwrap();
125+
unsafe {
126+
shmem.write_to_env(SHMEM_ENV_VAR).unwrap();
127+
}
126128
let shmem_buf = shmem.as_slice_mut();
127129

128130
// If we are in Nyx Mode, we need to use a different map observer.
@@ -300,14 +302,17 @@ define_run_client!(state, mgr, fuzzer_dir, core_id, opt, is_main_node, {
300302

301303
// Set LD_PRELOAD (Linux) && DYLD_INSERT_LIBRARIES (OSX) for target.
302304
if let Some(preload_env) = &opt.afl_preload {
303-
std::env::set_var("LD_PRELOAD", preload_env);
304-
std::env::set_var("DYLD_INSERT_LIBRARIES", preload_env);
305+
// TODO: Audit that the environment access only happens in single-threaded code.
306+
unsafe { std::env::set_var("LD_PRELOAD", preload_env) };
307+
// TODO: Audit that the environment access only happens in single-threaded code.
308+
unsafe { std::env::set_var("DYLD_INSERT_LIBRARIES", preload_env) };
305309
}
306310

307311
// Insert appropriate shared libraries if frida_mode
308312
if opt.frida_mode {
309313
if opt.frida_asan {
310-
std::env::set_var("ASAN_OPTIONS", "detect_leaks=false");
314+
// TODO: Audit that the environment access only happens in single-threaded code.
315+
unsafe { std::env::set_var("ASAN_OPTIONS", "detect_leaks=false") };
311316
}
312317
let frida_bin = find_afl_binary("afl-frida-trace.so", Some(opt.executable.clone()))?
313318
.display()
@@ -317,8 +322,10 @@ define_run_client!(state, mgr, fuzzer_dir, core_id, opt, is_main_node, {
317322
} else {
318323
frida_bin
319324
};
320-
std::env::set_var("LD_PRELOAD", &preload);
321-
std::env::set_var("DYLD_INSERT_LIBRARIES", &preload);
325+
// TODO: Audit that the environment access only happens in single-threaded code.
326+
unsafe { std::env::set_var("LD_PRELOAD", &preload) };
327+
// TODO: Audit that the environment access only happens in single-threaded code.
328+
unsafe { std::env::set_var("DYLD_INSERT_LIBRARIES", &preload) };
322329
}
323330
#[cfg(feature = "nyx")]
324331
let mut executor = {
@@ -456,7 +463,7 @@ define_run_client!(state, mgr, fuzzer_dir, core_id, opt, is_main_node, {
456463
// We only run cmplog on the main node
457464
let cmplog_executable_path = match &opt.cmplog {
458465
None => "-",
459-
Some(ref p) => match p.as_str() {
466+
Some(p) => match p.as_str() {
460467
"0" => opt.executable.to_str().unwrap(),
461468
_ => p,
462469
},
@@ -468,7 +475,9 @@ define_run_client!(state, mgr, fuzzer_dir, core_id, opt, is_main_node, {
468475
let mut cmplog_shmem = shmem_provider.uninit_on_shmem::<AFLppCmpLogMap>().unwrap();
469476

470477
// Let the Forkserver know the CmpLog shared memory map ID.
471-
cmplog_shmem.write_to_env("__AFL_CMPLOG_SHM_ID").unwrap();
478+
unsafe {
479+
cmplog_shmem.write_to_env("__AFL_CMPLOG_SHM_ID").unwrap();
480+
}
472481
let cmpmap = unsafe { OwnedRefMut::from_shmem(&mut cmplog_shmem) };
473482

474483
// Create the CmpLog observer.

fuzzers/inprocess/fuzzbench/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ authors = [
55
"Andrea Fioraldi <[email protected]>",
66
"Dominik Maier <[email protected]>",
77
]
8-
edition = "2021"
8+
edition = "2024"
99

1010
[features]
1111
default = ["std"]

fuzzers/inprocess/fuzzbench/src/bin/libafl_cc.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@ pub fn main() {
88
let mut dir = env::current_exe().unwrap();
99
let wrapper_name = dir.file_name().unwrap().to_str().unwrap();
1010

11-
let is_cpp = match wrapper_name[wrapper_name.len()-2..].to_lowercase().as_str() {
11+
let is_cpp = match wrapper_name[wrapper_name.len() - 2..]
12+
.to_lowercase()
13+
.as_str()
14+
{
1215
"cc" => false,
1316
"++" | "pp" | "xx" => true,
14-
_ => panic!("Could not figure out if c or c++ wrapper was called. Expected {dir:?} to end with c or cxx"),
17+
_ => panic!(
18+
"Could not figure out if c or c++ wrapper was called. Expected {dir:?} to end with c or cxx"
19+
),
1520
};
1621

1722
dir.pop();

fuzzers/inprocess/fuzzbench/src/lib.rs

+11-12
Original file line numberDiff line numberDiff line change
@@ -16,47 +16,46 @@ use std::{
1616

1717
use clap::{Arg, Command};
1818
use libafl::{
19+
Error, HasMetadata,
1920
corpus::{Corpus, InMemoryOnDiskCorpus, OnDiskCorpus},
2021
events::SimpleRestartingEventManager,
21-
executors::{inprocess::InProcessExecutor, ExitKind},
22+
executors::{ExitKind, inprocess::InProcessExecutor},
2223
feedback_or,
2324
feedbacks::{CrashFeedback, MaxMapFeedback, TimeFeedback},
2425
fuzzer::{Fuzzer, StdFuzzer},
2526
inputs::{BytesInput, HasTargetBytes},
2627
monitors::SimpleMonitor,
2728
mutators::{
28-
havoc_mutations, token_mutations::I2SRandReplace, tokens_mutations, StdMOptMutator,
29-
StdScheduledMutator, Tokens,
29+
StdMOptMutator, StdScheduledMutator, Tokens, havoc_mutations,
30+
token_mutations::I2SRandReplace, tokens_mutations,
3031
},
3132
observers::{CanTrack, HitcountsMapObserver, TimeObserver},
3233
schedulers::{
33-
powersched::PowerSchedule, IndexesLenTimeMinimizerScheduler, StdWeightedScheduler,
34+
IndexesLenTimeMinimizerScheduler, StdWeightedScheduler, powersched::PowerSchedule,
3435
},
3536
stages::{
36-
calibrate::CalibrationStage, power::StdPowerMutationalStage, StdMutationalStage,
37-
TracingStage,
37+
StdMutationalStage, TracingStage, calibrate::CalibrationStage,
38+
power::StdPowerMutationalStage,
3839
},
3940
state::{HasCorpus, StdState},
40-
Error, HasMetadata,
4141
};
4242
use libafl_bolts::{
43-
current_time,
43+
AsSlice, current_time,
4444
os::dup2,
4545
rands::StdRand,
4646
shmem::{ShMemProvider, StdShMemProvider},
47-
tuples::{tuple_list, Merge},
48-
AsSlice,
47+
tuples::{Merge, tuple_list},
4948
};
5049
#[cfg(any(target_os = "linux", target_vendor = "apple"))]
5150
use libafl_targets::autotokens;
5251
use libafl_targets::{
53-
libfuzzer_initialize, libfuzzer_test_one_input, std_edges_map_observer, CmpLogObserver,
52+
CmpLogObserver, libfuzzer_initialize, libfuzzer_test_one_input, std_edges_map_observer,
5453
};
5554
#[cfg(unix)]
5655
use nix::unistd::dup;
5756

5857
/// The fuzzer main (as `no_mangle` C function)
59-
#[no_mangle]
58+
#[unsafe(no_mangle)]
6059
pub extern "C" fn libafl_main() {
6160
// Registry the metadata types used in this fuzzer
6261
// Needed only on no_std

fuzzers/structure_aware/forkserver_simple_nautilus/src/main.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,12 @@ pub fn main() {
9595

9696
// The coverage map shared between observer and executor
9797
let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap();
98-
// let the forkserver know the shmid
99-
shmem.write_to_env("__AFL_SHM_ID").unwrap();
98+
99+
unsafe {
100+
// let the forkserver know the shmid
101+
shmem.write_to_env("__AFL_SHM_ID").unwrap();
102+
}
103+
100104
let shmem_buf = shmem.as_slice_mut();
101105

102106
// Create an observation channel using the signals map

libafl/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ repository = "https://github.com/AFLplusplus/LibAFL/"
1111
readme = "../README.md"
1212
license = "MIT OR Apache-2.0"
1313
keywords = ["fuzzing", "testing", "security"]
14-
edition = "2021"
15-
rust-version = "1.82"
14+
edition = "2024"
15+
rust-version = "1.85"
1616
categories = [
1717
"development-tools::testing",
1818
"emulators",

libafl/examples/tui_mock/main.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
use std::{thread::sleep, time::Duration};
55

66
use libafl::monitors::{
7-
stats::{manager::ClientStatsManager, ClientStats},
8-
tui::TuiMonitor,
97
Monitor,
8+
stats::{ClientStats, manager::ClientStatsManager},
9+
tui::TuiMonitor,
1010
};
1111
use libafl_bolts::ClientId;
1212

libafl/src/common/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use core::any::type_name;
77
pub mod nautilus;
88

99
use libafl_bolts::{
10-
serdeany::{NamedSerdeAnyMap, SerdeAny, SerdeAnyMap},
1110
Error,
11+
serdeany::{NamedSerdeAnyMap, SerdeAny, SerdeAnyMap},
1212
};
1313
/// Trait for elements offering metadata
1414
pub trait HasMetadata {

0 commit comments

Comments
 (0)