<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Bitfields and Tagged Unions in C -Verification through Automatic Generation</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">David</forename><surname>Cock</surname></persName>
							<affiliation key="aff0">
								<orgName type="laboratory">Sydney Research Lab</orgName>
								<orgName type="institution">NICTA</orgName>
								<address>
									<country key="AU">Australia</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Bitfields and Tagged Unions in C -Verification through Automatic Generation</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">E9DF2D79E0BA570B3CE709E1D882C39E</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T19:49+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>We present a tool for automatic generation of packed bitfields and tagged unions for systems-level C, along with automatic, machine checked refinement proofs in Isabelle/HOL. Our approach provides greater predictability than compiler-specific bitfield implementations, and provides a basis for formal reasoning about these typically non-type-safe operations. The tool is used in the implementation of the seL4 microkernel, and hence also in the lowest-level refinement step of the L4.verified project which aims to prove the functional correctness of seL4. Within seL4, it has eliminated the need for unions entirely.</p><p>NICTA is funded by the Australian Government as represented by the Department of Broadband, Communications and the Digital Economy and the Australian Research Council.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>In this paper we present a tool that automatically generates inline-able C functions to implement tagged unions of packed bitfield types, based on a simple domainspecific-language specification. We then generalise, and suggest a technique to exploit the desires of systems programmers to ease program verification.</p><p>The motivation for this work was the C implementation of the seL4 microkernel, and the needs of the associated L4.verified project <ref type="bibr" target="#b7">[8,</ref><ref type="bibr" target="#b2">3]</ref>. The seL4 microkernel <ref type="bibr" target="#b4">[5,</ref><ref type="bibr" target="#b6">7]</ref> is an evolution of the L4 family <ref type="bibr" target="#b16">[17]</ref> for secure, embedded devices. The L4.verified project aims to prove its functional correctness. The need to produce code that can be verified with reasonable effort requires the disciplined use of 'ugly' programming idioms, those which violate the basic abstractions of the underlying semantic model. In our case, these are heap type aliases, i.e. unions, non-type-safe pointer accesses, and sub-machine-word manipulations. These violations occur commonly together, in the tagged union and bitfield construct. See Fig. <ref type="figure" target="#fig_0">1</ref> for an example from the OKL4 kernel [19], a current commercial implementation of L4. This pattern is very regular, and an obvious target for automation. Generation of this code is desirable for two reasons: First, via controlled tagged unions, it adds functionality to C in a disciplined, type-safe way. Second, bitfield implementations vary widely, both in performance and in actual behaviour between compilers, and even different versions of the same compiler. As a result, they are usually mistrusted by kernel programmers. In contrast, our generated code is fast, predictable and formally correct. Our approach is to provide an opaque, abstract type, implementing the tagged-union/bitfield semantics, together with generated accessor functions. The tool automatically provides the proofs that the functions behave as expected. Whilst this is not a radically new idea, our approach is successful precisely because we target the regular low-level functions, which nonetheless comprise 14% of the code within seL4. This tool also provides a case study for the use of the C semantics of Tuch et al. <ref type="bibr" target="#b24">[26]</ref>, and Dawson's Isabelle/HOL library for machine words <ref type="bibr" target="#b3">[4]</ref>. The remainder of the paper is laid out as follows: Section 2 introduces the specification language used to describe the bit-level layout of structures, Section 3 shows the C code generation framework, and Section 4 explains the framework of automatically generated proofs to allow reasoning without descending to the level of pointers and bit manipulation.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Specification Language</head><p>The tagged-union/packed-bitfield structure is useful in a number of contexts e.g. hardware-dictated page-table layouts, hardware register mapping, and highly optimised data structure storage. As a running example, we will consider a subset of the seL4/ARM capability representation. Capabilities are used as a proxy for authority, and we consider only two capability types: Null caps (null cap) which function as placeholders, and Untyped caps (untyped cap) which convey authority over a power of two sized block of memory. The capability is represented as a two word (64 bit) bitfield: Null caps contain no data other than the type tag, whereas Untyped caps have two fields: capBlockSize and capPtr, a pointer aligned on a 16-byte boundary.</p><p>The cap representations are specified as follows (the full grammar is included in Fig. <ref type="figure" target="#fig_3">5</ref>). First the machine word size (32 bits for ARM) is specified with the base keyword: base 32</p><p>Next, bitfield blocks are specified. Fields are listed from most-significant to least-significant bit (Fig. <ref type="figure" target="#fig_1">2</ref>). The padding keyword introduces anonymous padding space, to achieve the desired alignment, and the field keyword reserves space for a named field. In the null cap example, padding 32 reserves one empty machine word, field capType 4 allocates a 4 bit field at the top of the second word, and padding 28 explicitly fills the remainder of the second word. The trailing padding is mandatory where the fields do not fill the lower bits of the last word. Padding between fields is inserted explicitly, fields are forbidden to cross word boundaries, and the size of each block must be a multiple of the base word size. These restrictions ensure that the implementation maps efficiently onto common machine operations, and present no difficulties in practice. The field high keyword specifies that a field should be left-aligned to the word size when read or written, padded on the right with zero bits, see Fig. <ref type="figure">3</ref>. Finally, blocks are grouped together into tagged unions (Fig. <ref type="figure">4</ref>). The keyword tagged union is followed by the name of the union, and the name of the tag field, then a list of block names, together with their associated tag values. All blocks in the union must be the same size, and each must contain a tag field. All tag fields must be the same size, and at the same location within the block. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Generated Code</head><p>This section gives a brief overview of the code generated from the specifications above. Each block and union in the specification language is translated to a C representation with appropriate access and update functions. Each object is represented by a struct containing simply an array of machine words, and for each union, an enum of tag values. The wrapping struct allows pass and return by value in C. For each block and union, the tool generates create, access and update functions. Each such function is generated in a purely functional version, which passes and returns a stack object of appropriate struct type:</p><formula xml:id="formula_0">static inline cap_t CONST cap_untyped_cap_set_capBlockSize(cap_t cap, uint32_t v) { assert(((cap.words[0] &gt;&gt; 28) &amp; 0xf) == cap_untyped_cap); cap.words[1] &amp;= ~0x1f; cap.words[1] |= (v &lt;&lt; 0) &amp; 0x1f; return cap; }</formula><p>Also generated is a pointer lifted version, which operates indirectly on heap values through a supplied pointer:</p><formula xml:id="formula_1">static inline void cap_untyped_cap_ptr_set_capBlockSize(cap_t *cap_ptr, uint32_t v) { assert(((cap_ptr-&gt;words[0] &gt;&gt; 28) &amp; 0xf) == cap_untyped_cap); cap_ptr-&gt;words[1] &amp;= ~0x1f; cap_ptr-&gt;words[1] |= (v &lt;&lt; 0) &amp; 0x1f; }</formula><p>The prototypes for the remaining functions are given in Fig. <ref type="figure" target="#fig_4">6</ref>. Note that the generated API only provides functions that read the tag field through the union type, and no function to write it directly. This imposes a class-like behaviour on the types. The subtype is set implicitly at creation time, and can only be modified by overwriting with an object of a different type. This will turn out to be an important property for verification.</p><p>In practice the output is automatically pruned, so that only those functions actually used in the source are generated. This speeds the proof process. As the specification language is highly focussed and carefully limited, the generated code is simple and fast, highly predictable, and easily inlined by the compiler.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Generated Specifications</head><p>The final and most novel part of the approach consists of the automatically generated, machine checked function specifications together with their automated  proofs. The function of the generated proofs is not only to show implementation correctness, but also to provide sufficient reasoning power to allow any statement involving the generated functions to be rephrased in terms of simple operations on abstract, high-level types in the theorem prover. This means that we can avoid invoking bit manipulations and pointer dereferences when reasoning about the packed structures as part of a larger proof. We can instead reason about higher-level types, for which there is well established support. This abstract representation is expressed in terms of Isabelle's record types, which behave much like struct or record constructs in typical programming languages, providing access and update of disjoint fields. The bitfields from the C level are represented as records of fields on the abstract level. For example, the untyped cap block is represented as follows:</p><p>record cap_untyped_cap_CL = capBlockSize_CL :: "word32" capPtr_CL :: "word32"</p><p>Tagged unions are represented by an algebraic datatype wrapping the records corresponding to the component bitfields, with one constructor for each. Tag fields are not included in the record representation, but are implied by the choice of constructor within the union type. Any bitfields which are empty after the removal of the tag field are represented simply by a naked constructor, with no associated record. The cap union translates thus:</p><formula xml:id="formula_2">datatype cap_CL = Cap_null_cap | Cap_untyped_cap cap_untyped_cap_CL</formula><p>The name convention is that the C types and identifiers, when parsed into Isabelle, are tagged by appending C, whereas the lifted types are tagged with CL. The connection between the C level and the abstract level will be provided by two functions in the example below: cap_lift and cap_untyped_cap_lift. The former lifts any cap_C to a cap_CL, and the latter lifts a cap_C with the untyped cap tag directly to a cap_untyped_cap_CL. It is under-specified in all other cases.</p><p>The properties of the generated functions are expressed as strongest-postcondition Hoare rules. Specifically, we use Schirmer's <ref type="bibr" target="#b21">[23]</ref> verification environment for imperative programs in Isabelle/HOL. It contains a verification condition generator (VCG) which automates reasoning about Hoare-triples. Tuch's et al. <ref type="bibr" target="#b24">[26]</ref> instantiation to C parses the generated code directly into Isabelle/HOL and into Schirmer's representation language SIMPL.</p><p>As an example, we will take the generated specification of the generated C function cap untyped cap set capBlockSize. The specification above reads as follows. For all program contexts Γ , if the tag of the C-struct cap in the current state (indicated by ´) equals the value cap_untyped_cap, and we execute the function cap_untyped_cap_set_capBlockSize with parameters cap and v, storing its return value in ret__struct_cap_C, we will arrive at the following post condition: lifting the return value to the abstract record type is the same as lifting the value of cap in the initial state s, and then performing an update of the abstract record field capBlockSize_CL with the value v had in state s. Additionally, as a convenience for automated methods in the larger proof, we provide that the tag of the return value remains cap_untyped_cap. A separate specification states (and the tool proves) that the function is side-effect free, i.e. that no global variables, including the heap, are changed. The term AND (mask 5) carries the additional information that the field has a size of 5 bits. This form proved more convenient than the alternative of having an abstract field of word length 5, because casting between word lengths often introduces additional proof obligations.</p><p>The meaning of the rule can also be expressed by means of the commuting diagram in Fig. <ref type="figure" target="#fig_6">7</ref>. For Fig. <ref type="figure" target="#fig_6">7</ref>, consider cap untyped cap set capBlockSize as a function from cap t (its first argument) to cap t (its return value). Control flows left to right, and r (| a := x |) is the Isabelle syntax for the record r, with field a updated with value x. This makes it clear that the function of the rule is to allow us to transform a function call into a record update, by commuting it with a lift. We can therefore take any precondition of the form P (cap_untyped_cap_lift cap), and commute it past any number of field updates, to produce a postcondition of the form P (f (cap_untyped_cap_lift cap)), where f is the composition of a number of record updates. We can base our argument on such a case, as long as bitfield objects are only initialised via the appropriate * new functions, and the type tags are never externally modified. This justifies the API restriction introduced in Section 3, which is adhered to by the seL4 kernel implementation without loss of convenience or performance.</p><p>Equivalent rules are proved automatically for all the generated functions, and their pointer-lifted versions. The latter involve direct heap access to record fields and automate the interactive reasoning Tuch provides <ref type="bibr" target="#b23">[25]</ref>. Additionally to what Tuch provides, we make use of the concept of packed records, which allow us to ignore padding in record implementations and derive more precise properties of the corresponding memory layout. Packed records are represented by a type class in Isabelle that simply states that all fields in the record are of a size that makes padding unnecessary.</p><p>The proofs of the specifications above are fully automated and generally consists of two to three automated method invocations in Isabelle. The first of these is a call to the C-level VCG mentioned above. The second and possibly third, first reduce the remaining proof obligation from variable, heap, and structupdates to a goal on bit-vectors only. This is then solved automatically with a carefully designed set of generic, algebraic rewrite rules for the bit operations involved in the generated functions. The direct proof script for one specification of a typical C-function is typically about 10 lines long.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Related Work</head><p>Earlier work on OS verification includes PSOS <ref type="bibr" target="#b9">[10]</ref> and UCLA Secure Unix <ref type="bibr" target="#b25">[27]</ref>. Later, KIT <ref type="bibr" target="#b1">[2]</ref> describes verification of process isolation properties down to object code level, but for an idealised kernel far simpler than modern microkernels. The Verisoft project <ref type="bibr" target="#b10">[11,</ref><ref type="bibr" target="#b11">12]</ref> is attempting to verify a whole system stack, including hardware, compiler, applications, and a simplified microkernel: VAMOS. The VFiasco <ref type="bibr" target="#b13">[14]</ref> project is attempting to verify the Fiasco kernel, another variant of L4, directly at the C++ level. These verification projects do not use generated C code for automating parts of their proof obligations. In the case of Verisoft, there is no reason to distrust the compiler as it is also verified <ref type="bibr" target="#b18">[20,</ref><ref type="bibr" target="#b14">15]</ref>. Directly using C or dropping down to assembly code to implement the desired features does not have the benefit of the high-level reasoning support and API the tool presented here provides, however.</p><p>The verified proofs in this work build directly on Tuch's et al. memory model for C <ref type="bibr" target="#b24">[26,</ref><ref type="bibr" target="#b23">25,</ref><ref type="bibr" target="#b22">24]</ref> which in turn builds on work by Schirmer <ref type="bibr" target="#b21">[23,</ref><ref type="bibr" target="#b20">22]</ref> that provides a generic framework, verification condition generator, and Hoare logic <ref type="bibr" target="#b12">[13]</ref> for imperative programs. Both are intended for interactive verification. This paper uses the predictable structure of the generated code to completely automate the pointer level proofs on the C implementation.</p><p>This work also builds directly on Dawson's machine-word library <ref type="bibr" target="#b3">[4]</ref> for Isabelle/HOL. Despite recent progress in tools like Yices <ref type="bibr" target="#b5">[6]</ref>, bit-vector proofs for machine words remain hard to automate. Traditional SAT solvers are usually too slow to handle the resulting proof obligations on realistic word sizes. Again, due to the predictable nature of the generated code, the tool is able to fully automate the bit-level verification conditions with a set of algebraic rewrite rules. This means that switching to different, say 64-bit, architectures should not result in any noticeable slowdown of the generated proofs.</p><p>General translation validation <ref type="bibr" target="#b19">[21]</ref> and compiler correctness including Leroy's et al. work <ref type="bibr" target="#b15">[16]</ref> are related to the topic. As mentioned above, the tool presented here can exploit the known, predictable nature of the application to provide a convenient interface to, and integration into, the user's proofs.</p><p>Also related to generated correctness proofs is the idea of proof-carrying code <ref type="bibr" target="#b17">[18]</ref>, which usually focusses on the machine level and on specific properties such as memory safety or resource constraints. Functional correctness is not usually targeted, because it is impossible to automate completely. Barthe et al. <ref type="bibr" target="#b0">[1]</ref> come close by automatically transforming certificates from source code to machine code and, similarly to the work presented here, generating proofs for generated code. In contrast to this, the bitfield generator here does not require any source-level proof as input. It generates a full functional correctness statement automatically.</p><p>Denney et al. <ref type="bibr" target="#b8">[9]</ref> automatically prove properties about generated aerospace software. The generated code appears more complex than that presented here, but the semantics they are using is not foundational and the properties do not cover full functional correctness, only specific safety properties.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6">Conclusion</head><p>This paper has summarised a generator for tagged unions of packed bitfields in the C programming language, as they are used in low-level systems code and operating system kernel implementations. In theory, this data structure can be implemented with C primitives without resorting to a generator. However, compiler implementations of bitfields seem to be so unpredictable in memory layout and performance over different platforms and compilers that kernel programmers distrust this compiler feature more than others.</p><p>The tool generates efficient, predictable, and above all correct C code from a short, high-level description that is detailed enough to provide precise memory layout specification which is important to map data, for instance, to memory mapped hardware device registers. The generated code includes the data type itself as well as an API for convenient, high-level access on the stack and on the heap.</p><p>This work shows that an automatic correctness proof of generated code for controlled environments is not hard to achieve, even if this code contains bit-level reasoning and pointer access. The proof is foundational in the sense that it assumes no specific axioms on the application domain, but is built directly on the semantics of the C programming language. The proof is machine-checked in the theorem prover Isabelle/HOL and provides an example of translationvalidation: Instead of proving the correctness of the generator, the correctness of the generated code is proven instead.</p><p>The usefulness of the tool reaches further than a stand-alone correctness proof. The Hoare-triples proven integrate directly, within the same formal model, with larger implementation proofs of client code using the generated bitfields. The Hoare-triples are designed such that client proofs and code have no need to reason about the internal representation or bit-level operations that are carried out. They provide an abstract interface. Translation validation has likely made this easier to achieve than in a generator correctness proof. No meta-level reasoning or switching of formal models is required.</p><p>The tool is expected to automate 14% of the C implementation proofs in the L4.verified project, covering 1,800 lines of C code with 7,800 lines of generated proof. The seL4 kernel, including all generated inline functions, comprises 12,600 lines of code. The tool is generally applicable to code that needs to have direct, reliable control over the memory layout of data structures. The technique of generating proofs that integrate well into interactive environments should generalise easily to constrained application domains where the structure of the generated proof is predictable.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Fig. 1 .</head><label>1</label><figDesc>Fig.1. Example of combined union/bitfield usage. From OKL4 2.1, "include/caps.h", lines 92-100.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Fig. 2 .</head><label>2</label><figDesc>Fig. 2. Packed bitfield layout</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Fig. 3 . 1 }Fig. 4 .</head><label>314</label><figDesc>Fig. 3. field high implementation</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>Fig. 5 .</head><label>5</label><figDesc>Fig. 5. Specification language grammar</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Fig. 6 .</head><label>6</label><figDesc>Fig. 6. Generated function prototypes for the example</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head></head><label></label><figDesc>It takes two arguments, an untyped capability cap and a new block size v. It returns the original capability updated with the new block size. The formal specification below translates this into a record update: " Γ {|s. cap_get_tag ´cap = cap_untyped_cap | } ´ret__struct_cap_C :== PROC cap_untyped_cap_set_capBlockSize( ´cap, ´v) {|cap_untyped_cap_lift ´ret__struct_cap_C = cap_untyped_cap_lift s cap (|capBlockSize_CL := s v AND (mask 5) |) ∧ cap_get_tag ´ret__struct_cap_C = cap_untyped_cap | }"</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_6"><head>•Fig. 7 .</head><label>7</label><figDesc>Fig. 7. Refinement picture for field update.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_7"><head>•Fig. 8 .</head><label>8</label><figDesc>Fig. 8. Refinement picture for initialisation</figDesc></figure>
		</body>
		<back>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Certificate translation for optimizing compilers</title>
		<author>
			<persName><forename type="first">G</forename><surname>Barthe</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Grégoire</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Kunz</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Rezk</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 13th International Static Analysis Symposium (SAS)</title>
		<title level="s">LNCS</title>
		<meeting>the 13th International Static Analysis Symposium (SAS)<address><addrLine>Seoul, Korea</addrLine></address></meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2006-08">August 2006</date>
			<biblScope unit="volume">4134</biblScope>
			<biblScope unit="page" from="301" to="317" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Kit: A study in operating system verification</title>
		<author>
			<persName><forename type="first">R</forename><surname>William</surname></persName>
		</author>
		<author>
			<persName><surname>Bevier</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">IEEE Transactions on Software Engineering</title>
		<imprint>
			<biblScope unit="volume">15</biblScope>
			<biblScope unit="issue">11</biblScope>
			<biblScope unit="page" from="1382" to="1396" />
			<date type="published" when="1989">1989</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Secure microkernels, state monads and scalable refinement</title>
		<author>
			<persName><forename type="first">David</forename><surname>Cock</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Gerwin</forename><surname>Klein</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Thomas</forename><surname>Sewell</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 21st International Conference on Theorem Proving in Higher Order Logics (TPHOLs&apos;08)</title>
				<editor>
			<persName><forename type="first">Cesar</forename><surname>Munoz</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Otmane</forename><surname>Ait</surname></persName>
		</editor>
		<meeting>the 21st International Conference on Theorem Proving in Higher Order Logics (TPHOLs&apos;08)</meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
	<note>To appear</note>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Isabelle theories for machine words</title>
		<author>
			<persName><forename type="first">Jeremy</forename><forename type="middle">E</forename><surname>Dawson</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Seventh International Workshop on Automated Verification of Critical Systems (AVOCS&apos;07)</title>
		<title level="s">Electronic Notes in Computer Science</title>
		<meeting><address><addrLine>Oxford, UK</addrLine></address></meeting>
		<imprint>
			<publisher>Elsevier</publisher>
			<date type="published" when="2007-09">September 2007</date>
		</imprint>
	</monogr>
	<note>To appear</note>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Running the manual: An approach to high-assurance microkernel development</title>
		<author>
			<persName><forename type="first">Philip</forename><surname>Derrin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Kevin</forename><surname>Elphinstone</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Gerwin</forename><surname>Klein</surname></persName>
		</author>
		<author>
			<persName><forename type="first">David</forename><surname>Cock</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><forename type="middle">T</forename><surname>Manuel</surname></persName>
		</author>
		<author>
			<persName><surname>Chakravarty</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. ACM SIGPLAN Haskell Workshop</title>
				<meeting>ACM SIGPLAN Haskell Workshop<address><addrLine>Portland, OR, USA</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2006-09">September 2006</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<monogr>
		<title level="m" type="main">The yices smt solver</title>
		<author>
			<persName><forename type="first">Bruno</forename><surname>Dutertre</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Leonardo</forename><surname>De Moura</surname></persName>
		</author>
		<ptr target="http://yices.csl.sri.com/tool-paper.pdf" />
		<imprint>
			<date type="published" when="2006-06">2006. June 2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">A memory allocation model for an embedded microkernel</title>
		<author>
			<persName><forename type="first">Dhammika</forename><surname>Elkaduwe</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Philip</forename><surname>Derrin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Kevin</forename><surname>Elphinstone</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 1st MIKES</title>
				<meeting>1st MIKES<address><addrLine>Sydney, Australia</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2007">2007</date>
			<biblScope unit="page" from="28" to="34" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Towards a practical, verified kernel</title>
		<author>
			<persName><forename type="first">Kevin</forename><surname>Elphinstone</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Gerwin</forename><surname>Klein</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Philip</forename><surname>Derrin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Timothy</forename><surname>Roscoe</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Gernot</forename><surname>Heiser</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 11th Workshop on Hot Topics in Operating Systems</title>
				<meeting>11th Workshop on Hot Topics in Operating Systems<address><addrLine>San Diego, CA, USA</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2007-05">May 2007</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Using automated theorem provers to certify auto-generated aerospace software</title>
		<author>
			<persName><forename type="first">Bernd</forename><surname>Fischer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ewen</forename><surname>Denney</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Johann</forename><surname>Schumann</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 2nd International Joint Conference on Automated Reasoning (IJCAR&apos;04)</title>
				<meeting>2nd International Joint Conference on Automated Reasoning (IJCAR&apos;04)</meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2004">2004</date>
			<biblScope unit="volume">3097</biblScope>
			<biblScope unit="page" from="198" to="212" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">The foundations of a provably secure operating system (PSOS)</title>
		<author>
			<persName><forename type="first">Richard</forename><forename type="middle">J</forename><surname>Feiertag</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Peter</forename><forename type="middle">G</forename><surname>Neumann</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">AFIPS Conf. Proc., 1979National Comp. Conf</title>
				<meeting><address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<date type="published" when="1979-06">June 1979</date>
			<biblScope unit="page" from="329" to="334" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">On the correctness of operating system kernels</title>
		<author>
			<persName><forename type="first">Mauro</forename><surname>Gargano</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Mark</forename><surname>Hillebrand</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Dirk</forename><surname>Leinenbach</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Wolfgang</forename><surname>Paul</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. TPHOls&apos;05</title>
				<editor>
			<persName><forename type="first">Joe</forename><surname>Hurd</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Thomas</forename><forename type="middle">F</forename><surname>Melham</surname></persName>
		</editor>
		<meeting>TPHOls&apos;05<address><addrLine>Oxford, UK</addrLine></address></meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2005">2005</date>
			<biblScope unit="volume">3603</biblScope>
			<biblScope unit="page" from="1" to="16" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">On the architecture of system verification environments</title>
		<author>
			<persName><forename type="first">Mark</forename><forename type="middle">A</forename><surname>Hillebrand</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Wolfgang</forename><forename type="middle">J</forename><surname>Paul</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Hardware and Software: Verification and Testing</title>
				<meeting><address><addrLine>Berlin, Germany</addrLine></address></meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2008">2008</date>
			<biblScope unit="volume">4899</biblScope>
			<biblScope unit="page" from="153" to="168" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">An axiomatic basis for computer programming</title>
		<author>
			<persName><forename type="first">C</forename><forename type="middle">A R</forename><surname>Hoare</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Communications of the ACM</title>
		<imprint>
			<biblScope unit="volume">12</biblScope>
			<biblScope unit="issue">10</biblScope>
			<biblScope unit="page" from="576" to="580" />
			<date type="published" when="1969">1969</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">The VFiasco approach for a verified operating system</title>
		<author>
			<persName><forename type="first">Michael</forename><surname>Hohmuth</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Hendrik</forename><surname>Tews</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 2nd ECOOP-PLOS Workshop</title>
				<meeting>2nd ECOOP-PLOS Workshop<address><addrLine>Glasgow, UK</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2005-10">October 2005</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">Pervasive compiler verification-from verified programs to verified systems</title>
		<author>
			<persName><forename type="first">Dirk</forename><surname>Leinenbach</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Elena</forename><surname>Petrova</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 3rd international Workshop on Systems Software Verification (SSV&apos;08)</title>
		<title level="s">Electronic Notes in Computer Science</title>
		<editor>
			<persName><forename type="first">Ralf</forename><surname>Huuck</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Gerwin</forename><surname>Klein</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Bastian</forename><surname>Schlich</surname></persName>
		</editor>
		<meeting>the 3rd international Workshop on Systems Software Verification (SSV&apos;08)<address><addrLine>Sydney, Australia</addrLine></address></meeting>
		<imprint>
			<publisher>Elsevier</publisher>
			<date type="published" when="2008-02">February 2008</date>
		</imprint>
	</monogr>
	<note>To appear</note>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">Formal certification of a compiler back-end, or: Programming a compiler with a proof assistant</title>
		<author>
			<persName><forename type="first">Xavier</forename><surname>Leroy</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">33rd symposium Principles of Programming Languages (POPL&apos;06)</title>
				<editor>
			<persName><forename type="first">J</forename><forename type="middle">G</forename><surname>Morrisett</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">S</forename><forename type="middle">L P</forename><surname>Jones</surname></persName>
		</editor>
		<meeting><address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2006">2006</date>
			<biblScope unit="page" from="42" to="54" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b16">
	<analytic>
		<title level="a" type="main">On µ-kernel construction</title>
		<author>
			<persName><forename type="first">J</forename><surname>Liedtke</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">15th ACM Symposium on Operating System Principles (SOSP)</title>
				<imprint>
			<date type="published" when="1995-12">December 1995</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">Proof-carrying code</title>
		<author>
			<persName><forename type="first">George</forename><forename type="middle">C</forename><surname>Necula</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">POPL &apos;97: Proceedings of the 24th ACM SIGPLAN-SIGACT symposium on Principles of programming languages</title>
				<meeting><address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="1997">1997</date>
			<biblScope unit="page" from="106" to="119" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b18">
	<monogr>
		<title level="m" type="main">Verification of the C0 Compiler Implementation on the Source Code Level</title>
		<author>
			<persName><forename type="first">Elena</forename><surname>Petrova</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2007">2007</date>
			<pubPlace>Germany</pubPlace>
		</imprint>
		<respStmt>
			<orgName>Saarland University, Computer Science Department, Saarbrücken</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">PhD thesis</note>
</biblStruct>

<biblStruct xml:id="b19">
	<analytic>
		<title level="a" type="main">Translation validation</title>
		<author>
			<persName><forename type="first">Amir</forename><surname>Pnueli</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Michael</forename><surname>Siegel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Eli</forename><surname>Singerman</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 4th Intl. Conf. Tools and Algorithms for Construction and Analysis of Systems (TACAS&apos;98)</title>
				<editor>
			<persName><forename type="first">Bernhard</forename><surname>Steffen</surname></persName>
		</editor>
		<meeting>4th Intl. Conf. Tools and Algorithms for Construction and Analysis of Systems (TACAS&apos;98)</meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="1998">1998</date>
			<biblScope unit="volume">1384</biblScope>
			<biblScope unit="page" from="151" to="166" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b20">
	<analytic>
		<title level="a" type="main">A verification environment for sequential imperative programs in Isabelle/HOL</title>
		<author>
			<persName><forename type="first">Norbert</forename><surname>Schirmer</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Logic for Programming, AI, and Reasoning</title>
				<editor>
			<persName><forename type="first">F</forename><surname>Baader</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">A</forename><surname>Voronkov</surname></persName>
		</editor>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2005">2005</date>
			<biblScope unit="volume">3452</biblScope>
			<biblScope unit="page" from="398" to="414" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b21">
	<monogr>
		<title level="m" type="main">Verification of Sequential Imperative Programs in Isabelle/HOL</title>
		<author>
			<persName><forename type="first">Norbert</forename><surname>Schirmer</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2006">2006</date>
		</imprint>
		<respStmt>
			<orgName>Technische Universität München</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">PhD thesis</note>
</biblStruct>

<biblStruct xml:id="b22">
	<monogr>
		<title level="m" type="main">Formal Memory Models for Verifying C Systems Code</title>
		<author>
			<persName><forename type="first">Harvey</forename><surname>Tuch</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2008">2008</date>
			<pubPlace>Sydney, Australia</pubPlace>
		</imprint>
		<respStmt>
			<orgName>School for Computer Science and Engineering, University of New South Wales</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">PhD thesis</note>
</biblStruct>

<biblStruct xml:id="b23">
	<analytic>
		<title level="a" type="main">Structured types and separation logic</title>
		<author>
			<persName><forename type="first">Harvey</forename><surname>Tuch</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 3rd International Workshop on Systems Software Verification (SSV&apos;08)</title>
		<title level="s">Electronic Notes in Computer Science</title>
		<editor>
			<persName><forename type="first">Ralf</forename><surname>Huuck</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Gerwin</forename><surname>Klein</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Bastian</forename><surname>Schlich</surname></persName>
		</editor>
		<meeting>the 3rd International Workshop on Systems Software Verification (SSV&apos;08)<address><addrLine>Sydney, Australia</addrLine></address></meeting>
		<imprint>
			<publisher>Elsevier</publisher>
			<date type="published" when="2008-02">February 2008</date>
		</imprint>
	</monogr>
	<note>To appear</note>
</biblStruct>

<biblStruct xml:id="b24">
	<analytic>
		<title level="a" type="main">Types, bytes, and separation logic</title>
		<author>
			<persName><forename type="first">Harvey</forename><surname>Tuch</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Gerwin</forename><surname>Klein</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Michael</forename><surname>Norrish</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 34th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</title>
				<editor>
			<persName><forename type="first">Martin</forename><surname>Hofmann</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Matthias</forename><surname>Felleisen</surname></persName>
		</editor>
		<meeting>34th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages<address><addrLine>Nice, France</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="page" from="97" to="108" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b25">
	<analytic>
		<title level="a" type="main">Specification and verification of the UCLA Unix security kernel</title>
		<author>
			<persName><forename type="first">Bruce</forename><surname>Walker</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Richard</forename><surname>Kemmerer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Gerald</forename><surname>Popek</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Commun. ACM</title>
		<imprint>
			<biblScope unit="volume">23</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="118" to="131" />
			<date type="published" when="1980">1980</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
