The problem is that undefined behaviors are used for valid extensions. &quot;Undefined behavior&quot; doesn&#x27;t mean &quot;error&quot;.<p>For instance including a platform header like #include &lt;fortran.h&gt; is undefined behavior. ISO C has some requirements there: if the header is found, then the directive is replaced with the preprocessing tokens from reading that header (and so if there are syntax errors there, they have to be diagnosed, and so on). But ISO C specifies no requirements as to what &lt;fortran.h&gt; contains, or whether it exists.  On one implementation, it might cause the rest of the translation unit to be treated as a Fortran program.  On an other implementation, it might bring in some declarations related to a Fortran interoperability. On yet another, translation might stop with &quot;header not found: fortran.h&quot;.<p>UB is simply &quot;behavior upon use of a nonportable or erroneous construct, of erroneous data, or of indeterminately-valued objects for which [ISO C] imposes no requirements&quot;.<p>Nonportable is not necessarily erroneous!