C++/EC++コンパイル時に、math.hの一部の関数(frexp、ldexp、scalbn、remquo)の実引数をint型にすると、実行時に無限ループとなるオブジェクトが生成されます。
ただし、第1引数がfloat型で、-dbl_size=8オプション指定時を除く
ただし、第1引数がfloat型で、-dbl_size=8オプション指定時を除く
ただし、第1引数がfloat型で、-dbl_size=8オプション指定時を除く
ただし、第1または第2引数がfloat型で、-dbl_size=8オプション指定時を除く
// C++ソースとしてコンパイルした場合に無限ループになる例
#include <math.h>
double d1,d2;
int i;
void func(void)
{
d2 = frexp(d1, &i);
}
ccrx -cpu=rx600 -output=src file.cpp
_func:
; ...(中略)
BSR __$frexp__tm__2_f__FZ1ZPi_Q2_21_Real_type__tm__4_Z1Z5_Type ; frexpの代替関数を呼ぶ
; ...(中略)
__$frexp__tm__2_f__FZ1ZPi_Q2_21_Real_type__tm__4_Z1Z5_Type:
L11:
BRA L11 ; 再帰呼び出しとなってしまう
/* frexp関数の場合 */
static inline double frexp(double x, int *y)
{ long v = *y; double d = frexp(x,&v); *y = v; return (d); }
/* ldexp関数の場合 */
static inline double ldexp(double x, int y)
{ long v = y; double d = ldexp(x,v); return (d); }
/* scalbn関数の場合 */
static inline double scalbn(double x, int y)
{ long v = y; double d = scalbn(x,v); return (d); }
/* remquo関数の場合 */
static inline double remquo(double x, double y, int *z)
{ long v = *z; double d = remquo(x,y,&v); *z = v; return (d); }
#include <math.h>
double d1,d2;
int i;
void func(void)
{
long x = i; /* 一旦long型変数で受ける */
d2 = frexp(d1, &x); /* long型変数で呼び出し */
i = x; /* i に値を設定 */
}
#include <math.h>
/* 宣言を追加 */
static inline double frexp(double x, int *y)
{ long v = *y; double d = frexp(x,&v); *y = v; return (d); }
double d1,d2;
int i;
void func(void)
{
d2 = frexp(d1, &i);
}