Как правильно проверить, что значение off_t не будет переполняться при преобразовании в size_t в C? - PullRequest
2 голосов
/ 14 июля 2020

Мне нужно преобразовать переменную off_t в переменную size_t, и я хочу определить, может ли произойти переполнение. В C.

Мои начальные попытки выглядят так:

off_t fsize;
size_t len;

...

if(fsize >= 0 && fsize <= SIZE_MAX) {
   len = (size_t)fsize;
} else {
   abort();
}

Однако компилятору не нравится мое сравнение между знаковыми и беззнаковыми типами (fsize <= SIZE_MAX). Я также не могу делать предположений о соответствующих размерах типов off_t и size_t. </p>

1 Ответ

4 голосов
/ 14 июля 2020

Я также не могу делать предположений относительно соответствующих размеров типов off_t и size_t.

Чтобы сравнить смешанные типы со знаком, чьи сопоставимые диапазоны четко не связаны, приведите к uintmax_t.

Как только код узнает, что signed fsize >= 0 истинно, приведение к широкому типу unsigned , например uintmax_t, определенно не сузит значение fsize и не заглушит предупреждение.

if (fsize >= 0 && (uintmax_t) fsize <= SIZE_MAX) {

Если приведение к uintmax_t слишком велико, я бы ожидал, что компилятор по-прежнему будет генерировать эффективный код.

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