https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70893

            Bug ID: 70893
           Summary: codecvt incorrectly decodes UTF-16 due to optimization
           Product: gcc
           Version: 5.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kirillnow at gmail dot com
  Target Milestone: ---

In libstdc++ source codecvt.cc:
  inline bool  is_high_surrogate(char32_t c)
  {
    return c >= 0xD800 && c <= 0xDBFF;
  }
compiles to:
  if (is_high_surrogate(c))
  0x7ffff7b4d275        lea    ecx,[rsi-0xd800]
  0x7ffff7b4d27b        cmp    ecx,0x3ff
  0x7ffff7b4d281        ja     0x7ffff7b4d2ad 
          {
This code incorrectly decode code points like 0xDE00 (iconv can produce those).
GCC and library compilled with -Os. 
Possible solution:
  inline bool  is_high_surrogate(char32_t c)
  {
    return (c&0xFC00)==0xD800;
  }

Reply via email to