Lubię mieć ostrzeżenie za darmo dla VS.NET i GCC, i lubię mieć mój 64-bitowy kod gotowy.Przepełnienia w addendach size_t
Dzisiaj napisałem mały moduł, który zajmuje się buforami pamięci i zapewnia dostęp do danych za pośrednictwem interfejsu stylu plików (np. Można czytać bajty, pisać bajty, szukać itd.).
Jako typ danych dla bieżącej pozycji odczytu i rozmiaru użyłem size_t, ponieważ wydaje się to najbardziej naturalnym wyborem. Rozumiem ostrzeżenia i powinno działać również w wersji 64-bitowej.
wszelki wypadek: Moja struktura wygląda następująco:
typedef struct
{
unsigned char * m_Data;
size_t m_CurrentReadPosition;
size_t m_DataSize;
} MyMemoryFile;
uzyskiwany znak size_t
wydaje się nie być zdefiniowane w praktyce. Poszukiwania kodu Google udowodniły to.
Teraz mam dylemat: chcę sprawdzić dodatki z size_t
za przepełnienia, ponieważ mam do czynienia z danymi dostarczonymi przez użytkownika, a biblioteki osób trzecich będą używać mojego kodu. Jednak w przypadku testu przepełnienia muszę znać znak. Wprowadza ogromną różnicę w implementacji.
Więc - jak do cholery powinienem napisać taki kod w sposób niezależny od platformy i kompilatora?
Czy mogę sprawdzić podpisanie size_t
podczas uruchamiania lub kompilacji? To rozwiązałoby mój problem. A może size_t
nie był najlepszym pomysłem.
Wszelkie pomysły?
EDIT: Szukam rozwiązania dla języka C!
jakiej wersji gcc używasz? Wygląda na to, że zrobili size_t unsigned w wersjach po i włączając w to 2.4 –
Wersje, z którymi mam do czynienia, są wszędzie. Zajmuję się programowaniem wbudowanym i czasami muszę używać wersji kompilatora z epoki kamienia. –
"Znaki" to zwykłe słowo. – Lassi