thakis added a comment.

Hi,

this causes a warning in harfbuzz on code that looks like so:

  UChar decomposed[4];
  ...
  int len = unorm2_getRawDecomposition(...decomposed, ARRAY_LENGTH 
(decomposed)...)
  if (len == 1) {
    U16_GET_UNSAFE (decomposed, 0, *a);

where `U16_GET_UNSAFE` looks like so:

  #define U16_GET_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
      (c)=(s)[i]; \
      if(U16_IS_SURROGATE(c)) { \
          if(U16_IS_SURROGATE_LEAD(c)) { \
              (c)=U16_GET_SUPPLEMENTARY((c), (s)[(i)+1]); \
          } else { \
              (c)=U16_GET_SUPPLEMENTARY((s)[(i)-1], (c)); \
          } \
      } \
  } UPRV_BLOCK_MACRO_END

(The BLOCK_MACRO macros are just a way to spell `do...while(false)` as far as I 
understand.)

It's true that the else block in the macro evaluates to decomposed[0-1], which 
is out of bounds -- but it's also in a conditional, and in a macro. That seems 
like this can cause quite a few false positives. Maybe this warning should be 
suppressed in conditionals, or macros, or some such?

(50k/70k files of chromium built with this patch, this so far is the only 
instance it flagged, and that's a false positive.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D71714/new/

https://reviews.llvm.org/D71714

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to