dereferencing pointer ... does break strict-aliasing rules
От: Klirik  
Дата: 14.07.10 01:29
Оценка:
Есть вот такой фрагмент:

template < typename T > void UnalignedWrite ( void * pPtr, const T & tVal )
{
    *(T*)pPtr = tVal;
}

При его компиляции (gcc 4.4.3) всякий раз выскакивает упомянутое в теме топика предупреждение.

Как его победить?

Пробовал вот так:
template < typename T > void UnalignedWrite ( void * pPtr, const T & tVal )
{
    union {
        void *pVoid;
        T *pT;
    } u;

    u.pVoid = pPtr;
    *u.pT = tVal;

}

— не помогает. Выскакивает то же самое предупреждение, но уже на строчку *u.pT = tVal.

Если сделать внутри вот так:
    u.pT = NULL;
    u.pVoid = pPtr;
    *u.pT = tVal;

— ситуация не меняется. Однако если при этом закомментировать вторую строку, вот так:
    u.pT = NULL;
    //u.pVoid = pPtr;
    *u.pT = tVal;

— то предупреждение исчезает (однако очевидно, что и смысла в таком коде нет. Разве что загадить системный лог сегфолтами).

ЗЫ: предупреждение по факту возникает в проекте при инстанциировании шаблона с T = int или uint.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.