Pull to refresh
0
0
silkytail @silkytail

User

Send message
Теоретически, исходное значение не может быть представлено, если размер long меньше, чем значение в size_t, т.е. sizeof(size_t) > sizeof(long). Практически, в этом случае (с учетом того, что отрицательные значения в filelength — уже само по себе странно) значение в size_t никогда не может быть больше, чем, исходное значение в long filelength.

3 If the destination type is signed, the value is unchanged if it can be represented in the destination type (and
bit-field width); otherwise, the value is implementation-defined.
О, я не сразу понял масштаб бедствия.
Вы понимаете, насколько ужасен код, если посторонние люди даже с комментариями, не могут понять, что он должен делать? :)
А в этом случае вас не будут смущать ворнинги типа "преобразование к меньшему типу" в этой строке?

const size_t size = filelength;

Но хорошо, так еще проще.

    const size_t size = filelength;
    if ((long)size != filelength ) {
        return FILE_READ_ERROR;
    }

Вот и всё, намерения кода предельно ясны, и нет никаких предупреждений компилятора (который, кстати, правильно делает, указывая на места с нетривиальным поведением, как на потенциальные источники ошибок).

Но подождите, нужно еще прибавить единичку (оставим в стороне вопрос, зачем это нужно), и костыли, которые раньше неявно учитывали кейс с переполнением, теперь отсутствуют. (А что, если придется прибавить 2, а не 1?)
Придется немного усовершенствовать.

    const size_t size = filelength;
    if ((long)size != filelength || (size + 1) == 0) ) {
        return FILE_READ_ERROR;
    }
Перед выделением памяти стоит проверить, поместится ли требуемый размер в size_t, чтобы избежать труднодиагностируемых логических ошибок при дальшейшей работе.

Корень проблемы тут в том, что программисты пытаются решать совершенно не ту проблему, которую декларируют, от этого код покрывается костылями, граблями и абсурдопедией, подобной выше.

template <typename T1, typename T2>
static bool Fits(T1 &, T2 &)
{
    return sizeof(T1) >= sizeof(T2);
}

const size_t size = filelength;
if( ! Fits(size, filelength) ) {
    return FILE_READ_ERROR;
}
АЙПАД УБИВАЕТ ЛЮДЕЙ!
Кстати да, двадцать первый век на дворе, а винда до сих пор позволяет выволнение кода на страницах без PAGE_EXECUTE, причем на разных виндах это может работать, а может и нет. Ненависть. :)
Как? не прошло и десяти лет, а в миранде появилась мультиаккаунтность, а программисты прочитали книжку про ООП?
нету цифр — нет варенья.
По статистике, проведенной в интернете, 100% населения пользуется интернетом.

Коэффициент безопасности, посчитанный без учета обьема перевозок, времени в воздухе, и числа рейсов — это цифра, лишенная смысла.
Насколько я вижу, статистика собрана с 2006 года, и вообще неправильно посчитана.
Сотня профанов в авиации, обсуждает слухи, пущенные профанами для профанов.
все рыдают и рвут на себе волосы!
я думаю, что в этом есть что-то подозрительное, если вас радует то, что на самом деле отвратительно.
+1, многабукф
интерфейс создания фильтров конечно же поражает своими возмжностями :)
ok, следующий вопрос - как сделать так, чтобы полученное и прочитанное через веб письмо не исчезало из инбокса доступного по pop3?
Расскажите-ка, как в самом удобном интерфейсе автоматически раскладывать письма по папочкам?
Эт вообще-то турбины
Откройте для себя ImpRec - чтобы не фиксить импорт руками
Фонарик! купите фонарик :)
Вы запишите на бумажке, как вас зовут, и приклейте на монитор. Сэкономите 2 секунды и мысли :)

Information

Rating
Does not participate
Location
Киевская обл., Украина
Registered
Activity