Вопрос про инициализацию локальных

Тема в разделе "LANGS.C", создана пользователем intel_x128, 23 май 2011.

  1. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Всем привет
    Скажите, реально ли сделать так, чтобы во всех функциях все переменные инициализировались в 0 автоматом?

    Что я имею ввиду:

    Код (Text):
    1. void SomeFunc(char* p1, char* p2, int x)
    2. {
    3. int a, b, c, d;
    4. char szVal[256];
    5. bool n;
    6. // .. some code
    7. return;
    8. };
    чтобы в самом начале функции после открытия фрейма (push ebp / mov ebp,esp / sub esp, __LOCAL_SIZE) вставлялся вот такой код:

    Код (Text):
    1. _asm
    2. {
    3. pushad
    4. xor eax, eax
    5. mov edi, esp
    6. mov ecx, __LOCAL_SIZE
    7. shr ecx, 2
    8. rep stosd
    9. popad
    10. };
    Ну или memset тоже сойдет

    В общем смысл в том, чтобы в каждой функции ВСЕ локальные переменные были выставлены в 0 и их не нужно было б каждый раз инициализировать вручную.
    Реально ли это сделать?
     
  2. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    А откуда такая задача взялась? Вроде ж практически невозможно использовать автоматические переменные, забыв их проинициализировать, и при этом не получить ворчание от компилятора.
     
  3. not1

    not1 Member

    Публикаций:
    0
    Регистрация:
    6 окт 2009
    Сообщения:
    137
    имхо из средств языка сделать такое нельзя, попробуйте в компиляторе полазить...
     
  4. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Можно частично попроще - компилировать не сразу в obj, а в asm. Полученный asm-файл наверное можно будет автоматом перерабатывать, вроде все функции СИ-компилятор должен будет в нормально оформленные PROC сделать, описав все автоматические переменные в начале proc через local.
     
  5. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
  6. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    можно формировать заголовки или вызывать заголовочные функции, в зависимости от компилятора. обычно, локальные переменные находятся в стеке.
    но не все так просто. большие буфера могут быть созданы через маллок, переменные-классы будут созданы через маллок. кроме того, переменные из внутренних локальных областей видимости будут создаваться на одно и тоже место по мере необходимости.
    потому, таки лучше присваивать начальные значения вручную. тем и хорош С, что у него минимум самодеятельности. только немного больше чем в асме.
     
  7. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Еще вариант - подкорректировать простой си компилятор из свободно распространяемых, например cc386 (его автору это будет интересно)
     
  8. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    А если сделать зачистку локальных переменных до вызова?
    Правда тогда нужно будет вызвать две функции подряд.
    1. Делает зачистку (нужно передать размер всех локальных переменных, узнать его "ГЕММОР") тогда тереть с запасом.
    2. Вызываем нужную на функцию, стек на перед весь потертый, "heppy".
     
  9. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    а чем вас не устраивает такой вариант?
    Код (Text):
    1. void SomeFunc(){
    2.       char szVal[256]={0}; //весь массив будет 0
    3. }