oss-fuzz/docs/getting-started/new-project-guide/swift_lang.md

79 lines
1.8 KiB
Markdown

---
layout: default
title: Integrating a Swift project
parent: Setting up a new project
grand_parent: Getting started
nav_order: 1
permalink: /getting-started/new-project-guide/swift-lang/
---
# Integrating a Swift project
{: .no_toc}
- TOC
{:toc}
---
The process of integrating a project written in Swift with OSS-Fuzz is very similar
to the general
[Setting up a new project]({{ site.baseurl }}/getting-started/new-project-guide/)
process. The key specifics of integrating a Swift project are outlined below.
## Project files
First, you need to write a Swift fuzz target that accepts a stream of bytes and
calls the program API with that. This fuzz target should reside in your project
repository.
The structure of the project directory in OSS-Fuzz repository doesn't differ for
projects written in Swift. The project files have the following Swift specific
aspects.
### project.yaml
The `language` attribute must be specified.
```yaml
language: swift
```
The only supported fuzzing engine is `libfuzzer`
The supported sanitizers are and `address`, `thread`
[Example](https://github.com/google/oss-fuzz/blob/2a15c3c88b21f4f1be2a7ff115f72bd7a08e34ac/projects/swift-nio/project.yaml#L9):
```yaml
fuzzing_engines:
- libfuzzer
sanitizers:
- address
- thread
```
### Dockerfile
The Dockerfile should start by `FROM gcr.io/oss-fuzz-base/base-builder-swift`
instead of using the simple base-builder
### build.sh
A `precompile_swift` generates an environment variable `SWIFTFLAGS`
This can then be used in the building command such as `swift build -c release $SWIFTFLAGS`
A usage example from swift-protobuf project is
```sh
. precompile_swift
# build project
cd FuzzTesting
swift build -c debug $SWIFTFLAGS
(
cd .build/debug/
find . -maxdepth 1 -type f -name "*Fuzzer" -executable | while read i; do cp $i $OUT/"$i"-debug; done
)
```