| libFuzzer Integration |
| --------------------- |
| |
| Swift compiler comes with a built-in ``libFuzzer`` integration. |
| In order to use it on a file ``myfile.swift``, we define an entry point fuzzing function |
| with a ``@_cdecl("LLVMFuzzerTestOneInput")`` annotation: |
| |
| |
| .. code-block:: swift |
| |
| @_cdecl("LLVMFuzzerTestOneInput") public func fuzzMe(Data: UnsafePointer<CChar>, Size: CInt) -> CInt{ |
| // Test our code using provided Data. |
| } |
| } |
| |
| To compile it, we use ``-sanitize=fuzzer`` flag to link ``libFuzzer`` |
| and enable coverage annotation, and ``-parse-as-library`` flag not to insert |
| the ``main`` symbol, such that the fuzzer entry point can be used: |
| |
| .. code-block:: bash |
| |
| % swiftc -sanitize=fuzzer myfile.swift |
| |
| ``libFuzzer`` can be also combined with other sanitizers: |
| |
| .. code-block:: bash |
| |
| % swiftc -sanitize=fuzzer,address myfile.swift |
| |
| Finally, we launch the fuzzing process: |
| |
| .. code-block:: bash |
| |
| % ./a.out |
| |
| Refer to the official ``libFuzzer`` documentation at http://llvm.org/docs/LibFuzzer.html |
| for the description of flags the resulting binary has. |