Как защититься от недопустимой операции при попытке получить значение с плавающей запятой из нетипизированного буфера? - PullRequest
0 голосов
/ 25 октября 2011

Рассмотрим нетипизированный буфер, void*, из которого я беру несколько байтов, чтобы рассматривать их как значение с плавающей запятой, float или double.Давайте предположим, что значения с плавающей запятой совместимы с IEEE-754 на моей машине.Таким образом, может быть двоичная последовательность из буфера, которая не представляет никакого допустимого значения с плавающей точкой.Попытка работать с такой переменной с плавающей точкой, заполненной недопустимым двоичным файлом, приведет к ошибке программы.

Как я могу защититься от прерывания программы в таком случае - то есть, как я могу получить информацию о недопустимом двоичном файле в переменной с плавающей запятой?

ps Каков правильный способизвлечь с плавающей точкой из нетипизированного буфера?Я слышал, что трюк с наложением объединения типа

void* buf;  
union U {int i; float f;};  
U *u = (U*) buf;  
u->i = binvalue;  
fpvalue = u->f;`

недействителен, даже если buf правильно выровнен.

1 Ответ

0 голосов
/ 25 октября 2011

Одна из проблем заключается в том, что во многих системах float должен быть выровнен (например, по адресу, кратному 4 байтам), тогда как совершенно произвольный указатель может быть не выровнен (и указатель может даже указывать на не отображенный адрес,например, если он близок к NULL).

Другая проблема заключается в том, что плавающие значения IEEE 754 действительно определяют передачу сигналов, а не число-s и так далее.Возможно, может помочь проверка значений с плавающей запятой с помощью isnan или isinf.

Наконец, стандарт IEEE 754 настолько сложен, что не каждая система полностью его реализует.Возможно, вам придется написать очень непереносимый код, если вы хотите быть отказоустойчивым.Хотя в прошлом я читал этот стандарт, я также забыл ужасные подробности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...