xor'ing valoare float & întrebare generală exprimate cu privire la ieșire compilator

voturi
0

Ei bine, ambele întrebări sunt în cauză față de ieșire mea compilare, deoarece încerc să elimine toate avertismentele ..

La prima întrebare :
Sunt xor'ing valori float, de ieșire compilator: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

inline float ClassXY::GetFloat(void) const
{
    uint32_t xored = *(uint32_t*)&m_pParent->m_Value.m_fValue ^ (uint32_t)this; // compiler warning for this line
    return *(float*)&xored;
}

m_pParent este un pointer la această clasă ClassXY *m_pParent;
m_Value este un var al struct și m_fValue este definit ca un flotor în interiorul struct.

Orice idee cum să obțineți în jurul valorii de avertizare? (Știu că pot dezactiva avertismentul, dar nu am nici o idee pentru a obține o soluție curată pentru a-l)

My doua qustion ar fi:
Scenariul este aproape la fel , deși, numai cu int. Compiler vorbește despre pierderea de informații: warning: cast from ‘const ClassXY*’ to ‘uint32_t {aka unsigned int}’ loses precision [-fpermissive]
Fără pavilion compilator -fpermissive, eu nu ar fi capabil de a compila ..

inline int ClassXY::GetInt(void) const
{
    return (int)(m_pParent->m_Value.m_nValue ^ (int)this); // compiler warning for this line
}

Și din nou, nici o idee despre cum să se stabilească acest lucru?
Sau este inpossible fara avertismente, ceea ce încerc să realizez?

Pentru a vă oferi toate o idee despre ce este vorba: auto example = g_pClassXY->FindVar(example_var);
Atunci: float float_val = example->fValue; // direct access, value is wrong
Pentru a obține dreptul de valoare, abordarea corectă ar fi:float float_val = example->GetFloat();

Mulțumesc anticipat!

Întrebat 07/11/2018 la 23:52
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
2

Pentru a evita o încălcare strictă aliasing, codul ar putea fi:

static_assert( sizeof(float) <= sizeof(uint32_t), "size problem" );
uint32_t xored{};
memcpy(&xored, &m_pParent->m_Value.m_fValue, sizeof xored);
xored ^= reinterpret_cast<uint32_t>(this);

float ret;
memcpy(&ret, &xored, sizeof ret);
return ret;

Cu toate acestea, există încă unele probleme:

  • Codul este prost format pe un sistem în care thiseste un pointer pe 64 de biți.
  • Valorile float implicate ar putea fi un model de biți invalid float, provocând un comportament nedefinit.

Dacă intenția este de a „cripta“ un flotor, atunci valoarea criptate ar trebui să fie stocate ca uint32_tsau o matrice octet, nu la fel float.

Primul punct de glonț ar putea fi abordate prin generarea unei măști pe 32 de biți aleatoare pentru fiecare exemplu, în loc de a folosi this; sau folosind în uintptr_tloc de uint32_t.

Publicat 08/11/2018 la 00:17
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more