31/12 17:48
AldoBaldo
Ah, questa è proprio una domandona che voglio porre qui!
Nel tentativo di "isolare" le chiamate a winapi32 che si occupano di rilevare il tempo dal sistema, così da poter usare il tipo standard uint64_t invece del tipo proprietario di Windows FILETIME, sto mettendo insieme una mini-libreria statica da usare nei miei programmini.
Una delle funzioni è questa, che dovrebbe convertire una quantità di nanosecondi che esprime il tempo locale nella quantità di nanosecondi che esprime il tempo UTC equivalente:
uint64_t converti_nanosecondi_in_nanosecondi_UTC( uint64_t ns ) {
FILETIME lft = *((FILETIME*)&ns);
FILETIME ft = {0};
if( LocalFileTimeToFileTime(&lft,&ft) )
return *((uint64_t*)&ft);
return NANOSECONDI_NON_VALIDI;
}
Ottengo un warning che dice: "dereferencing type-punned pointer will break strict-aliasing rules".
Ho fatto un po' di ricerche e credo di aver capito che si corre il rischio di generare comportamenti indefiniti conseguenti a un trattamento inaffidabile dei registri.
Ora, ho riscritto la funzione in quest'altro modo:
uint64_t converti_nanosecondi_in_nanosecondi_UTC( uint64_t ns ) {
uint64_t ft = 0;
if( LocalFileTimeToFileTime((void*)&ns,(void*)&ft) )
return ft;
return NANOSECONDI_NON_VALIDI;
}
Con questa nuova formulazione il warning non mi viene più presentato, ma ho come la sensazione che la sostanza del "gioco" di puntatori non cambi, ripresentando lo stesso potenziale problema di prima, anche se "invisibile" al compilatore.
Che mi dite?
Per la cronaca: SYSTEMTIME è una struttura costituita da due DWORD, quindi
dovrebbe occupare 64 bit.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.