<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Sep 18, 2016, at 12:31 PM, Tom Mitchell <<a href="mailto:mitch@niftyegg.com" class="">mitch@niftyegg.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Fri, Sep 16, 2016 at 1:31 PM, Arnold Reinhold <span dir="ltr" class=""><<a href="mailto:agr@me.com" target="_blank" class="">agr@me.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">In the recent thread on safe erasure in C,  much was made of better languages including Ada and Rust. But there is a vast mount of code already written in C. Converting all of it or even a large fraction seems hopeless</blockquote><div class="">..... </div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Not hopeless,</div><div class="">The problem is large yet calling convention for the  ABI of existing compilers</div><div class="">allow incremental  functionality to be coded in a "better language".  To start</div><div class="">GCC and CLANG use a common calling convention.</div><div class=""><br class="">…</div><div class=""><br class=""></div><div class="">So to start, code modules of interest in a "better" language </div><div class="">and use a common ABI link to the larger body of system code and libraries.</div><div class="">Over time one layer at a time replace the dependencies.</div><div class=""><br class=""></div><div class="">At thes end point C is left behind and the "better" tool chain</div><div class="">is responsible for the entire program.<br class=""><br class="">It may take a couple starts to learn what a "better" language</div><div class="">and tool chain is.    Often the objections and advantages</div><div class="">are best understood when used for real so start.</div></div></div></div></div></blockquote></div><br class=""><div class="">That is not an unreasonable approach, one that Apple seems to be taking with Swift, but I don’t think it is likely to work in the majority of cases. There are too many software systems committed to C and C++. Many projects these days depend on multiple libraries over which they have little control. The often expect to benefit from ongoing development of those libraries. And C has almost a lock on embedded systems development. Rust seems to be largely ignoring embedded systems. There is an experimental project, <a href="http://zink.rs" class="">zink.rs</a>, trying to make it work for ARM that has a blinking LED program working, the embedded equivalent of “Hello world.”. Efforts to make Rust work for the AVR architecture seem stalled. ADA was designed for embedded systems, but it is unloved and doesn’t seem to be used much outside of situations where its use in mandated. Embedded system, especially Internet of Things, has arguably the most critical need for improved security.</div><div class=""><br class=""></div><div class="">So I think an effort to make C more security friendly is warranted. I think this is primarily an organizational problem, not a technical one. As is obvious from this thread there have been many past attempt to solve C’s insecurity, with very limited success. C11 at least has memset_s. What’s missing is some form of governance, starting with a clearer definition of the project. Here is what I had in mind: </div><div class=""><br class=""></div><div class=""><div style="margin: 0px; line-height: normal;" class="">Since the target is the vast amount of existing C code, the proposed compiler must be fully compatible with the C specs (C99? C11?), with the possible exception of one or a few new reserved words, e.g. for a zeroizable type. </div><div style="margin: 0px; line-height: normal; min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">Ab initio safety improvements would consist of clarification of undefined C behaviors to make unsafe code generation less likely. For example assuming twos complement arithmetic. </div><div style="margin: 0px; line-height: normal; min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">For data marked zeroizable, the compiler would minimize copies and keep track to insure they are erased after they are no longer needed in all situations. (That might be the linear type mentioned, I don’t want to prejudge technical solutions at this point.)</div><div style="margin: 0px; line-height: normal; min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">In addition memset_s support, maybe statements of the form x=0; should never be optimized out. Neither would asserts. </div><div style="margin: 0px; line-height: normal; min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">Invalid memory access is a great cause of concern in C and a vast amount of work has already been done. I would expect to adopt the best-of-breed approaches on a opt in basis, with detect & warn, suggest corrections and automatic remediation as options.</div><div style="margin: 0px; line-height: normal; min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">A major focus would be designing for strict configuration management. It should be possible for source code version management tools to completely control how the compiler is invoked for each source module. The goal should be that once a code module is tested and approved, the object code should never change without a new approval process. If that means compiling to assembler code and then storing the assembler file as the primary source document with the C source as a reference, so be it. Maybe add electronic signatures to source code modules. There also needs to be some way of avoiding the Hobson's choice of turning off warnings or being flooded by them. Maybe all the hooks to do this are already present and all that is needed is a best practices document. Whatever. Effective change control is a necessity in any sane engineering discipline.</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">To me the question is what kind or organizational; effort is needed to make this work and get compiler people thinking about security as something that they wish to assist with?</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">Arnold Reinhold</div><div style="margin: 0px; line-height: normal; min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal; min-height: 14px;" class=""><br class=""></div></div><div class=""><br class=""></div></body></html>