xor'ing float hodnoty a obecně cast otázka týkající kompilátor výstup

hlasů
0

No, obě otázky se týká k mé kompilaci výstup, protože jsem se snaží odstranit všechna varování ..

K první otázce :
Jsem xor'ing float hodnot, kompilátor výstup: 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 je ukazatel na této třídy ClassXY *m_pParent;
m_Value je var o struct a m_fValue je definován jako plovák uvnitř Struct.

Nějaký nápad, jak se dostat kolem varování? (Já vím, že mohu vypnout varování, ale nemám ponětí, jak získat čistý roztok k němu)

Můj druhý qustion bude vypadat následovně:
Scénář je téměř stejný i když jen s int. Kompilátor mluví o ztrátě dat: warning: cast from ‘const ClassXY*’ to ‘uint32_t {aka unsigned int}’ loses precision [-fpermissive]
Bez -fpermissive překladačů vlajky, nebyl bych schopen sestavit ..

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

A opět, nějakou představu o tom, jak to opravit?
Nebo je to inpossible bez varování, co se snažím dosáhnout?

Chcete-li vám veškerou představu, co je to asi: auto example = g_pClassXY->FindVar(example_var);
A: float float_val = example->fValue; // direct access, value is wrong
Chcete-li získat hodnotu právo, právo přístupu by bylo:float float_val = example->GetFloat();

Díky předem!

Položena 07/11/2018 v 23:52
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Aby se zabránilo přísné porušení aliasing, kód může být:

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;

Nicméně stále existují některé problémy:

  • Kód je špatně vytvořený na systému, v němž thisje 64-bit ukazatel.
  • Hodnoty float zapojené může být neplatný bit vzorem pro float, což způsobuje nedefinované chování.

Pokud je váš záměr je „šifrování“ float, pak šifrovaná hodnota by měla být uložena jako uint32_tnebo bytového pole, nikoli jako float.

První odrážka by mohly být řešeny generování náhodného 32-bitovou masku pro každou instanci, místo použití this; nebo s použitím uintptr_tmísto uint32_t.

Odpovězeno 08/11/2018 v 00:17
zdroj uživatelem

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