Skip to content

Commit

Permalink
Merge branch 'main' into error
Browse files Browse the repository at this point in the history
  • Loading branch information
SWASTIC-7 authored Feb 19, 2025
2 parents 5b11b84 + 61568a9 commit 3eae6c2
Show file tree
Hide file tree
Showing 50 changed files with 1,102 additions and 467 deletions.
6 changes: 6 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
## Pull Request Checklist

Please make sure you've completed the following steps before submitting:

- [ ] I have run `./script/fmt_all.sh` to format the code
- [ ] I have run `./script/clippy.sh` and fixed all errors/warnings
1 change: 0 additions & 1 deletion .github/workflows/build_and_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,6 @@ jobs:
needs:
- fuzzers-preflight
strategy:
fail-fast: false
matrix:
os: [ ubuntu-24.04 ]
fuzzer:
Expand Down
64 changes: 44 additions & 20 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

For bugs, feel free to open issues or contact us directly. Thank you for your support. <3

## Pull Request guideline
## Pull Request Guideline

Even though we will gladly assist you in finishing up your PR, try to:

Expand All @@ -14,7 +14,7 @@ Even though we will gladly assist you in finishing up your PR, try to:

Some of the parts in this list may be hard, don't be afraid to open a PR if you cannot fix them by yourself, so we can help.

### Pre-commit hooks
### Pre-commit Hooks

Some of these checks can be performed automatically during commit using [pre-commit](https://pre-commit.com/).
Once the package is installed, simply run `pre-commit install` to enable the hooks, the checks will run automatically before the commit becomes effective.
Expand All @@ -27,7 +27,10 @@ Before making your pull requests, try to see if your code follows these rules.
- `PhantomData` should have the smallest set of types needed. Try not adding `PhantomData` to your struct unless it is really necessary. Also even when you really need `PhantomData`, try to keep the types `T` used in `PhantomData` as smallest as possible
- Wherever possible, trait implementations with lifetime specifiers should use '_ lifetime elision.
- Complex constructors should be replaced with `typed_builder`, or write code in the builder pattern for yourself.
- Remove generic restrictions at the definitions (e.g., we do not need to specify that types impl `Serialize`, `Deserialize`, or `Debug` anymore at the struct definitions). Therefore, try avoiding code like this unless the constraint is really necessary.


## Rules for Generics and Associated Types
1. Remove generic restrictions at the definitions (e.g., we do not need to specify that types impl `Serialize`, `Deserialize`, or `Debug` anymore at the struct definitions). Therefore, try avoiding code like this unless the constraint is really necessary.
```rust
pub struct X<A>
where
Expand All @@ -36,7 +39,7 @@ pub struct X<A>
fn ...
}
```
- Reduce generics to the least restrictive necessary. __Never overspecify the constraints__. There's no automated tool to check the useless constraints, so you have to verify this manually.
2. Reduce generics to the least restrictive necessary. __Never overspecify the constraints__. There's no automated tool to check the useless constraints, so you have to verify this manually.
```rust
pub struct X<A>
where
Expand All @@ -46,8 +49,7 @@ pub struct X<A>
}
```

- Prefer generic to associated types in traits definition as much as possible. They are much easier to use around, and avoid tricky caveats / type repetition in the code. It is also much easier to have unconstrained struct definitions.

3. Prefer generic to associated types in traits definition as much as possible. They are much easier to use around, and avoid tricky caveats / type repetition in the code. It is also much easier to have unconstrained struct definitions.
Try not to write this:
```rust
pub trait X
Expand All @@ -65,7 +67,7 @@ pub trait X<A>
}
```

- Traits which have an associated type (if you have made sure you cannot use a generic instead) should refer to the associated type, not the concrete/generic. In other words, you should only have the associated type when you can define a getter to it. For example, in the following code, you can define a associate type.
4. Traits which have an associated type (if you have made sure you cannot use a generic instead) should refer to the associated type, not the concrete/generic. In other words, you should only have the associated type when you can define a getter to it. For example, in the following code, you can define a associate type.
```rust
pub trait X
{
Expand All @@ -74,17 +76,7 @@ pub trait X
fn a(&self) -> Self::A;
}
```

- __Ideally__ the types used in the arguments of methods in traits should have the same as the types defined on the traits.
```rust
pub trait X<A, B, C> // <- this trait have 3 generics, A, B, and C
{
fn do_stuff(&self, a: A, b: B, c: C); // <- this is good because it uses all A, B, and C.

fn do_other_stuff(&self, a: A, b: B); // <- this is not ideal because it does not have C.
}
```
- Generic naming should be consistent. Do NOT use multiple name for the same generic, it just makes things more confusing. Do:
5. Generic naming should be consistent. Do NOT use multiple name for the same generic, it just makes things more confusing. Do:
```rust
pub struct X<A> {
phantom: PhanomData<A>,
Expand All @@ -100,15 +92,47 @@ pub struct X<A> {

impl<B> X<B> {} // <- Do NOT do that, use A instead of B
```
- Always alphabetically order the type generics. Therefore,
6. __Ideally__ the types used in the arguments of methods in traits should have the same as the types defined on the traits.
```rust
pub trait X<A, B, C> // <- this trait have 3 generics, A, B, and C
{
fn do_stuff(&self, a: A, b: B, c: C); // <- this is good because it uses all A, B, and C.

fn do_other_stuff(&self, a: A, b: B); // <- this is not ideal because it does not have C.
}
```
7. Try to avoid cyclical dependency if possible. Sometimes it is necessary but try to avoid it. For example, The following code is a bad example.
```rust
pub struct X {}
pub struct Y {}

pub trait Fuzzer: Sized {
fn fuzz<EM>(&self, em: &EM)
where
EM: EventManager
{
em.do_stuff(self);
}
}

pub trait EventManager: Sized {
fn do_stuff<Z>(&self, fuzzer: &Z); // <- This function signature should not take fuzzer
}
```
trait `EventManager` should not implement any method that takes fuzzer, any object that could implement `Fuzzer` trait.


## Formatting
1. Always alphabetically order the type generics. Therefore,
```rust
pub struct X<E, EM, OT, S, Z> {}; // <- Generics are alphabetically ordered
```
But not,
```rust
pub struct X<S, OT, Z, EM, E> {}; // <- Generics are not ordered
```
- Similarly, generic bounds in `where` clauses should be alphabetically sorted. Prefer:
2. Similarly, generic bounds in `where` clauses should be alphabetically sorted.
Prefer:
```rust
pub trait FooA {}
pub trait FooB {}
Expand Down
2 changes: 1 addition & 1 deletion fuzzers/binary_only/qemu_launcher/Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ test_inner: harness build
./tests/injection/test.sh || exit 1

# complie again with simple mgr
cargo build --profile={{PROFILE}} --features="simplemgr,{{ARCH}}" --target-dir={{ TARGET_DIR }}
cargo build --profile={{PROFILE}} --features="simplemgr,{{ARCH}}" --target-dir={{ TARGET_DIR }} || exit 1
./tests/qasan/test.sh || exit 1

[unix]
Expand Down
2 changes: 1 addition & 1 deletion fuzzers/forkserver/libafl-fuzz/Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ build_libafl_fuzz_fuzzbench:

test_instr: build_afl build_libafl_fuzz
#!/bin/bash
AFL_PATH={{AFL_DIR}} {{AFL_CC_PATH}} ./test/test-instr.c -o ./test/out-instr
AFL_PATH={{AFL_DIR}} {{AFL_CC_PATH}} -O0 ./test/test-instr.c -o ./test/out-instr

export LIBAFL_DEBUG_OUTPUT=1
export AFL_CORES=0
Expand Down
5 changes: 3 additions & 2 deletions fuzzers/forkserver/libafl-fuzz/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,14 +256,15 @@ struct Opt {
#[arg(short = 't', default_value_t = 1000)]
hang_timeout: u64,

#[arg(short = 'd')]
debug_child: bool,

// Environment Variables
#[clap(skip)]
bench_just_one: bool,
#[clap(skip)]
bench_until_crash: bool,

#[clap(skip)]
debug_child: bool,
#[clap(skip)]
is_persistent: bool,
#[clap(skip)]
Expand Down
22 changes: 14 additions & 8 deletions fuzzers/forkserver/libafl-fuzz/src/stages/mutational_stage.rs
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
use std::{borrow::Cow, marker::PhantomData};

use libafl::{
stages::{MutationalStage, Stage},
stages::{MutationalStage, Restartable, Stage},
Error,
};
use libafl_bolts::Named;

#[derive(Debug)]
pub enum SupportedMutationalStages<SM, P> {
pub enum SupportedMutationalStages<P, SM> {
StdMutational(SM, PhantomData<P>),
PowerMutational(P, PhantomData<SM>),
}

impl<S, SM, P> MutationalStage<S> for SupportedMutationalStages<SM, P>
impl<P, S, SM> MutationalStage<S> for SupportedMutationalStages<P, SM>
where
SM: MutationalStage<S>,
P: MutationalStage<S, Mutator = SM::Mutator>,
SM: MutationalStage<S>,
{
type Mutator = SM::Mutator;
/// The mutator, added to this stage
Expand Down Expand Up @@ -44,10 +44,10 @@ where
}
}

impl<SM, P> Named for SupportedMutationalStages<SM, P>
impl<P, SM> Named for SupportedMutationalStages<P, SM>
where
SM: Named,
P: Named,
SM: Named,
{
fn name(&self) -> &Cow<'static, str> {
match self {
Expand All @@ -57,10 +57,10 @@ where
}
}

impl<E, EM, S, SM, P, Z> Stage<E, EM, S, Z> for SupportedMutationalStages<SM, P>
impl<E, EM, P, S, SM, Z> Stage<E, EM, S, Z> for SupportedMutationalStages<P, SM>
where
SM: Stage<E, EM, S, Z>,
P: Stage<E, EM, S, Z>,
SM: Stage<E, EM, S, Z>,
{
#[inline]
fn perform(
Expand All @@ -75,7 +75,13 @@ where
Self::PowerMutational(p, _) => p.perform(fuzzer, executor, state, manager),
}
}
}

impl<P, S, SM> Restartable<S> for SupportedMutationalStages<P, SM>
where
P: Restartable<S>,
SM: Restartable<S>,
{
fn should_restart(&mut self, state: &mut S) -> Result<bool, Error> {
match self {
Self::StdMutational(m, _) => m.should_restart(state),
Expand Down
3 changes: 2 additions & 1 deletion fuzzers/inprocess/fuzzbench/Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,13 @@ fuzzer:

[linux]
[macos]
run: cxx fuzz_o
run: cxx fuzz_o fuzzer
#!/bin/bash
rm -rf libafl_unix_shmem_server || true
mkdir in || true
echo a > in/a
./{{FUZZER_NAME}} -o out -i in
RUST_LOG=info ./{{FUZZER_NAME}} -o out -i seed

[windows]
run:
Expand Down
2 changes: 1 addition & 1 deletion fuzzers/inprocess/fuzzbench_ctx/Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ fuzzer:

[linux]
[macos]
run: cxx fuzz_o
run: cxx fuzz_o fuzzer
#!/bin/bash
rm -rf libafl_unix_shmem_server || true
mkdir in || true
Expand Down
Loading

0 comments on commit 3eae6c2

Please sign in to comment.