Skip to content

Commit cd920a3

Browse files
author
bors-servo
authored
Auto merge of #1159 - snewt:feat/970-quickcheck-fuzzing, r=fitzgen
Property testing with quickcheck This PR represents an attempt to address issue #970. It also represents a portion of the meta issue for fuzzing #972. The code base reflected here uses quickcheck to generate C headers that include a variety of types including basic types, structs, unions, function prototypes and function pointers. The headers generated by quickcheck are passed to the `csmith-fuzzing/predicate.py` script. Examples of headers generated by this iteration of the tooling can be viewed [here](https://gist.github.com/snewt/03ce934f35c5b085807d2d5cf11d1d5c). At the top of each header are two simple struct definitions, `whitelistable` and `blacklistable`. Those types are present in the vector that represents otherwise primitive types used to generate. They represent a naive approach to exposing custom types without having to intuit generated type names like `struct_21_8` though _any actual whitelisting logic isn't implemented here_. Test success is measured by the success of the `csmith-fuzzing/predicate.py` script. This means that for a test to pass the following must be true: - bindgen doesn't panic - the resulting bindings compile - the resulting bindings layout tests pass #### Usage ```bash cd tests/property_test cargo test ``` Some things I'm unsure of: #### Where should this feature live? At the moment it lives in `tests/property_test` but isn't run when `cargo test` is invoked from bindgen's cargo manifest directory. #### What's an acceptable ammount of time for these tests to take? At this point, the source is genereated in ~1 second but the files are large enough that it takes the `predicate.py` script ~30 seconds to run through each one. In order for the tests to run in under a minute only 2 are generated by quickcheck by default. This can be changed in the `test_bindgen` function of the `tests/property_test/tests/fuzzed-c-headers.rs` file. #### How do we expose the generated code for easy inspection? For now the `run_predicate_script` function in the `tests/property_test/tests/fuzzed-c-headers.rs` file contains a commented block that will copy generated source in the `tests/property_test/tests` directory. Should it be easier? #### Special casing There is some logic in the fuzzer that disallows 0 sized arrays because tests will regulary fail due to issues documented in #684 and #1153. Should this be special casing? #### Does the fuzzer warrant its own crate? After any iterations the reviewers are interested in required to make this a functional testing tool, should/could the fuzzing library be made into its own crate? I didn't move in that direction yet because having it all in one place seemed like the best way to figure out what works an doesn't but I'm interested in whether it might be useful as a standalone library. #### What does it look like to expose more useful functionality? I'm looking forward to feedback on how to make this a more useful tool and one that provides the right configurability. Thanks! r? @fitzgen
2 parents 0af9c89 + 2aa9b1d commit cd920a3

File tree

6 files changed

+721
-0
lines changed

6 files changed

+721
-0
lines changed

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ env:
3434
- LLVM_VERSION="4.0.0" BINDGEN_JOB="expectations" BINDGEN_PROFILE=
3535
- LLVM_VERSION="4.0.0" BINDGEN_JOB="expectations" BINDGEN_PROFILE="--release"
3636
- LLVM_VERSION="4.0.0" BINDGEN_JOB="misc"
37+
- LLVM_VERSION="4.0.0" BINDGEN_JOB="quickchecking"
3738

3839
matrix:
3940
fast_finish: true

ci/script.sh

+5
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ case "$BINDGEN_JOB" in
3838
# ./ci/assert-rustfmt.sh
3939
;;
4040

41+
"quickchecking")
42+
cd ./tests/quickchecking
43+
# TODO: Actually run quickchecks once `bindgen` is reliable enough.
44+
cargo check
45+
;;
4146
*)
4247
echo "Error! Unknown \$BINDGEN_JOB: '$BINDGEN_JOB'"
4348
exit 1

tests/quickchecking/Cargo.toml

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "quickchecking"
3+
description = "Bindgen property tests with quickcheck. Generate random valid C code and pass it to the csmith/predicate.py script"
4+
version = "0.1.0"
5+
authors = ["Shea Newton <[email protected]>"]
6+
7+
[dependencies]
8+
quickcheck = "0.4"
9+
tempdir = "0.3"
10+
rand = "0.3"

0 commit comments

Comments
 (0)