Глюк в Release
Но сегодня вечером ко мне пришёл он - глюк.
Программа просто стала перескакивать часть кода без всяких там готу и условий. И что интересно все обявления переменных как бы обявляются но нельзя просмотреть. Либо например при объявлеие DWORD dwSize=256; говорит что там типа не 256 а 4294967295.
Ниже привожу код который "почти что" работает
CString strPasswd;
editID.GetWindowText(strID);
UserDialog.strID=strID;
editPasswd.GetWindowText(strPasswd);
editPasswd.SetWindowText("");
if (strID.GetLength()!=4) {MessageBox ("Неверно указан формат номера",0,0); return;}
ATL::CCryptMD5Hash md5;
CCryptProv prov;
LPCTSTR pszContainer = NULL; //Пропускает
LPCTSTR pszProvider = MS_DEF_PROV;//Пропускает
DWORD dwProvType = PROV_RSA_FULL;//Пропускает
DWORD dwFlags = CRYPT_VERIFYCONTEXT | CRYPT_SILENT;//Пропускает
HRESULT hr = prov.Initialize(dwProvType, pszContainer,pszProvider, dwFlags);
if (hr == NTE_KEYSET_NOT_DEF) hr = prov.Initialize(dwProvType, pszContainer, pszProvider,dwFlags | CRYPT_NEWKEYSET); //Пропускает
char Hash1st[256]; //Пропускает
DWORD dwSize=256; //Пропускает
dwSize=256;//Пропускает
TRACE("\n%i",dwSize);//Пропускает
int y;//Пропускает
for(y=0;y<255;y++)//Пропускает
{
Hash1st[y]=0; // сюда заходит но выполняет только один раз
}
HRESULT hr2=md5.Initialize(prov,0);
md5.AddString(strPasswd.GetString());
hr2 = md5.GetValue((BYTE*)Hash1st, &dwSize);
md5.Destroy();
prov.Detach();
strPasswd="";
И не смотря на точто пропускает инициализацию переменных Функция prov.Initialize(dwProvType, pszContainer,pszProvider, dwFlags); срабатывает и ошибок не выдает.
При попытке просмотреть содержимое например dwProvType он мне в всплывающей подсказке говорит что "DWORD dwProvType". Без значения переменной.
Пробовал ставить брекпойнты но они либо при запуске программы сползают до первой не пропускаемой строки либо показываются как брекпойнт с вопросиком.
Пробовал всё комментировать, оставлял только цикл и всё равно он выполнялся только один раз так как программа переходила в тело цикла миную for.
Пробовал даже винду переставлять всё равно одно и тоже.
И эти ошибки не только здесь, а в 2 других участках кода и только при компиляции в Release в Debug всё работает хорошо.
В общем я поражен и обескуражен таким поведением программы!
Помогите пожалуйста.
{
Hash1st[y]=0;
}
заменяется на memset(Hash1st, 0, 255), а неиспользуемые переменные удаляются. Такому поведению оптимизатора радоваться надо, а не винду переставлять. Для отладки существует Debug.
Слышал когда-нибудь, что код на C++ можно оптимизировать, дабы ускорить выполнение и уменьшить размер бинарника? Так вот в Release конфигурации именно это и происходит. Например, макрос TRACE не включается в сборку, некоторые переменные помещаются в регистры процессора, код наподобие
{
Hash1st[y]=0;
}
заменяется на memset(Hash1st, 0, 255), а неиспользуемые переменные удаляются. Такому поведению оптимизатора радоваться надо, а не винду переставлять. Для отладки существует Debug.
HarryAxe спасибо тебе за объяснение, а винду я переставил из-за совокупности глюков винды - взбесили они меня, а "глюки" в моей программе были последней каплей.
Но в релизе у меня есть ещё одна не понятная для меня вещь. Я пытаюсь занести в ричэдит цветной текст. В дебаг версии у меня всё хорошо а вот в релизе всё рисуется жирным черным цветом(или вообще не понятно каким стилем).
CHARFORMAT nameFont;
nameFont.cbSize=14;
nameFont.crTextColor=RGB(255,0, 0);
nameFont.yHeight=173;
nameFont.dwEffects=CFE_BOLD;
richMessages.SetWordCharFormat(nameFont);
richMessages.SetSel(richMessages.GetTextLength(),-1);
richMessages.ReplaceSel(MessageText,0);
Но если в самом начале рича поставить например символы перевода строки то весь рич будет обычного шрифта и никакие изменения цвета отображаться не будут.
А это наверное уж точно не оптимизация :)
nameFont.cbSize = sizeof(nameFont);
nameFont.crTextColor=RGB(255,0, 0);
nameFont.yHeight=173;
nameFont.dwEffects=CFE_BOLD;
nameFont.dwMask = CFM_BOLD | CFM_COLOR | CFM_SIZE;
ichMessages.SetWordCharFormat(nameFont);
...
nameFont.cbSize = sizeof(nameFont);
nameFont.crTextColor=RGB(255,0, 0);
nameFont.yHeight=173;
nameFont.dwEffects=CFE_BOLD;
nameFont.dwMask = CFM_BOLD | CFM_COLOR | CFM_SIZE;
ichMessages.SetWordCharFormat(nameFont);
...
Всё получилось :D
Спасибо!
ZeroMemory(&nameFont, sizeof(nameFont));
!!! Обязательно!!! Тогда не будет описанных проблем с дебаг-релизом. Что не так -- сразу проявится. Объявили -- занулили.
nameFont.cbSize = sizeof(nameFont);
И все остальное.