Nous venons de passer de VS2010 à VS2013 et j'ai trouvé un bug étrange et je me demande si c'est dû au compilateur.VS2013: bug du compilateur avec float et/EHa +/fp: strict?
Compilé avec la ligne de commande cl ConsoleApplication1.cpp /EHa /fp:strict /O2
le programme suivant donne: 0xC0000005: Access violation reading location 0xFFFFFFFF.
Cela se produit uniquement lors de la compilation 32 bits (non 64 bits)
#include <iostream>
#include <cmath>
class Vector2D
{
public:
double x;
double y;
Vector2D() : x(0), y(0) {}
Vector2D(double _x, double _y) : x(_x), y(_y) {}
double Width() { return x; }
double Height() { return y; }
};
bool IsEqual(const double & a, const double & b)
{
if (a == b)
return true;
double tolerance = pow(10., -5);
if (::fabs(a) < tolerance/2.)
{
return ::fabs(b) < tolerance/2.;
}
double diff = ::fabs((b - a)/a);
return (diff < tolerance);
}
bool IsEqual(Vector2D & a, Vector2D & b)
{
return IsEqual(a.Width(), b.Width()) && IsEqual(a.Height(), b.Height());
}
std::string GetMsg()
{
return std::string("");
}
int main(int argc, char* argv[])
{
Vector2D v1;
Vector2D v2;
v1 = Vector2D(1, 0);
// This innocent call will cause an access violation
// the access violation occurs *only* if fp:strict and /EHa switches are used
GetMsg(), IsEqual(v1, v2);
return 0;
}
Suis-je en train d'accuser le compilateur rapidement?
Le code apparaît bien à mes yeux. J'irais avec un bug de compilateur. Continuez à supprimer les bits pour minimiser votre code et signaler le bug. Vous pouvez probabiliser la chaîne de 'foo', et' height', et simplifier légèrement 'IsEqual'. –
'' "' 'lier à un' std :: string & 'comportement non défini, supprimer ce bit et confirmer que le bogue se produit encore –
@MooingDuck le bogue se produit toujours – BenjaminB