Почему выделяется память?

Тема в разделе "LANGS.C", создана пользователем cupuyc, 11 янв 2011.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    ну все так, как и должно быть... что любопытного то?

    ну как бы ваша программа никак не может себя защитить от вас же))
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    cupuyc
    О том и речь, оптимизация.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну malloc(0) возвращает валидные указатели каждый раз на пустые блоки
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это не гарантируется.

    С99, 7.20.3

    If the size of the space requested is zero, the behavior is implementationdefined:
    either a null pointer is returned, or the behavior is as if the size were some
    nonzero value, except that the returned pointer shall not be used to access an object.

    Так что даже если вернётся валидный указатель - его нельзя использовать для доступа к объекту.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну это и не важно.

    size_t size = 0;
    void *p, *p2;
    p2 = malloc (size);
    memcpy (p2, p, size);
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Great
    Одно дело размер памяти, а другое размер объекта.
     
  7. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    плоские си рулят - там вообще пустую структуру нельзя объявить ;')
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    ну это в принципе естественно (хотя во многих реализациях CRT есть проверка на нулевой размер), поскольку, если верить MSDN:
    то есть, запросили 0 байт - получили 0 байт)))

    ну как не важно?. ваш пример немного некорректен... скажите, что будет в таком случае:
    Код (Text):
    1. char* ptr = malloc(0);
    2. ptr[0] = '\0';
    эксесвайолейтинг?)))

    ЗЫ стоит еще вспомнить realloc после malloc(0), realloc на ноль после ненулевого malloc и free(NULL)
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Зависит от имплементации. Но в любом случае конструкция некорректна.
     
  10. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Rel
    А при чём здесь моя программа? Я виноват, что студия и гсс коряво шаблоны парсят?
     
  11. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    cupuyc
    VC++ 2010 выдаёт внятную ошибку:
     
  12. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    green у меня 2008-я. Ладно хоть один косяк в 2010-й поправили.
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    вы виноваты в том, что решаете такую задачу через шаблоны... именно поэтому в макросах и нет рекурсии как таковой, в бусте ее сделали фиксированную до 256ого включения 256тью макросами... программа не защищена от ее автора, авторы транслятора тоже не могут предположить всех дурацких вариантов кода...
     
  14. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Вы знаете такое понятие "пример"? Если не можешь распарсить шаблоны - выдай соответствующее сообщение, а не кидай эксепшн.
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    обратитесь по нулевому адресу - тоже будет эксепшн... и никто вам не будет сообщение при компиляции выдавать... какие претензии могут быть к языку или транслятору... я еще раз говорю, авторы трансляторов не виноваты, что программисты пишут xepню... вообще у вас странные вопросы... я думаю, что язык D вам не подойдет... займитесь лучше Руби или Питоном... там у вас меньше вопросов будет возникать...
     
  16. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Rel, с Вами всё в порядке? По вашему нормальная программа должна упасть если ей на вход подаются косячные данные? Как я в компиляторе могу обратиться по нулевому адресу? Такое ощущение, что мы в Вами говорим о разных вещах. Ещё раз: компилирую кусок кода [..]. Компилятор вместо того, чтобы выдать ошибку компиляции кидает необработанный эксепшн, вылазит окошко "приложение cl.exe выполнило недопустимую операцию и будет закрыто.. отправить отчёт?" Гсс при компиляции этого же куска зацикливается. По Вашему это нормальное поведение?
     
  17. rat4

    rat4 Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    30
    GCC 4.5.2 полёт нормальный.
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    да...

    благодаря этому и существует тонна самых разнообразных эксплойтов...

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

    да вполне... вы фактически вывели констатное выражение своим примером... компилятор был достаточно грамотен, чтобы это понять... так что вместо того, чтобы генерировать лишний код, он попытался просчитать ваш код и привести его к константе... но поскольку вы так небрежно глубоко изобразили рекурсию в шаблонах, он упал... отчего - это уже другой разговор, скорее всего переполнил что-нибудь... когда весьма грамотные, но все же люди предумывали язык и писали компилятор они не могли предположить всех глупостей, которые могут понаписать программисты... и кстати поздравляю, вы возможно придумали эксплойт для cl.exe ниже определенной версии, осталось понять как его использовать и нужно ли это вообще)))
     
  19. _DEN_

    _DEN_ DEN

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

    Сириус прав - компилятор не должен падать на компайлтайме. Должен выдавать ошибку.
     
  20. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    rat4, у меня Code::Blocks 10.05.