# Har skrevet en parser, der tjekker hvert FFI‑kald

Har skrevet en parser, der læser den rigtige C‑header på 7.308 linjer og verificerer hvert kaldssted, hver enum‑konstant, og at hver klasse, der ejer en pointer, er final, efter at en håndskrevet pladsholder‑header lod kald til tre fjernede funktioner kompilere, linke og crashe.

september 2026

**Situation.** Tidligt i projektet blev C‑grænsefladen repræsenteret af en håndskrevet header, der beskrev de funktioner, programmet forventede. Den header kunne kompileres, programmet blev linket, og kald til tre funktioner, der ikke længere fandtes i kernen, nåede frem til at blive kaldt og brød ned. Både oversætteren og linkeren havde ladet sig nøje med en beskrivelse af biblioteket og ikke selve biblioteket, og kløften viste sig først under kørsel.

**Opgave.** Den rigtige header — 7.308 linjer og 268 erklæringer — skulle være den gældende autoritet, og hver anvendelse af den i Swift‑koden skulle efterprøves mod den automatisk og ikke ved gennemgang.

**Handling.** Tjekket er en parser, der læser den faktiske upstream‑header og opbygger mængden af funktioner, enum‑konstanter og typer, den erklærer, og derefter læser Swift‑kildekoden og slår hvert kaldested og hver konstanthenvisning op i den mængde. Et kald til en funktion, headeren ikke erklærer, får buildet til at fejle. En henvisning til en enum‑konstant, der er blevet omdøbt, får buildet til at fejle. Lige nu henvises der til 132 af de 268 erklæringer, og at vide, hvilke 136 der ikke bruges, er i sig selv nyttigt, for det siger præcis, hvor meget af kernen klienten ikke har nået. Parseren håndhæver også en regel, oversætteren ikke kan: hver Swift‑klasse, der ejer en pointer ind i kernen, skal være final. En klasse, der ejer en pointer og ikke er final, kan nedarves, og en underklasse, der overstyrer deinitialiseringen eller tilføjer sin egen levetid, ændrer, hvornår pointeren frigives — en use‑after‑free uden noget unsafe‑nøgleord i nærheden. Reglen tjekkes ud fra navn i hele træet.

**Resultat.** Den defektklasse, der frembragte det oprindelige nedbrud, kan ikke gentage sig, for en forældet henvisning er nu en buildfejl og ikke en kørselsfejl. Begrænsningen er, at parseren forstår headerens erklæringer og ikke dens betydning: den beviser, at en funktion findes med et matchende navn, og en funktion, hvis betydning eller ejerskabsregel ændrede sig upstream, mens signaturen blev bevaret, slipper igennem uden bemærkning.

---

- Rolle: macOS‑applikationsudvikler
- Kategorier: [Backend‑udvikling](https://engineer.company/da/categories/backend/), [API'er & integration](https://engineer.company/da/categories/api/), [Automatisering & CI/CD](https://engineer.company/da/categories/automation/), [Sikkerhed](https://engineer.company/da/categories/security/), [Test & QA](https://engineer.company/da/categories/testing/), [Dokumentation](https://engineer.company/da/categories/documentation/)
- Ydelser: [Backend- & API‑udvikling](https://engineer.company/da/services/backend-development/), [DevOps & CI/CD‑automatisering](https://engineer.company/da/services/devops-cicd/), [Teknisk dokumentation](https://engineer.company/da/services/technical-documentation/)

<https://engineer.company/da/portfolio/wrote-a-parser-verifying-every-ffi-call/>
