{"id":3747,"date":"2018-07-23T11:05:23","date_gmt":"2018-07-23T09:05:23","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=3747"},"modified":"2023-08-06T21:49:51","modified_gmt":"2023-08-06T19:49:51","slug":"rust-safety-during-and-after-programming","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/07\/23\/rust-safety-during-and-after-programming\/","title":{"rendered":"RUST &#8211; Safety During and After Programming"},"content":{"rendered":"<h4>Intro<\/h4>\n<p>The programming language Rust is dwelling on the web for half a decade already. Initially started as a personal project by an Mozilla employee and later continued by the Mozilla Foundation itself, it repeatedly gained attention with the claims of being the language of choice for technically safe software \u2013 including system software.<\/p>\n<p>With this blog entry I want to give you an introduction to the language and talk about how said safety has been proven mathematically.<\/p>\n<p>By the way, if you want to try out some code snippets from this blog post, you can do so directly online here:&nbsp;<a href=\"https:\/\/play.rust-lang.org\/\">https:\/\/play.rust-lang.org\/<\/a><br \/>\n<!--more--><br \/>\n&nbsp;<\/p>\n<h4>The Basics<\/h4>\n<p>Rust is a fully compiled language with a Syntax fairly similar to C.<br \/>\nThe basic language is procedural and the variable scopes are within curly brackets ( \u2018{}\u2019 ).<\/p>\n<p>A first significant difference is the variable initialization with the keyword <strong>let<\/strong> and optional implied variable type. A very simple program looks as follows (Note, the code-blocks say &#8220;C\/C++&#8221; because Rust is sadly not available here &gt;: ):<\/p>\n<pre class=\"prettyprint lang-c_cpp\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">fn main() {\n   let on_world = true;\n    \n   if on_world \n    {println!(\"Hello World!\");}\n   else\n    {println!(\"Goodbye, World.\");}\n}<\/pre>\n<p>It has the output \u201cHello World\u201d.<\/p>\n<p>To choose the variable type explicitly, the first line would need to look as follows:<\/p>\n<pre class=\"prettyprint lang-c_cpp\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">let on_world : bool = true;<\/pre>\n<p>So far so good and unsurprising.<br \/>\nThings turn more interesting in the following example:<\/p>\n<pre class=\"prettyprint lang-c_cpp\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"4\" data-caption=\"\">let s1 = String::from(\"Hello\");\nlet s2 = s1;\nprintln!(\"{}, world!\", s2);\nprintln!(\"{}, world!\", s1);<\/pre>\n<p>ERROR: <strong><em>-&gt; Value used here after MOVE<\/em><\/strong><\/p>\n<p>This error occurs because Rust <strong>MOVES<\/strong> the content of non-primitive variables by default instead of copying them. That simply means that the String \u201cHello\u201d is in variable <strong>s2<\/strong> and not anymore in <strong>s1 <\/strong>which has been invalidated automatically.<br \/>\nIf you do want to <strong>COPY<\/strong> the content, you must explicitly write:<\/p>\n<pre class=\"prettyprint lang-c_cpp\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">let s2 = s1.clone();<\/pre>\n<p>The following is just another variant of the same aspect but shows a different way of avoiding the error:<\/p>\n<pre class=\"prettyprint lang-c_cpp\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">let s1 = String::from(\"Hello\");\ntoWorld( &amp;s1 );\nprintln!(\"{}, world!\", s1);<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>toWorld<\/strong> is a function here which takes a single argument of the String type.<br \/>\nNote the \u2018<strong>&amp;<\/strong>\u2019 symbol for the variable. Without it, we would have the same error as before \u2013 the <strong>println<\/strong> macro (behaves here like a function) would raise an error because s1 isn\u2019t anymore.<\/p>\n<p>However \u2018<strong>&amp;<\/strong>\u2019 caused that only a reference has been given away, not the content of the variable itself.<br \/>\nThe result is that the outer scope can still use <strong>s1<\/strong> but the <strong>toWorld<\/strong> function would not be able to modify the variable.<\/p>\n<p>We will talk about the background and reason of this behavior later on.<\/p>\n<p>Let\u2019s stay at functions and look at a code snipped you might accidentally write similarly in C++ and thus end up in one of its infamous traps:<\/p>\n<pre class=\"prettyprint lang-c_cpp\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"8\" data-caption=\"\">fn main()\n{\n   let reference_to_nothing = dangle();\n}\nfn dangle() -&gt; &amp;String\n{\n   let s = String::from(\"Hello\");\n   return &amp;s;\n}<\/pre>\n<p>ERROR: <strong><em>-&gt; <\/em><\/strong><strong><em>no value to BORROW from<\/em><\/strong><\/p>\n<p>The function <strong>dangle<\/strong> \u00eds defined to have the return type \u201creference to <strong>String<\/strong>\u201d.<br \/>\nHowever while C++ would allow you to return this reference of the object that has been created inside the function, Rust throws an error at compiletime.<\/p>\n<p>The reason is that objects are automatically destroyed when they end out of their scope. That means after the function-call, <strong>s<\/strong> doesn\u2019t exist anymore.<br \/>\nFurthermore the compiler recognized that the variable would be empty and doesn\u2019t allow that.<\/p>\n<p>The result is that there are <strong>no dangling reference<\/strong>s in Rust and therefore no \u201cnull pointer\u201d or \u201caccess violation\u201d trouble!<\/p>\n<p>Now on to the last basic example I shall give you as it shows another unique feature of the language:<\/p>\n<pre class=\"prettyprint lang-c_cpp\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"4\" data-caption=\"\">let mut s = String::from(\"Hello\");\nlet rs = &amp;mut s;\nrs.push(\u2018W\u2019); \/\/ pushes a letter into the string\ns.push(\u2018o\u2019); \/\/ pushes another letter<\/pre>\n<p>ERROR: <strong><em>-&gt; <\/em><\/strong><strong>cannot borrow \u2018s\u2019 as mutable more than once<\/strong><\/p>\n<p>So far, all variables \u2013 or maybe we should just call them \u2018objects\u2019 \u2013 we defined simply with \u2018<strong><em>let<\/em><\/strong><strong>\u2019<\/strong>, were in fact what other languages would call constants. They were not changeable.<\/p>\n<p>Of course, usually we want variables which are\u2026 well, variable.<\/p>\n<p>That\u2019s where the \u2018<strong>mut<\/strong>\u2019 keyword comes into play and tells the compiler to allow us to change the value. However the upper code fails with said error nevertheless. The reason is that technically spoken, we have given the <strong>RIGHT<\/strong> to modify the variable to the variable \u201c<strong>rs<\/strong>\u201d. As a result, \u2018<strong>s<\/strong>\u2019 does not have this right anymore and therefore may not modify the content.<\/p>\n<p>The reason for this initially cumbersome behavior is what the developers of Rust call the \u201c<strong>Ownership Concept<\/strong>\u201d.<\/p>\n<p>&nbsp;<\/p>\n<h4>The Ownership Concept<\/h4>\n<p>The roots of said constrictions can be summed up in three rules:<\/p>\n<ol>\n<li>Each value has a variable that\u2019s called its \u201cowner\u201d<\/li>\n<li>There can only be one owner for the value at a time<\/li>\n<li>When the owner goes out of scope, the value will be dropped<\/li>\n<\/ol>\n<p>The consequences are <strong>that no memory is accessible without \u201cowning\u201d it<\/strong> and there\u2019s <strong>no memory around which doesn\u2019t have an owner<\/strong> (except for inside \u2018unsafe blocks\u2019 about which we will talk &nbsp;later).<\/p>\n<p>This setup prevents several problems and has certain benefits:<\/p>\n<ul>\n<li>Secure memory handling\n<ul>\n<li>Malicious code (SQL injection, buffer-overflow etc.) cannot access memory because it doesn\u2019t own it<\/li>\n<li>No invalid access attempts at runtime<\/li>\n<\/ul>\n<\/li>\n<li>Object-Lifetime determined at compile-time<\/li>\n<li>Clear knowledge where data is manipulated in in complicated, hierarchical software\n<ul>\n<li>Less unintended behavior<\/li>\n<li>No race conditions<\/li>\n<li>Feels safe during programming<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>However those restrictions, if enforced strictly, also make some nowadays very normal and required things impossible:<\/p>\n<ul>\n<li>No simple recursive algorithms on the same data-structure\n<ul>\n<li>The owner and scope system complicates things<\/li>\n<\/ul>\n<\/li>\n<li>Some design patterns not possible (Factory-Pattern for example)<\/li>\n<li>No Multithreading\n<ul>\n<li>As an object only has one owner, multiple threads would not be able to work on the same data structure<\/li>\n<\/ul>\n<\/li>\n<li>No direct hardware access\n<ul>\n<li>Drivers naturally require direct memory allocation<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>With the standard API included in rust those things can be achieved through special data structures though. One of those is \u201c<strong>CELL<\/strong>\u201d.<\/p>\n<pre class=\"prettyprint lang-c_cpp\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">let c1: &amp;Cell = &amp;Cell::new(0);\nlet c2: &amp;Cell = c1;\nc1.set(2);\nprintln!(\"{:?}\", c2.get());<\/pre>\n<p>The \u201c<strong>Cell<\/strong>\u201d encompasses a value (pretty much like a container in java) and provides functions to set and get the value. This works <strong>even with references<\/strong> of the cell! Unlike if it were a String for example as we saw earlier.<\/p>\n<p>This data-structure provides certain skills for efficient algorithms (and that at zero cost after compilation). Yet it retains Rust\u2019s memory safety with a series of constrictions enforced by the API:<\/p>\n<ol>\n<li>Data only accessible through <strong>set<\/strong> and <strong>get<\/strong><\/li>\n<li>No deep-stacking (aka <strong>Cell<\/strong> in <strong>Cell<\/strong>)<\/li>\n<li>No passing to multiple threads<\/li>\n<\/ol>\n<p>Now the big question: How is it even possible that something like <strong>Cell<\/strong>, a structure that breaks the fundamental rules of Rust, has been implemented in Rust?<\/p>\n<p>The answer is: It is not possible. Something based on certain rules cannot break those rules.<\/p>\n<p>That\u2019s why Rust supports the so called <strong>\u201cUNSAFE\u201d keyword<\/strong>!<\/p>\n<p>&nbsp;<\/p>\n<h4>The \u201cUnsafe\u201d keyword<\/h4>\n<p>\u201cUnsafe\u201d can be used before a code-block and allows a group of very specific calls inside which are otherwise rejected by the compiles.<br \/>\nAs it can be seen in the following example* one can more or less simply allocate memory inside such a block. However the compiler still ensures that nothing actually unsafe \u2013 like a raw memory-address (pointer) \u2013 from inside the block can be taken outside.<\/p>\n<p>*Note that the code of this example has been simplified to be better readable!<\/p>\n<pre class=\"prettyprint lang-c_cpp\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">let mut safe_box: Box;\nunsafe {\n   let size = 20;\n   let unsafe_ptr = Heap::allocate(size);\n\n   safe_box = Box::from_raw(unsafe_ptr, size);\n}<\/pre>\n<p>If we had defined the \u201c<strong>unsafe_ptr<\/strong>\u201d directly outside the \u201c<strong>UNSAFE<\/strong>\u201d scope, the compiler would have thrown an error. But because we \u201c<strong>BOXED<\/strong>\u201d the memory into the special object \u201c<strong>Box<\/strong>\u201d, we have given that memory an owner and thus satisfy the ownership rules again.<\/p>\n<p>Therefore, we are allowed to take this memory outside the unsafe block and the \u201c<strong>Box<\/strong>\u201d will also ensure that the memory is freed once the variable reaches the end of its scope.<\/p>\n<p>Using constructs like this, Rust gains the <strong>full power of a system language<\/strong> it claims to be. At the same time its safety is based on the strict rule not to use the \u201cunsafe\u201d keyword directly unless absolutely necessary.<\/p>\n<p>Still the programmer will use \u201cunsafe code\u201d indirectly. For example by using the \u201cCell\u201d object shown earlier.<\/p>\n<p>The second, big question now is, how can the programmer <strong>trust that the usage<\/strong> of such an object (through its API) will be <strong>safe, when its \u201cinsides\u201d are officially not<\/strong>?<\/p>\n<p>&nbsp;<\/p>\n<h4>Mathematical proof that an unsafe code has a safe API<\/h4>\n<p>The computer scientists RALF JUNG, JACQUES-HENRI JOURDAN, ROBBERT KREBBERS, and DEREK DREYER have developed and performed a method for find a mathematical solution to this problem.<br \/>\nThey described that in the paper:&nbsp;<a href=\"https:\/\/people.mpi-sws.org\/~dreyer\/papers\/rustbelt\/paper.pdf\"><strong>RustBelt: Securing the Foundations of the Rust Programming Language<\/strong><\/a><\/p>\n<p>The work consisted of four steps:<\/p>\n<ol>\n<li>Abstracting the Rust language to an <strong>intermediate language \u03bbRust <\/strong>(LambdaRust) which can form mathematical axioms and yet describe all of Rusts significant features. Especially its ownership concept.<br \/>\nThis set of formal, primitive constructs is close to Rust&#8217;s own &#8220;Mid-level Intermediate Representation&#8221; (MIR) which is used by the compiler.For the true computer scientists among the readers, here is the whole syntax system of <strong>\u03bbRust<\/strong>:<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/07\/LambdaRustSyntax-1.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3749\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/07\/23\/rust-safety-during-and-after-programming\/lambdarustsyntax-2\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/07\/LambdaRustSyntax-1.png\" data-orig-size=\"1116,306\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"LambdaRustSyntax\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/07\/LambdaRustSyntax-1-1024x281.png\" class=\"alignnone size-full wp-image-3749\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/07\/LambdaRustSyntax-1.png\" alt=\"\" width=\"1116\" height=\"306\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/07\/LambdaRustSyntax-1.png 1116w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/07\/LambdaRustSyntax-1-300x82.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/07\/LambdaRustSyntax-1-768x211.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/07\/LambdaRustSyntax-1-1024x281.png 1024w\" sizes=\"auto, (max-width: 1116px) 100vw, 1116px\" \/><\/a>The paper describes the way it works in more detail.<\/li>\n<li>Prove that the <strong>axioms are mathematically sound<\/strong> and can therefore form rightful terms.The semantic interpretation of a premise always has to match the semantic interpretation of the conclusion.This ensures that the model can be used to make a statement about the safeness of the code later on.<br \/>\nThe paper calls this <strong>&#8220;Fundamental theorem of logical relations&#8221;<\/strong>.<strong>-&gt; The correctness of \u03bbRust has been proven<\/strong><\/li>\n<li>It has to be proven that code that follows \u03bbRust will<strong> not result in any unsafe or undefined behavior<\/strong>. Partially, automated code-interpretation were used to fulfill this task successfully.For example the existence of data-races can be checked semantically and the result was that \u03bbRust does not allow those to occur.The rest has been verified manually. The paper calls this <strong>&#8220;Adequacy&#8221;<\/strong>.<strong>-&gt; The safety of the language Rust has been proven.<\/strong>The exact procedure can be seen in the paper and the associated papers.<\/li>\n<li>Convert the API of the important core libraries that use the unsafe keyword internally, into the new language. If this is flawlessly possible and therefore the result does not exhibit any unsafe\/undefined behavior, that means the real API does not either.<strong>-&gt; The safety of the library has been proven.<\/strong><\/li>\n<\/ol>\n<p>Step 4. has been performed for <strong>several APIs<\/strong>, including the earlier mentioned &#8220;Cell&#8221;: Arc, Rc, <strong>Cell<\/strong>, RefCell, Mutex, mem::swap, thread::spawn, rayon::join and take_mut.<\/p>\n<p>&nbsp;<\/p>\n<h4>Conclusion<\/h4>\n<p>RustBelt proves that a <strong>significant part of Rust is truly safe now<\/strong> (after a few corrections had been implemented during the development of the paper).<br \/>\nThis is the<strong> first time that has been achieved<\/strong> to a fully usable and preexisting language.<\/p>\n<p>Furthermore this has shown a method to achieve <strong>true safety<\/strong> in a program <strong>without needing to bother the programmer<\/strong> with low-level, mathematical axioms directly.<br \/>\n<strong>-&gt; The developer can trust the language.<\/strong><\/p>\n<p>In the end that makes Rust better usable for truly secure systems as long as only verified libraries are used and the unsafe keyword is avoided.<\/p>\n<p>It remains to be seen whether more developers will adapt to rust now due to this mathematical proof and thus increase the chance that the language will be in use for more projects.<\/p>\n<p>In my personal opinion it would make a lot of sense even in not extremely safety-critical programs like it&#8217;s used now, because it would generally raise the base of trust in general software and maybe also reduce the number of minor exploits significantly.<\/p>\n<p>&nbsp;<\/p>\n<h4>Research Questions<\/h4>\n<p>Those thoughts and my attempts to understand Rust as well as the paper has revealed a couple of questions that will require more research:<\/p>\n<p>Could this verification method be applied to libraries in other languages too? For example to Java where an &#8220;unsafe&#8221; class exists as well?<\/p>\n<p>Can a theoretical language with proved safety, be converted into a widespread usable language? (as if \u03bbRust were developed first)<\/p>\n<p>How well could Rust replace C and C++ as system languages on a large scale?<\/p>\n<h4>Powerpoint:&nbsp;<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/07\/Rust.pptx\">Rust<\/a><\/h4>\n","protected":false},"excerpt":{"rendered":"<p>Summary about Rust and how RustBelt has achieved to prove its safety with mathematical concepts.<\/p>\n","protected":false},"author":878,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[26,651],"tags":[166,165,116],"ppma_author":[753],"class_list":["post-3747","post","type-post","status-publish","format-standard","hentry","category-secure-systems","category-system-designs","tag-programming","tag-rust","tag-safety"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":1004,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/07\/21\/rust-fast-and-secure\/","url_meta":{"origin":3747,"position":0},"title":"Rust &#8211; fast and secure","author":"Jakob Schaal","date":"21. July 2016","format":false,"excerpt":"Rust, a fairly new programming language promises to be fast and secure. The following blog entry discusses how Rust tries to achieve these two goals. The key concept is that every resource always belongs to exactly one variable. More precisely one lifetime, which is normally automatically created on variable creation.\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/Rust_programming_language_black_logo.svg_.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":20613,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/08\/19\/mechanismen-bei-system-programmiersprachen-zum-erreichen-von-memory-thread-und-type-safety\/","url_meta":{"origin":3747,"position":1},"title":"Mechanismen bei System-Programmiersprachen zum Erreichen von Memory-, Thread- und Type-Safety","author":"Laurin Keim","date":"19. August 2021","format":false,"excerpt":"Motivation Ende letzten Monats (Juli, 2021) hat die CWE (Common Weakness Enumeration) einen Bericht ver\u00f6ffentlicht, welcher die Top 25 der Software-Schwachstellen aufzeigt. Es handelt sich dabei um eine Auswertung von gefundenen Schwachstellen der letzten zwei Jahre in verschiedenen Software-Systemen. Der Bericht umfasst eine Liste der 40 schwerwiegensten Schwachstellen. Dabei handelt\u2026","rel":"","context":"In &quot;Secure Systems&quot;","block_context":{"text":"Secure Systems","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/secure-systems\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":20309,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/08\/14\/unsafe-programming-languages\/","url_meta":{"origin":3747,"position":2},"title":"Unsafe Languages, Inadequate Defense Mechanisms and Our Dangerous Addiction to Legacy Code","author":"Jan-Niklas Tille","date":"14. August 2021","format":false,"excerpt":"Over the last 20 years, developing secure software has become increasingly important. To this day, we write a significant amount of code in languages with manual memory management. However, the Peter Parker principle states that \u201cgreat power comes with great responsibility\u201d. Many scoring systems classify, enumerate and rank prevalence of\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":27379,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/28\/ist-rust-enterprise-ready\/","url_meta":{"origin":3747,"position":3},"title":"Ist Rust Enterprise ready?","author":"Paul M\u00f6hring","date":"28. February 2025","format":false,"excerpt":"Rust ist, laut der j\u00e4hrlichen StackOverflow Umfrage1, die am meisten gew\u00fcnschte Programmiersprache. Aber diese Umfrage bezieht sich aber nur auf die Interessen der Entwicklerinnen und Entwicklern und spiegelt nicht die Interessen der Unternehmen. Daher stellt sich die Frage, ob Rust tats\u00e4chlich f\u00fcr den Einsatz in Enterprise-Umgebungen geeignet ist. 1. Was\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Screenshot-2025-02-28-at-19.34.19.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Screenshot-2025-02-28-at-19.34.19.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Screenshot-2025-02-28-at-19.34.19.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Screenshot-2025-02-28-at-19.34.19.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/Screenshot-2025-02-28-at-19.34.19.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":711,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/06\/28\/the-elixir-programming-language\/","url_meta":{"origin":3747,"position":4},"title":"The Elixir Programming Language","author":"Yann Loic Philippczyk","date":"28. June 2016","format":false,"excerpt":"An introduction to the language, its main concepts and its potential. The number of security incidents has been on the rise for years, and the growth of the Internet of Things is unlikely to improve the situation. Successful attacks on all kinds of interconnected smart devices, from car locks over\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"elixir","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/06\/elixir-flame-229x300.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1711,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/11\/26\/snakes-exploring-pipelines-a-system-engineering-and-management-project\/","url_meta":{"origin":3747,"position":5},"title":"Snakes exploring Pipelines &#8211; A \u201cSystem Engineering and Management\u201d Project","author":"Yann Loic Philippczyk","date":"26. November 2016","format":false,"excerpt":"Part 0: Introduction This series of blog entries describes a student project focused on developing an application by using methods like pair programming, test driven development and deployment pipelines. Once upon a time, which was about one and a half months ago, an illustrious group of three students found together,\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"A python. (Because snakes. Not the language.) Source: https:\/\/rashmanly.files.wordpress.com\/2008\/10\/1439659.jpg","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/11\/0_1-300x300.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":753,"user_id":878,"is_guest":0,"slug":"ag147","display_name":"Alexander Georgescu","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/c808b1a8fcaf7a7ed021754757e9d9879a1898fae52bc557afb5459b3217de58?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/3747","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/878"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=3747"}],"version-history":[{"count":9,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/3747\/revisions"}],"predecessor-version":[{"id":25487,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/3747\/revisions\/25487"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=3747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=3747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=3747"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=3747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}