Visual Studio compiler bug? (char <= '|')
От: Caracrist https://1pwd.org/
Дата: 14.08.11 18:20
Оценка:
смотреть выделенное

         for (char * cur = (char *)Buffer;cur < (char *)(Buffer+bufferSize); cur++)
         {
             if (instr){
...
                 }
             } else {
0000000180004F93  jmp         FindMemStringSize+16Ch (180004FBCh) 
                 if ((*cur >= ' ') && (*cur <= '¦')){
0000000180004F95  mov         rax,qword ptr [cur] 
0000000180004F9A  movsx       eax,byte ptr [rax] 
0000000180004F9D  cmp         eax,20h 
0000000180004FA0  jl          FindMemStringSize+16Ch (180004FBCh) 
0000000180004FA2  mov         rax,qword ptr [cur] 
0000000180004FA7  movsx       eax,byte ptr [rax] 
0000000180004FAA  cmp         eax,0FFFFFFA6h 
0000000180004FAD  jg          FindMemStringSize+16Ch (180004FBCh) 
                     size = 1;
0000000180004FAF  mov         dword ptr [size],1 
                     instr = true;
0000000180004FB7  mov         byte ptr [rsp+20h],1 
                 }
             }
         }

откуда он взял 0FFFFFFA6h???
~~~~~
~lol~~
~~~ Single Password Solution
Re: Visual Studio compiler bug? (char <= '|')
От: K13 http://akvis.com
Дата: 14.08.11 18:27
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>откуда он взял 0FFFFFFA6h???


знаковое 8-битное значение развернуто до int.
Re[2]: Visual Studio compiler bug? (char <= '|')
От: Libsdebs  
Дата: 14.08.11 19:27
Оценка: +1 :)
C>>откуда он взял 0FFFFFFA6h???
K13>знаковое 8-битное значение развернуто до int.

просто дополнение:
http://www.intel.com/Assets/PDF/manual/325383.pdf
MOVSX, стр 802. Move word to doubleword, with sign-extension.

P.S. часто новичок считает что скорее компилятор ошибётся чем он сам (не конечно иногда компилятор ошибается, я например видел такой баг в VS2010 + SSE — но это очень очень редко). Например часто в надежде исправить bug-case, пересобирают проект по десять раз и т.п.
Re[3]: Visual Studio compiler bug? (char <= '|')
От: Libsdebs  
Дата: 14.08.11 19:28
Оценка:
L>MOVSX, стр 802. Move word to doubleword, with sign-extension.
точнее для этого конкретного примера — Move byte to doubleword with sign-extension
Re: Visual Studio compiler bug? (char <= '|')
От: icWasya  
Дата: 15.08.11 05:55
Оценка:
Здравствуйте, Caracrist, Вы писали:
...
C>откуда он взял 0FFFFFFA6h???

Это ещё не баг.
Компилятор может уточнить, то одно и тоже число никогда не может быть
одновременно больше 32 и меньше -90
и при оптимизации выкинет и проверку и последующие присваивания size = 1; instr = true;
И ищи потом, почему это произошло.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.