<div dir="ltr">On Tue, Jun 21, 2016 at 1:16 PM, Joe Groff <span dir="ltr">&lt;<a href="mailto:jgroff@apple.com" target="_blank">jgroff@apple.com</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; On Jun 21, 2016, at 8:47 AM, John McCall via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt; On Jun 20, 2016, at 7:07 PM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com">xiaodi.wu@gmail.com</a>&gt; wrote:<br>
&gt;&gt; On Mon, Jun 20, 2016 at 8:58 PM, John McCall via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt; On Jun 20, 2016, at 5:22 PM, Jordan Rose via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt; IIRC, some languages require zero-width joiners (though not zero-width spaces, which are distinct) to properly encode some of their characters. I&#39;d be very leery of having Swift land on a model where identifiers can be used with some languages and not others; that smacks of ethnocentrism.<br>
&gt;&gt;<br>
&gt;&gt; None of those languages require zero-width characters between two Latin letters, or between a Latin letter and an Arabic numeral, or at the end of a word.  Since standard / system APIs will (barring some radical shift) use those code points exclusively, it&#39;s justifiable to give them some special attention.<br>
&gt;&gt;<br>
&gt;&gt; Although the practical implementation may need to be more limited in scope, the general principle doesn&#39;t need to privilege Latin letters and Arabic numerals. If, in any context, the presence or absence of a zero-width glyph cannot possibly be distinguished by a human reading the text, then the compiler should also be indifferent to its presence or absence (or, alternatively, its presence should be a compile-time error).<br>
&gt;<br>
&gt; Sure, that&#39;s obvious.  Jordan was observing that the simplest way to enforce that, banning such characters from identifiers completely, would still interfere with some languages, and I was pointing out that just doing enough to protect English would get most of the practical value because it would protect every use of the system and standard library.  A program would then only become attackable in this specific way for its own identifiers using non-Latin characters.<br>
&gt;<br>
&gt; All that said, I&#39;m not convinced that this is worthwhile; the identifier-similarity problem in Unicode is much broader than just invisible characters.  In fact, Swift still doesn&#39;t canonicalize identifiers, so canonically equivalent compositions of the same glyph will actually produce different names.  So unless we&#39;re going to fix that and then ban all sorts of things that are known to generally be represented with a confusable glyph in a typical fixed-width font (like the mathematical alphabets), this is just a problem that will always exist in some form.<br>
<br>
</span>Any discussion about this ought to start from UAX #31, the Unicode consortium&#39;s recommendations on identifiers in programming languages:<br>
<br>
<a href="http://unicode.org/reports/tr31/" rel="noreferrer" target="_blank">http://unicode.org/reports/tr31/</a><br>
<br>
Section 2.3 specifically calls out the situations in which ZWJ and ZWNJ need to be allowed. The document also describes a stability policy for handling new Unicode versions, other confusability issues, and many of the other problems with adopting Unicode in a programming language&#39;s syntax.<br></blockquote><div><br></div><div>That&#39;s a fantastic document--a very edifying read. Given Swift&#39;s robust support for Unicode in its core libraries, it&#39;s kind of surprising to me that identifiers aren&#39;t canonicalized at compile time. From a quick first read, faithful adoption of UAX #31 recommendations would address most if not all of the confusability and zero-width security issues raised in this conversation.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class="HOEnZb"><font color="#888888"><br>
-Joe</font></span></blockquote></div><br></div></div>