[cfe-dev] GRExprEngine and complexe

Jean-Daniel Dupas devlists at shadowlab.org
Thu Jun 19 07:44:51 PDT 2008


I'm trying to do some static code analysis. Usually, my code uses  
tgmath.h to don't have to bother with all the maths fonctions variants.
The problem is that some tgmaths fonctions have complex number  
support, and even if I do not use complex numbers directly, some  
complex operator may appears in my code.

#include <tgmath.h>

int main(int argc, char **argv) {
   sin(M_PI_2 - .8);
   return 0;
}

expand to

int main(int argc, char **argv) {
   __builtin_choose_expr  
(__builtin_classify_type(1.57079632679489661923132169163975144 - .8)  
== 9,  
__builtin_choose_expr 
(__builtin_types_compatible_p 
(__typeof__(__real__(1.57079632679489661923132169163975144 - .8)),  
long double), csinl(1.57079632679489661923132169163975144 - .8),  
__builtin_choose_expr 
((__builtin_types_compatible_p 
(__typeof__(__real__(1.57079632679489661923132169163975144 - .8)),  
double) ||  
__builtin_classify_type(__real__(1.57079632679489661923132169163975144  
- .8)) == 1), (csin)(1.57079632679489661923132169163975144 - .8),  
csinf(1.57079632679489661923132169163975144 - .8))),  
__builtin_choose_expr 
(__builtin_types_compatible_p 
(__typeof__(1.57079632679489661923132169163975144 - .8), long double),  
sinl(1.57079632679489661923132169163975144 - .8),  
__builtin_choose_expr 
((__builtin_types_compatible_p 
(__typeof__(1.57079632679489661923132169163975144 - .8), double) ||  
__builtin_classify_type(1.57079632679489661923132169163975144 - .8) ==  
1), (sin)(1.57079632679489661923132169163975144 - .8),  
sinf(1.57079632679489661923132169163975144 - .8))));
  return 0;
}

which contains some "__real__" operators.

The problem is in GRExprEngine::VisitUnaryOperator(). There is no case  
for UnaryOperator::Real and UnaryOperator::Imag.  So when a Real  
operator is reached, the

assert (U->isIncrementDecrementOp()); is false.

What should be done to fix this ?


-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2427 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20080619/9bf19bb8/attachment.bin>


More information about the cfe-dev mailing list