Инициализация локальной переменной
От: Аноним  
Дата: 20.10.05 11:18
Оценка:
вот простая программа, в ней, понятно, вылетает exception
как система определяет что переменная a не инициализирована?

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int a;
a++;
return 0;
}
Re: Инициализация локальной переменной
От: Bell Россия  
Дата: 20.10.05 11:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>вот простая программа, в ней, понятно, вылетает exception

А>как система определяет что переменная a не инициализирована?

Посмотри сгенерированный код
Любите книгу — источник знаний (с) М.Горький
Re[2]: Инициализация локальной переменной
От: Аноним  
Дата: 20.10.05 12:00
Оценка:
Здравствуйте, Bell, Вы писали:

B>Посмотри сгенерированный код


Спасибо, посмотрел, что получается компилятор знает о том, что нельзя ее использовать уже на этапе трансляции. Тк просто втавлена команда вызова процедуры обработчика использования неинициализированной переменной (__RTC_UninitUse). Почему не выдается варнинг или лучше ошибка, как, например, компилятором C#

int a;
a++;
00412BE5  cmp         byte ptr [ebp-0D1h],0 
00412BEC  jne         main+3Bh (412BFBh) 
00412BEE  push        412C21h 
00412BF3  call        @ILT+545(__RTC_UninitUse) (411226h) 
00412BF8  add         esp,4 
00412BFB  mov         eax,dword ptr [a] 
00412BFE  add         eax,1 
00412C01  mov         byte ptr [ebp-0D1h],1 
00412C08  mov         dword ptr [a],eax
Re: Инициализация локальной переменной
От: SWW Россия  
Дата: 20.10.05 12:29
Оценка:
А>int _tmain(int argc, _TCHAR* argv[])
А>{
А> int a;
А> a++;
А> return 0;
А>}

А>вот простая программа, в ней, понятно, вылетает exception

А>как система определяет что переменная a не инициализирована?

А почему понятно? Мне, например, совершенно непонятно почему вылетает исключение. Я иногда использую неинициализированные переменные например для прореживания каких-то действий:
if(++a % 8 == 0)
    DoSomeAction();

Ясно, что здесь совершенно не важно, с какого начального значения начнется инкремент. И если компилятор будет в таких случаях считать, что он умнее меня, я выкину его нахрен.
Re[3]: Инициализация локальной переменной
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 20.10.05 13:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Bell, Вы писали:


B>>Посмотри сгенерированный код


А>Спасибо, посмотрел, что получается компилятор знает о том, что нельзя ее использовать уже на этапе трансляции. Тк просто втавлена команда вызова процедуры обработчика использования неинициализированной переменной (__RTC_UninitUse). Почему не выдается варнинг или лучше ошибка, как, например, компилятором C#


чтобы ошибок этих не было, используй SRC: auto_value<>
Автор: Кодт
Дата: 16.01.03
"Что не завершено, не сделано вовсе" Гаусс
Re[2]: Инициализация локальной переменной
От: _Winnie Россия C++.freerun
Дата: 20.10.05 13:47
Оценка: :)
Здравствуйте, SWW, Вы писали:

SWW>А почему понятно? Мне, например, совершенно непонятно почему вылетает исключение. Я иногда использую неинициализированные переменные например для прореживания каких-то действий:

SWW>
SWW>if(++a % 8 == 0)
SWW>    DoSomeAction();
SWW>

SWW>Ясно, что здесь совершенно не важно, с какого начального значения начнется инкремент. И если компилятор будет в таких случаях считать, что он умнее меня, я выкину его нахрен.

Выкидывай С++ целиком. Это Undefined Behavior. Формально, там может лежать некоторое невалидное значение, для которого операция ++ не даст того, что ты хочешь. Пример из моей практики — неинициализированный bool — это такое его значение, что (to_be) || (!to_be) было равно false! Так что и ++ может сработать не так, как ты ожидаешь. И одно из его UB — это отладочные сообщения. Вполне себе практичное, полезное и не из области сфероконей. А что если через 10 лет все компиляторы введут такую проверку? Имеют ведь право. Уйдешь в ASM?
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Инициализация локальной переменной
От: _Winnie Россия C++.freerun
Дата: 20.10.05 13:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>вот простая программа, в ней, понятно, вылетает exception

А>как система определяет что переменная a не инициализирована?

Попробуй посмотреть в ASM это —

volatile x = false;

А>int _tmain(int argc, _TCHAR* argv[])
А>{
А>    int a;
        if (x)
           a = 1;
А>    a++;
А>    return 0;
А>}


Или введи значение x с клавиатуры.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: Инициализация локальной переменной
От: _Winnie Россия C++.freerun
Дата: 20.10.05 13:51
Оценка:
Здравствуйте, _Winnie, Вы писали:


SWW>>А почему понятно? Мне, например, совершенно непонятно почему вылетает исключение. Я иногда использую неинициализированные переменные например для прореживания каких-то действий:

SWW>>
SWW>>if(++a % 8 == 0)
SWW>>    DoSomeAction();
SWW>>


PS. если a — статическая или глобальная переменная, то все ok.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: Инициализация локальной переменной
От: Аноним  
Дата: 20.10.05 14:32
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Попробуй посмотреть в ASM это — ......


Спасибо, теперь ясно.
Re[3]: Инициализация локальной переменной
От: gear nuke  
Дата: 20.10.05 16:44
Оценка:
Здравствуйте, Аноним, Вы писали:

Почему не выдается варнинг или лучше ошибка, как, например, компилятором C#

Потому что компилятор от MS такой .
Есть и другие, например Intel пишет:
test.cpp(4): warning #592: variable "a" is used before its value is set
      a++;
      ^
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Инициализация локальной переменной
От: _Winnie Россия C++.freerun
Дата: 20.10.05 16:52
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Аноним, Вы писали:


GN>Почему не выдается варнинг или лучше ошибка, как, например, компилятором C#


GN>Потому что компилятор от MS такой .


Ну уж не надо его так обижать


warning C4700: local variable 'a' used without having been initialized


level 1, однако.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[4]: Инициализация локальной переменной
От: Erop Россия  
Дата: 20.10.05 18:38
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Потому что компилятор от MS такой .


Ну уж не надо вот обижать VS. Компилятор там далеко не самый плохой. И warning у него такой есть и выдаёт его хорошо.
Скорее всего в какой-нибудь библиотеке используемой в проекте этот warning давят в хедерах. MFC, скажем, таким славится
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Инициализация локальной переменной
От: gear nuke  
Дата: 20.10.05 18:38
Оценка:
Здравствуйте, _Winnie,

А>>>Почему не выдается варнинг или лучше ошибка, как, например, компилятором C#


GN>>Потому что компилятор от MS такой .


_W>Ну уж не надо его так обижать

_W>
_W>warning C4700: local variable 'a' used without having been initialized

_W>level 1, однако.

Похоже, дело действительно в level !

Under /clr:safe this is a level 4 warning.


Видимо, код компилировался автором как managed.
Ну а я взял и поверил на слово, что msvc не ругается
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Инициализация локальной переменной
От: gear nuke  
Дата: 20.10.05 18:54
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну уж не надо вот обижать VS. Компилятор там далеко не самый плохой. И warning у него такой есть и выдаёт его хорошо.


Ага, уже понял. Давно не видел и забыл

E>Скорее всего в какой-нибудь библиотеке используемой в проекте этот warning давят в хедерах. MFC, скажем, таким славится


В atlmfc (из 2005) не нашёл. Нашёл только в valarray, но там же есть warning push\pop. Видимо, дело в /clr:safe
Автор: gear nuke
Дата: 20.10.05
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Инициализация локальной переменной
От: SWW Россия  
Дата: 21.10.05 04:37
Оценка:
SWW>>>А почему понятно? Мне, например, совершенно непонятно почему вылетает исключение. Я иногда использую неинициализированные переменные например для прореживания каких-то действий:
SWW>>>
SWW>>>if(++a % 8 == 0)
SWW>>>    DoSomeAction();
SWW>>>


_W>PS. если a — статическая или глобальная переменная, то все ok.


Потому что они инициализируются по умолчанию? Это понятно, но иногда я делаю такой счетчик членом класса. Я полагаю, для нее слелать при компиляции проверку на неинициализированность также сложно. И компилятор, кстати, на члены класса не выдает варнинг если он не инициализирован.
Re[4]: Инициализация локальной переменной
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 21.10.05 10:37
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>чтобы ошибок этих не было, используй SRC: auto_value<>
Автор: Кодт
Дата: 16.01.03

или boost::value_initialized
Re[4]: Инициализация локальной переменной
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 21.10.05 10:41
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Здравствуйте, _Winnie, Вы писали:



SWW>>>А почему понятно? Мне, например, совершенно непонятно почему вылетает исключение. Я иногда использую неинициализированные переменные например для прореживания каких-то действий:

SWW>>>
SWW>>>if(++a % 8 == 0)
SWW>>>    DoSomeAction();
SWW>>>


_W>PS. если a — статическая или глобальная переменная, то все ok.


тогда (а) она все-таки инициализируется, хоть и один раз за время жизни программы и (б) многопоточность.
Re: Инициализация локальной переменной
От: Andrei Gorlov  
Дата: 24.10.05 05:32
Оценка:
??>>вот простая программа, в ней, понятно, вылетает exception
??>>как система определяет что переменная a не инициализирована?
??>>#include "stdafx.h"
??>>int _tmain(int argc, _TCHAR* argv[])
??>>{
??>>int a;
??>>a++;
??>>return 0;
??>>}

Убери в настройках проекта /RTCu.
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.