xor'ing wartość pływak i ogólne pytanie dotyczące obsady wyjście kompilatora

głosy
0

Cóż, oba pytania są zainteresowane w kierunku mojego wyjścia opracowującym, ponieważ staram się usunąć wszystkie ostrzeżenia ..

Na pierwsze pytanie :
Mam xor'ing wartości float, wyjście kompilatora: 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 jest wskaźnik do tej klasy ClassXY *m_pParent;
m_Value jest var struct i m_fValue jest zdefiniowane jako pływaka wewnątrz struktury.

Każdy pomysł jak obejść ostrzeżenia? (Wiem, że mogę wyłączyć ostrzeżenie, ale nie mam pojęcia, aby uzyskać czyste rozwiązanie dla niego)

Mój drugi qustion byłoby:
Scenariusz jest prawie taka sama, choć tylko z int. Kompilator mówi o utracie informacji: warning: cast from ‘const ClassXY*’ to ‘uint32_t {aka unsigned int}’ loses precision [-fpermissive]
Bez -fpermissive flag kompilatora, nie byłbym w stanie skompilować ..

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

I znowu jakiś pomysł, jak rozwiązać ten problem?
Czy jest to inpossible bez ostrzeżenia, co staram się osiągnąć?

Aby dać ci wszystko pomysł o co chodzi: auto example = g_pClassXY->FindVar(example_var);
Wtedy: float float_val = example->fValue; // direct access, value is wrong
Aby uzyskać prawo wartości, właściwe podejście byłoby:float float_val = example->GetFloat();

Z góry dziękuję!

Utwórz 07/11/2018 o 23:52
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
2

Aby uniknąć ścisłego naruszenie aliasingu, kod może być:

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;

Jednak nadal istnieją pewne problemy:

  • Kod jest źle ukształtowany na układzie, w którym thisznajduje się wskaźnik 64-bitowy.
  • Wartości pływak zaangażowanych może być nieprawidłowy nieco wzór float, powodując niezdefiniowane zachowanie.

Jeśli zamiarem jest „szyfrowania” pływaka, a następnie szyfrowane wartość powinna być przechowywana jako uint32_tlub tablicy bajtów, a nie float.

Pierwszy punkt kula może być skierowana przez generowania losowego 32-bitową maskę, w każdym przypadku, zamiast stosowania this; lub stosując uintptr_tzamiast uint32_t.

Odpowiedział 08/11/2018 o 00:17
źródło użytkownik

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