Всем привет Скажите, реально ли сделать так, чтобы во всех функциях все переменные инициализировались в 0 автоматом? Что я имею ввиду: Код (Text): void SomeFunc(char* p1, char* p2, int x) { int a, b, c, d; char szVal[256]; bool n; // .. some code return; }; чтобы в самом начале функции после открытия фрейма (push ebp / mov ebp,esp / sub esp, __LOCAL_SIZE) вставлялся вот такой код: Код (Text): _asm { pushad xor eax, eax mov edi, esp mov ecx, __LOCAL_SIZE shr ecx, 2 rep stosd popad }; Ну или memset тоже сойдет В общем смысл в том, чтобы в каждой функции ВСЕ локальные переменные были выставлены в 0 и их не нужно было б каждый раз инициализировать вручную. Реально ли это сделать?
А откуда такая задача взялась? Вроде ж практически невозможно использовать автоматические переменные, забыв их проинициализировать, и при этом не получить ворчание от компилятора.
Можно частично попроще - компилировать не сразу в obj, а в asm. Полученный asm-файл наверное можно будет автоматом перерабатывать, вроде все функции СИ-компилятор должен будет в нормально оформленные PROC сделать, описав все автоматические переменные в начале proc через local.
можно формировать заголовки или вызывать заголовочные функции, в зависимости от компилятора. обычно, локальные переменные находятся в стеке. но не все так просто. большие буфера могут быть созданы через маллок, переменные-классы будут созданы через маллок. кроме того, переменные из внутренних локальных областей видимости будут создаваться на одно и тоже место по мере необходимости. потому, таки лучше присваивать начальные значения вручную. тем и хорош С, что у него минимум самодеятельности. только немного больше чем в асме.
Еще вариант - подкорректировать простой си компилятор из свободно распространяемых, например cc386 (его автору это будет интересно)
А если сделать зачистку локальных переменных до вызова? Правда тогда нужно будет вызвать две функции подряд. 1. Делает зачистку (нужно передать размер всех локальных переменных, узнать его "ГЕММОР") тогда тереть с запасом. 2. Вызываем нужную на функцию, стек на перед весь потертый, "heppy".
а чем вас не устраивает такой вариант? Код (Text): void SomeFunc(){ char szVal[256]={0}; //весь массив будет 0 }