Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 31 Jul 2024 16:46:27 +0100
From:      David Chisnall <theraven@FreeBSD.org>
To:        Alan Somers <asomers@FreeBSD.org>
Cc:        Shawn Webb <shawn.webb@hardenedbsd.org>, FreeBSD Hackers <freebsd-hackers@freebsd.org>, Warner Losh <imp@bsdimp.com>, Scott Long <scottl@freebsd.org>, meka@tilda.center
Subject:   Re: The Case for Rust (in the base system)
Message-ID:  <1D235928-2513-45C1-8439-C2A2B9C58E46@FreeBSD.org>
In-Reply-To: <CAOtMX2iDK3uN_oQgzzZAdoOZCfNsnvpefeZvKoTCRmPBhZywzA@mail.gmail.com>
References:  <CAOtMX2hAUiWdGPtpaCJLPZB%2Bj2yzNw5DSjUmkwTi%2B%2BmyemehCA@mail.gmail.com> <vdmg5zocd6wqcwc2bvzvzqn4bii2pwdc2r4mgnisukfkboj6nf@f7lv5quu4fjx> <CAOtMX2iDK3uN_oQgzzZAdoOZCfNsnvpefeZvKoTCRmPBhZywzA@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--Apple-Mail=_80CE49DB-FD58-4421-9220-3682165573DE
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

On 31 Jul 2024, at 16:40, Alan Somers <asomers@FreeBSD.org> wrote:
>=20
> * ctld: while working on some bugs in ctld, I had trouble
> understanding the config file parsing.  So I rewrote that part in
> Rust, just to help my understanding.  Later, I rewrote the XML
> parsing, too.  Then I rewrote the LUN creation and deletion, just to
> see how hard it would be.  All of those parts take about 5x fewer SLOC
> in Rust than in C, and they're less buggy, too.  Config file parsing
> is more consistent, no memory leaks, etc.  Alas, I'm not planning to
> finish this project, since the base system doesn't allow Rust and ctld
> is too tightly coupled to ctl to live in ports.

C is absolutely terrible for parsing on any metric (even C++ lets you =
write parsers in a fraction of the code and fewer bugs).  It=E2=80=99s =
one of the places where Rust provides some very easy wins:

 - Lifetimes are easy to reason about in parsers, they fit well into =
Rust=E2=80=99s ownership model because the input is a stream and the =
output is a tree.
 - Parsers, by definition, are part of your attack surface because =
they=E2=80=99re taking data from outside.

Replacing parsers with Rust (or something like EverParse) has a very =
high security return relative to the investment of effort.

David


--Apple-Mail=_80CE49DB-FD58-4421-9220-3682165573DE
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html><head><meta http-equiv=3D"content-type" content=3D"text/html; =
charset=3Dutf-8"></head><body style=3D"overflow-wrap: break-word; =
-webkit-nbsp-mode: space; line-break: after-white-space;">On 31 Jul =
2024, at 16:40, Alan Somers &lt;asomers@FreeBSD.org&gt; =
wrote:<br><div><blockquote type=3D"cite"><br =
class=3D"Apple-interchange-newline"><div><meta charset=3D"UTF-8"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: SourceCodePro-Regular; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: =
none; float: none; display: inline !important;">* ctld: while working on =
some bugs in ctld, I had trouble</span><br style=3D"caret-color: rgb(0, =
0, 0); font-family: SourceCodePro-Regular; font-size: 12px; font-style: =
normal; font-variant-caps: normal; font-weight: 400; letter-spacing: =
normal; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none;"><span style=3D"caret-color: rgb(0, 0, 0); =
font-family: SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; float: none; display: inline =
!important;">understanding the config file parsing. &nbsp;So I rewrote =
that part in</span><br style=3D"caret-color: rgb(0, 0, 0); font-family: =
SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none;"><span style=3D"caret-color: rgb(0, 0, 0); =
font-family: SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; float: none; display: inline !important;">Rust, =
just to help my understanding. &nbsp;Later, I rewrote the XML</span><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: SourceCodePro-Regular; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: =
none;"><span style=3D"caret-color: rgb(0, 0, 0); font-family: =
SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; float: none; display: inline =
!important;">parsing, too. &nbsp;Then I rewrote the LUN creation and =
deletion, just to</span><br style=3D"caret-color: rgb(0, 0, 0); =
font-family: SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none;"><span style=3D"caret-color: rgb(0, 0, 0); =
font-family: SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; float: none; display: inline !important;">see how =
hard it would be. &nbsp;All of those parts take about 5x fewer =
SLOC</span><br style=3D"caret-color: rgb(0, 0, 0); font-family: =
SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none;"><span style=3D"caret-color: rgb(0, 0, 0); =
font-family: SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; float: none; display: inline !important;">in Rust =
than in C, and they're less buggy, too. &nbsp;Config file =
parsing</span><br style=3D"caret-color: rgb(0, 0, 0); font-family: =
SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none;"><span style=3D"caret-color: rgb(0, 0, 0); =
font-family: SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; float: none; display: inline !important;">is more =
consistent, no memory leaks, etc. &nbsp;Alas, I'm not planning =
to</span><br style=3D"caret-color: rgb(0, 0, 0); font-family: =
SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none;"><span style=3D"caret-color: rgb(0, 0, 0); =
font-family: SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; float: none; display: inline !important;">finish =
this project, since the base system doesn't allow Rust and =
ctld</span><br style=3D"caret-color: rgb(0, 0, 0); font-family: =
SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none;"><span style=3D"caret-color: rgb(0, 0, 0); =
font-family: SourceCodePro-Regular; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; float: none; display: inline !important;">is too =
tightly coupled to ctl to live in ports.</span><br style=3D"caret-color: =
rgb(0, 0, 0); font-family: SourceCodePro-Regular; font-size: 12px; =
font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: =
none;"></div></blockquote></div><br><div>C is absolutely terrible for =
parsing on any metric (even C++ lets you write parsers in a fraction of =
the code and fewer bugs). &nbsp;It=E2=80=99s one of the places where =
Rust provides some very easy wins:</div><div><br></div><div>&nbsp;- =
Lifetimes are easy to reason about in parsers, they fit well into =
Rust=E2=80=99s ownership model because the input is a stream and the =
output is a tree.</div><div>&nbsp;- Parsers, by definition, are part of =
your attack surface because they=E2=80=99re taking data from =
outside.</div><div><br></div><div>Replacing parsers with Rust (or =
something like EverParse) has a very high security return relative to =
the investment of =
effort.</div><div><br></div><div>David</div><div><br></div></body></html>=

--Apple-Mail=_80CE49DB-FD58-4421-9220-3682165573DE--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1D235928-2513-45C1-8439-C2A2B9C58E46>