<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.2 20190208//EN" "https://jats.nlm.nih.gov/publishing/1.2/JATS-journalpublishing1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" article-type="review-article" dtd-version="1.2" xml:lang="en">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">IJCSER</journal-id>
<journal-title-group><journal-title>International Journal of Computer Science Engineering and Research</journal-title></journal-title-group>
<publisher><publisher-name>Thomson &amp; Ryberg Publications</publisher-name></publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="doi">10.62715/ijcser.2026.v1.i1.pp7-12</article-id>
<article-id pub-id-type="publisher-id">892c61f54a</article-id>
<article-categories><subj-group subj-group-type="heading"><subject>Review Article</subject></subj-group></article-categories>
<title-group><article-title>Memory Safety in Systems Programming Languages: A Survey of Migration Strategies From Legacy Codebases</article-title></title-group>
<contrib-group>
<contrib contrib-type="author" corresp="yes"><name><surname>Sundararajan</surname><given-names>Nadia</given-names></name><xref ref-type="aff" rid="aff1"><sup>1</sup></xref><xref ref-type="corresp" rid="cor1">*</xref></contrib>
<contrib contrib-type="author"><name><surname>Muthukumar</surname><given-names>Huong</given-names></name><xref ref-type="aff" rid="aff2"><sup>2</sup></xref></contrib>
<contrib contrib-type="author"><name><surname>Lefebvre</surname><given-names>Dongwoo</given-names></name><xref ref-type="aff" rid="aff3"><sup>3</sup></xref></contrib>
<aff id="aff1"><label>1</label>Department of Computer Science, Congo School of Computer Science, Georgia</aff>
<aff id="aff2"><label>2</label>Department of Computer Science, Sharavati Institute for Advanced Computer Science, Philippines</aff>
<aff id="aff3"><label>3</label>Department of Computer Science, Ebro Academy of Computer Science, Czech Republic</aff>
</contrib-group>
<author-notes><corresp id="cor1">* Correspondence: <email>nadia.sundararajan@congo.edu</email></corresp></author-notes>
<pub-date pub-type="epub" iso-8601-date="2026-07-01"><day>01</day><month>07</month><year>2026</year></pub-date>
<volume>1</volume>
<issue>1</issue>
<fpage>7</fpage>
<lpage>12</lpage>
<history>
<date date-type="received" iso-8601-date="2026-02-27"><day>27</day><month>02</month><year>2026</year></date>
<date date-type="accepted" iso-8601-date="2026-05-11"><day>11</day><month>05</month><year>2026</year></date>
</history>
<permissions><copyright-statement>© 2026 The Author(s)</copyright-statement><copyright-year>2026</copyright-year><license license-type="open-access" xlink:href="https://creativecommons.org/licenses/by/4.0/"><license-p>This is an open access article distributed under the Creative Commons Attribution 4.0 International License (CC BY 4.0).</license-p></license></permissions>
<self-uri xlink:href="https://trpub.org/article.php?id=892c61f54a"/>
<abstract><p>Buffer overflows, use-after-free errors and related faults have been the leading source of exploitable defects in software written in C and C++ for decades, and government agencies now ask suppliers to plan a move to memory-safe languages. Most of the code concerned cannot simply be rewritten. It is large, depended upon and often poorly tested, so the practical question is how to migrate. This narrative review surveys the strategies described in the published literature and groups them into four families: hardening existing code with sanitizers and exploit mitigations, retrofitting safety through C dialects and pointer annotations, enforcing bounds in hardware with capability architectures, and replacing components incrementally with code in a safe language, chiefly Rust, either by hand or with automated translation. For each family the review describes the mechanism, the guarantee it gives, the effort it demands of an existing codebase and the evidence on how it fares in use. It then considers how the strategies combine, what the studies of unsafe Rust and of developer experience imply for migration planning, and where the literature is thin, notably on the cost of migration, the safety of language boundaries and the treatment of code that will never be rewritten.</p></abstract>
<kwd-group kwd-group-type="author">
<kwd>Memory safety</kwd>
<kwd>Rust</kwd>
<kwd>C and C++</kwd>
<kwd>Legacy code migration</kwd>
<kwd>Software security</kwd>
<kwd>Capability hardware</kwd>
</kwd-group>
</article-meta>
</front>
<body>
<sec id="sec1"><title>1. Introduction</title>
<p>C and C++ give the programmer direct control over memory and ask the programmer, in return, to get every pointer dereference and every deallocation right. The languages do not check. A write past the end of an array or a read through a pointer to freed storage is undefined behaviour, and attackers have turned such errors into code execution since the earliest network worms. The systematisation by Szekeres et al. (2013) describes the result as a long contest in which each new defence has been met by a new attack technique, while the underlying errors continued to be written.</p>
<p>What has changed in recent years is the position of institutions. The United States National Security Agency advised organisations to prefer memory-safe languages where possible (NSA, 2022). A group of national cybersecurity agencies followed with a call for software manufacturers to publish roadmaps for eliminating this class of vulnerability (CISA et al., 2023), and the White House Office of the National Cyber Director made the same argument to a technical audience (ONCD, 2024). These documents rest on reports from large vendors that memory safety errors account for a large majority of their severe vulnerabilities.</p>
<p>The advice is simple to state and hard to follow, because the operating systems, browsers, databases, network stacks and embedded firmware concerned represent decades of work. This review is about the middle ground between doing nothing and rewriting everything: the strategies by which a legacy codebase can be moved, in whole or in part, towards memory safety.</p>
</sec>
<sec id="sec2"><title>2. Scope and Approach</title>
<p>This is a narrative review of the published literature. It draws on peer-reviewed papers from the programming languages, security and software engineering communities, on the principal government guidance, and on standard books. Sources were chosen for their influence on the field and for the range of strategies they represent, and no claim is made to exhaustive coverage. The review is confined to migration from C and C++, considers Rust as the main target language because the research literature does, and leaves aside garbage-collected languages, which suit application code better than the systems code at issue here.</p>
<p>Two terms recur. Spatial safety means that every access through a pointer stays within the object the pointer was derived from. Temporal safety means that no access occurs after the object has been freed. A strategy may provide one, both, or only a reduction in the exploitability of violations. Table 1 sets out the strategies used to organise what follows, with the rewrite family divided into its manual and automated routes.</p>
<table-wrap id="tbl1"><label>Table 1</label><caption><p>Migration strategies for legacy C and C++ code, with representative sources</p></caption><table frame="hsides" rules="groups"><thead><tr><th>Family</th><th>Mechanism</th><th>Main limitation</th><th>Representative sources</th></tr></thead><tbody><tr><td>Harden in place</td><td>Compiler instrumentation and runtime checks on unchanged source</td><td>Detects or impedes errors; does not remove them</td><td>Serebryany et al., 2012; Abadi et al., 2005</td></tr><tr><td>Safe C dialects</td><td>Checked pointer types and annotations added to C</td><td>Annotation effort; safety only in converted regions</td><td>Necula et al., 2002; Elliott et al., 2018</td></tr><tr><td>Capability hardware</td><td>Pointers carry bounds and permissions enforced by the processor</td><td>Needs new hardware; temporal safety is added separately</td><td>Woodruff et al., 2014</td></tr><tr><td>Incremental rewrite</td><td>Components replaced by Rust behind a C interface</td><td>Boundary code is unsafe; skills and build integration</td><td>Anderson et al., 2016; Jung et al., 2021</td></tr><tr><td>Automated translation</td><td>Tools convert C to Rust, then lift raw pointers to safe types</td><td>Output is largely unsafe Rust at first</td><td>Emre et al., 2021</td></tr></tbody></table></table-wrap>
</sec>
<sec id="sec3"><title>3. Hardening Code in Place</title>
<p>The cheapest strategy leaves the source alone and changes how it is compiled and run. Sanitizers instrument the program to detect violations as they happen. AddressSanitizer surrounds objects with poisoned red zones, tracks the state of memory in a shadow map and delays the reuse of freed blocks, which lets it report overflows and many use-after-free errors with a slowdown that is tolerable in testing (Serebryany et al., 2012). Its guarantee is probabilistic and its cost is generally too high for production. The survey by Song et al. (2019) classifies the many sanitizers that followed and stresses that they are bug-finding tools whose value depends on the tests or fuzzing inputs that drive them.</p>
<p>Research compilers went further and enforced complete safety on unmodified C. SoftBound attaches base and bound metadata to every pointer and checks each dereference (Nagarakatte et al., 2009). Its companion, CETS, adds identifiers that detect access to freed objects (Nagarakatte et al., 2010). Together they showed that full spatial and temporal safety for C is achievable by compilation alone, at a running-time cost that has kept the approach out of general production use.</p>
<p>Exploit mitigations accept that errors will occur and aim to stop them being useful. Control-flow integrity restricts indirect jumps and calls to targets permitted by the program&#x27;s control-flow graph (Abadi et al., 2005). Code-pointer integrity protects only the pointers through which control can be hijacked and so achieves lower overhead (Kuznetsov et al., 2014). Such defences are widely deployed and raise the cost of attack, but they leave data-only attacks and information leaks possible. As a migration strategy, hardening buys time. It is the only option for code that nobody is in a position to change.</p>
</sec>
<sec id="sec4"><title>4. Retrofitting Safety Within C</title>
<p>A second family keeps the language recognisably C while giving the compiler enough information to check it. Cyclone was a safe dialect with fat pointers, region-based memory management and restrictions on unsafe constructs (Jim et al., 2002). Porting existing code to it required manual changes, and it remained a research system, though its treatment of regions influenced the design of Rust. CCured took the opposite approach to effort: it analysed existing C, inferred which pointers were used safely, and inserted runtime checks only for the rest (Necula et al., 2002).</p>
<p>Checked C is the most recent representative. It extends C with pointer types whose bounds are declared by the programmer and verified by the compiler, statically where possible and dynamically otherwise, and it lets checked and unchecked code coexist in one file (Elliott et al., 2018). The design is aimed squarely at incremental migration: a function can be converted, compiled and tested while the rest of the program is untouched. The limitation shared by this family is that the guarantee holds only inside converted regions and concerns spatial safety first. Modern C++ offers a comparable path through resource-owning types and smart pointers, which reduce temporal errors by convention but are not enforced by the language.</p>
</sec>
<sec id="sec5"><title>5. Enforcing Safety in Hardware</title>
<p>Capability architectures move the check into the processor. In CHERI, a pointer is replaced by a capability that carries bounds and permissions and is protected by a tag that software cannot forge; every load and store is checked against it (Woodruff et al., 2014). Existing C and C++ can in large part be recompiled for such a machine, with source changes concentrated in code that treats pointers as integers. The attraction for legacy systems is plain: spatial safety arrives through the compiler and the hardware, without rewriting. The obstacles are equally plain. The hardware must exist in the products concerned, capabilities are wider than conventional pointers, and temporal safety needs further machinery such as revocation of stale capabilities. Hardware enforcement also turns a violation into a fault, which stops an attack but still crashes the program.</p>
</sec>
<sec id="sec6"><title>6. Incremental Replacement With Rust</title>
<p>Rust provides memory safety without a garbage collector through a type system built on ownership and borrowing: every value has one owner, references are either shared and read-only or unique and mutable, and the compiler rejects programs that could alias and mutate at once (Matsakis and Klock, 2014; Jung et al., 2021). Operations the compiler cannot verify are confined to blocks marked unsafe. The RustBelt project gave a machine-checked proof that a core model of the language is sound and that important library abstractions built on unsafe code preserve safety for their callers (Jung et al., 2018).</p>
<p>Because Rust can call and be called through the C application binary interface, a legacy program can be migrated one component at a time. The Servo project demonstrated the approach on a browser engine and reported how ownership caught errors that are routine in comparable C++ code (Anderson et al., 2016). Tock showed that an operating system kernel for microcontrollers could use the type system to isolate drivers at no runtime cost (Levy et al., 2017). The Linux kernel has since accepted Rust as a language for new drivers, which brings the approach to one of the largest C codebases in existence.</p>
<p>The empirical literature tempers the picture in three ways. First, unsafe code is common where Rust meets C. Astrauskas et al. (2020) found that unsafe blocks in published libraries are mostly small and are used largely to call foreign or other unsafe functions, and Evans et al. (2020) showed that many libraries which contain no unsafe code themselves depend on others that do. Second, the bugs that remain cluster there: in the study of real-world Rust defects by Qin et al. (2020), the memory safety bugs examined all involved unsafe code. Third, adoption has human costs. Developers interviewed and surveyed by Fulton et al. (2021) valued the confidence Rust gave them and reported a steep learning curve, slow compilation and friction in interoperating with existing code.</p>
</sec>
<sec id="sec7"><title>7. Automated Translation</title>
<p>Hand rewriting is slow, which makes mechanical translation attractive. Current tools translate C syntax into Rust that preserves the behaviour of the original by using raw pointers and unsafe blocks throughout. The output compiles with the Rust toolchain but is no safer than its source. Emre et al. (2021) examined why, and used the compiler&#x27;s own borrow-checking errors to rewrite some raw pointers into safe references. They found that only a modest fraction could be lifted this way, because C programs depend on aliasing patterns and pointer arithmetic that the ownership discipline forbids. Translation is therefore best understood as a first step that changes the language and the build, after which the hard work of restructuring data ownership remains to be done by people or by better tools.</p>
</sec>
<sec id="sec8"><title>8. Choosing and Combining Strategies</title>
<p>The families differ along two dimensions that matter to a project planning migration: how much must be done to the existing code, and how strong a guarantee results. Figure 1 places them on those axes. No quadrant dominates. Mitigations are cheap and partial. A rewrite is costly and strong. Capability hardware offers strength at low source cost but depends on the platform, and dialects and translation sit in between.</p>
<fig id="fig1"><label>Figure 1</label><caption><p>Migration strategies arranged by the effort they require on existing code and the strength of the guarantee obtained</p></caption><graphic xlink:href="IJCSER_V1I1_2026_02_Figure1.png" mimetype="image" mime-subtype="png"/></fig>
<p>In practice the strategies are layered. A plausible plan hardens the whole codebase at once, writes new components in a safe language, and selects existing components for rewriting by exposure: parsers of untrusted input, protocol handlers and code with a history of vulnerabilities come first. The government guidance recommends this kind of prioritised roadmap in place of wholesale replacement (CISA et al., 2023). Whatever the target, the advice of the legacy code literature applies. Behaviour should be pinned down with characterisation tests before a component is replaced, and the seams at which a component can be detached have to be found or created first (Feathers, 2004).</p>
</sec>
<sec id="sec9"><title>9. Gaps and Future Work</title>
<p>Several questions that a migration planner would ask are poorly answered in the literature. The first is cost. Published accounts describe what was migrated and what was learned, but controlled evidence on the effort of rewriting, annotating or translating a given volume of C is scarce, as is evidence on defect rates in migrated components over time. The second is the boundary. A mixed-language program has an interface at which Rust&#x27;s assumptions about aliasing and lifetimes must be upheld by C code that knows nothing of them, and tools for checking that interface are immature compared with tools for either language alone.</p>
<p>The third gap concerns the residue. Every realistic plan leaves a body of C and C++ in service for many years, and research on making that residue safer, through better sanitizers in production, capability hardware or checked dialects, receives less attention than the target language. Finally, most studies of Rust in use examine open-source libraries. Evidence from safety-critical, embedded and regulated settings, where certification and toolchain qualification govern language choice, would widen the basis for the policy now being made.</p>
</sec>
<sec id="sec10"><title>10. Conclusion</title>
<p>Memory safety can be approached from an existing C or C++ codebase by four routes: harden what exists, annotate it into a checked dialect, run it on hardware that enforces bounds, or replace it piece by piece with code in a safe language. The literature shows each to be feasible and none to be sufficient alone. Rust offers the strongest guarantee for new and rewritten code, with the caveat that safety must be argued, not assumed, wherever unsafe blocks and foreign interfaces appear. The older strategies keep their place because most legacy code will be migrated late or never. Sound planning treats migration as a portfolio ordered by risk, and the research most needed is on its costs and on the interfaces between safe and unsafe worlds.</p>
</sec>
<sec id="sec11"><title>Conflict of interest</title>
<p>To be declared by the author(s) before publication.</p>
</sec>
<sec id="sec12"><title>Funding</title>
<p>To be declared by the author(s) before publication.</p>
</sec>
</body>
<back>
<ref-list><title>References</title>
<ref id="ref1"><label>1</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Abadi, M., Budiu, M., Erlingsson, Ú. and Ligatti, J.</string-name></person-group> (<year>2005</year>). <article-title>Control-flow integrity</article-title>. <source>Proceedings of the 12th ACM Conference on Computer and Communications Security</source>, <fpage>340-353</fpage> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/1102120.1102165">https://doi.org/10.1145/1102120.1102165</ext-link></mixed-citation></ref>
<ref id="ref2"><label>2</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Anderson, B., Bergstrom, L., Goregaokar, M., Matthews, J., McAllister, K., Moffitt, J. and Sapin, S.</string-name></person-group> (<year>2016</year>). <article-title>Engineering the Servo web browser engine using Rust</article-title>. <source>Proceedings of the 38th International Conference on Software Engineering Companion</source>, <fpage>81-89</fpage></mixed-citation></ref>
<ref id="ref3"><label>3</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Astrauskas, V., Matheja, C., Poli, F., Müller, P. and Summers, A.J.</string-name></person-group> (<year>2020</year>). <article-title>How do programmers use unsafe Rust?</article-title>. <source>Proceedings of the ACM on Programming Languages, 4(OOPSLA): Article 136</source> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3428204">https://doi.org/10.1145/3428204</ext-link></mixed-citation></ref>
<ref id="ref4"><label>4</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>CISA, NSA, FBI and international partner agencies</string-name></person-group> (<year>2023</year>). <article-title>The Case for Memory Safe Roadmaps</article-title>. <source>Cybersecurity and Infrastructure Security Agency, Washington, DC</source></mixed-citation></ref>
<ref id="ref5"><label>5</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Elliott, A.S., Ruef, A., Hicks, M. and Tarditi, D.</string-name></person-group> (<year>2018</year>). <article-title>Checked C: Making C safe by extension</article-title>. <source>Proceedings of the 2018 IEEE Cybersecurity Development Conference (SecDev)</source>, <fpage>53-60</fpage></mixed-citation></ref>
<ref id="ref6"><label>6</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Emre, M., Schroeder, R., Dewey, K. and Hardekopf, B.</string-name></person-group> (<year>2021</year>). <article-title>Translating C to safer Rust</article-title>. <source>Proceedings of the ACM on Programming Languages, 5(OOPSLA): Article 121</source> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3485498">https://doi.org/10.1145/3485498</ext-link></mixed-citation></ref>
<ref id="ref7"><label>7</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Evans, A.N., Campbell, B. and Soffa, M.L.</string-name></person-group> (<year>2020</year>). <article-title>Is Rust used safely by software developers?</article-title>. <source>Proceedings of the 42nd International Conference on Software Engineering</source>, <fpage>246-257</fpage></mixed-citation></ref>
<ref id="ref8"><label>8</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Feathers, M.C.</string-name></person-group> (<year>2004</year>). <article-title>Working Effectively with Legacy Code</article-title>. <source>Prentice Hall, Upper Saddle River, NJ</source></mixed-citation></ref>
<ref id="ref9"><label>9</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Fulton, K.R., Chan, A., Votipka, D., Hicks, M. and Mazurek, M.L.</string-name></person-group> (<year>2021</year>). <article-title>Benefits and drawbacks of adopting a secure programming language: Rust as a case study</article-title>. <source>Proceedings of the Seventeenth Symposium on Usable Privacy and Security (SOUPS 2021)</source>, <fpage>597-616</fpage></mixed-citation></ref>
<ref id="ref10"><label>10</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Jim, T., Morrisett, G., Grossman, D., Hicks, M., Cheney, J. and Wang, Y.</string-name></person-group> (<year>2002</year>). <article-title>Cyclone: A safe dialect of C</article-title>. <source>Proceedings of the 2002 USENIX Annual Technical Conference</source>, <fpage>275-288</fpage></mixed-citation></ref>
<ref id="ref11"><label>11</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Jung, R., Jourdan, J.-H., Krebbers, R. and Dreyer, D.</string-name></person-group> (<year>2018</year>). <article-title>RustBelt: Securing the foundations of the Rust programming language</article-title>. <source>Proceedings of the ACM on Programming Languages, 2(POPL): Article 66</source> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3158154">https://doi.org/10.1145/3158154</ext-link></mixed-citation></ref>
<ref id="ref12"><label>12</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Jung, R., Jourdan, J.-H., Krebbers, R. and Dreyer, D.</string-name></person-group> (<year>2021</year>). <article-title>Safe systems programming in Rust</article-title>. <source>Communications of the ACM</source>, <volume>64(4)</volume>, <fpage>144-152</fpage> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3418295">https://doi.org/10.1145/3418295</ext-link></mixed-citation></ref>
<ref id="ref13"><label>13</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Kuznetsov, V., Szekeres, L., Payer, M., Candea, G., Sekar, R. and Song, D.</string-name></person-group> (<year>2014</year>). <article-title>Code-pointer integrity</article-title>. <source>Proceedings of the 11th USENIX Symposium on Operating Systems Design and Implementation</source>, <fpage>147-163</fpage></mixed-citation></ref>
<ref id="ref14"><label>14</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Levy, A., Campbell, B., Ghena, B., Giffin, D.B., Pannuto, P., Dutta, P. and Levis, P.</string-name></person-group> (<year>2017</year>). <article-title>Multiprogramming a 64kB computer safely and efficiently</article-title>. <source>Proceedings of the 26th Symposium on Operating Systems Principles</source>, <fpage>234-251</fpage> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3132747.3132786">https://doi.org/10.1145/3132747.3132786</ext-link></mixed-citation></ref>
<ref id="ref15"><label>15</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Matsakis, N.D. and Klock, F.S.</string-name></person-group> (<year>2014</year>). <article-title>The Rust language</article-title>. <source>ACM SIGAda Ada Letters</source>, <volume>34(3)</volume>, <fpage>103-104</fpage> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/2692956.2663188">https://doi.org/10.1145/2692956.2663188</ext-link></mixed-citation></ref>
<ref id="ref16"><label>16</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Nagarakatte, S., Zhao, J., Martin, M.M.K. and Zdancewic, S.</string-name></person-group> (<year>2009</year>). <article-title>SoftBound: Highly compatible and complete spatial memory safety for C</article-title>. <source>Proceedings of the 30th ACM SIGPLAN Conference on Programming Language Design and Implementation</source>, <fpage>245-258</fpage> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/1542476.1542504">https://doi.org/10.1145/1542476.1542504</ext-link></mixed-citation></ref>
<ref id="ref17"><label>17</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Nagarakatte, S., Zhao, J., Martin, M.M.K. and Zdancewic, S.</string-name></person-group> (<year>2010</year>). <article-title>CETS: Compiler enforced temporal safety for C</article-title>. <source>Proceedings of the 2010 International Symposium on Memory Management</source>, <fpage>31-40</fpage></mixed-citation></ref>
<ref id="ref18"><label>18</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Necula, G.C., McPeak, S. and Weimer, W.</string-name></person-group> (<year>2002</year>). <article-title>CCured: Type-safe retrofitting of legacy code</article-title>. <source>Proceedings of the 29th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</source>, <fpage>128-139</fpage> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/503272.503286">https://doi.org/10.1145/503272.503286</ext-link></mixed-citation></ref>
<ref id="ref19"><label>19</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>NSA</string-name></person-group> (<year>2022</year>). <article-title>Software Memory Safety</article-title>. <source>Cybersecurity Information Sheet. National Security Agency, Fort Meade, MD</source></mixed-citation></ref>
<ref id="ref20"><label>20</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>ONCD</string-name></person-group> (<year>2024</year>). <article-title>Back to the Building Blocks: A Path Toward Secure and Measurable Software</article-title>. <source>Office of the National Cyber Director, The White House, Washington, DC</source></mixed-citation></ref>
<ref id="ref21"><label>21</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Qin, B., Chen, Y., Yu, Z., Song, L. and Zhang, Y.</string-name></person-group> (<year>2020</year>). <article-title>Understanding memory and thread safety practices and issues in real-world Rust programs</article-title>. <source>Proceedings of the 41st ACM SIGPLAN Conference on Programming Language Design and Implementation</source>, <fpage>763-779</fpage> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3385412.3386036">https://doi.org/10.1145/3385412.3386036</ext-link></mixed-citation></ref>
<ref id="ref22"><label>22</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Serebryany, K., Bruening, D., Potapenko, A. and Vyukov, D.</string-name></person-group> (<year>2012</year>). <article-title>AddressSanitizer: A fast address sanity checker</article-title>. <source>Proceedings of the 2012 USENIX Annual Technical Conference</source>, <fpage>309-318</fpage></mixed-citation></ref>
<ref id="ref23"><label>23</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Song, D., Lettner, J., Rajasekaran, P., Na, Y., Volckaert, S., Larsen, P. and Franz, M.</string-name></person-group> (<year>2019</year>). <article-title>SoK: Sanitizing for security</article-title>. <source>Proceedings of the 2019 IEEE Symposium on Security and Privacy</source>, <fpage>1275-1295</fpage></mixed-citation></ref>
<ref id="ref24"><label>24</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Szekeres, L., Payer, M., Wei, T. and Song, D.</string-name></person-group> (<year>2013</year>). <article-title>SoK: Eternal war in memory</article-title>. <source>Proceedings of the 2013 IEEE Symposium on Security and Privacy</source>, <fpage>48-62</fpage> <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1109/SP.2013.13">https://doi.org/10.1109/SP.2013.13</ext-link></mixed-citation></ref>
<ref id="ref25"><label>25</label><mixed-citation publication-type="other"><person-group person-group-type="author"><string-name>Woodruff, J., Watson, R.N.M., Chisnall, D., Moore, S.W., Anderson, J., Davis, B., Laurie, B., Neumann, P.G., Norton, R. and Roe, M.</string-name></person-group> (<year>2014</year>). <article-title>The CHERI capability model: Revisiting RISC in an age of risk</article-title>. <source>Proceedings of the 41st Annual International Symposium on Computer Architecture</source>, <fpage>457-468</fpage></mixed-citation></ref>
</ref-list>
</back>
</article>