Ошибка при вызове фукции realloc

Тема в разделе "LANGS.C", создана пользователем MegaDwarf, 26 июн 2007.

  1. MegaDwarf

    MegaDwarf New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    11
    Пишу прогу в VS2005. При вызове одного из многочисленных realloc'ов меня выкидываeт в файл realloc.c (в функцию _realloc_base) с ошибкой "Heap block at 008B2EB8 modified at 008B2ECC past requested size of c". Не понимаю, за что? Если не хватает памяти почему тогда NULL не возвращает?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    сорс в студею
     
  3. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    MegaDwarf
    Эта ошибка означает, что ты модифицировал память за пределами выделенного блока - где-то "вылез" за пределы буфера.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    maxdiver

    Ну блиииин!!! Зачем спугнул? Щас бы над сорцами постустались! :))))))
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    MegaDwarf
    Стало быть, лучше просто вернуть 0, чем человеческим недоязыком обьяснить в чём ошибка?
     
  6. MegaDwarf

    MegaDwarf New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    11
    я гляжу вы тут с юмором :)
    Все дело в том, что исходников довольно много и я не хотел бы никого так напрягать. Ибо копаться в чужих исходниках не есть благодарное дело.
    Если realloc заменить на несколько идентичных строк с malloc'ом, memcpy и free, то тогда ошибка будет на free. А если free вообще не вызывать (т.е. просто забивать на старую не нужную выделенную память), то ошибки не будет. Почему тогда в этом случае он не может распознать, что я якобы "вылез" за пределы буфера?
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Т.к. писать за пределы выделенного буфера можно. Там, насколько я знаю (хотя возможно и не прав) стоят контрольные байты. У меня была похожая проблема с HeapRealloc. Как только я избавился от переполнения, она (ф-я) тут же стала работать нормально.
     
  8. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    MegaDwarf
    Ну так free и realloc проверяют целостность кучи, а именно того блока памяти, указатель на который ты им передаёшь.
    Естественно, если не вызывать ни ту, ни другую функцию, то никакой ошибки не будет - просто никакие проверки не будут сделаны.
     
  9. MegaDwarf

    MegaDwarf New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    11
    Ладно, всем большое спасибо, буду копать
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Лучше на время отладки переписать аллокатор, чтобы буфера веделялись на границах страниц и любые обращения за буфер будут уже на недействительной странице - любое переполнение кучи ловится на ура.
    Я себе такой уже состряпал, оч удобно.

    В отладочной версии так точно есть, насколько я помню и в "релиз" тоже.

    + Теперь еще (начиная с 7 студии) мелкомягкие накрутили всяких финтов для отловки переполнений стека - всякие там __security_check_cookie и все такое. Иногда тоже помогает.
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Great
    От кривых рук ничего не спасёт. В последнее время, копаясь в документации к исходникам, часто попадаются примерно такие рекомендации: "чтобы прога не падала, отключите в опциях компилятора проверки целостности стека, кучи и т.д." :)