У нас есть раздражающая ошибка, которую я не могу объяснить вокруг этого фрагмента кода:
unsigned char bitmap[K_BITMAP_SIZE] = {0} ;
SetBit(bitmap, K_18); // Sets the bit #18 to 1
for(size_t i = 0; i < K_END; ++i)
{
    if(TestBit(bitmap, i)) // true for 18
    {
        size_t i2 = getData(i); // for 18, will return 15
        SetBit(bitmap, i2); // BUG: IS SUPPOSED TO set the bit #15 to 1
    }
}
- Это происходит на Visual С++ 2010
 - Это происходит как на 32-битных, так и на 64-битных строках
 - Это происходит только в версиях Release (с настройкой "Максимизировать скорость (/O2)"
 - Это происходит не только в версиях Release с параметром "Minimize Size (/O1)"
 -  Это происходит на Visual С++ 2008, только если мы 
__forceinlineфункцию getData (по умолчанию VС++ 2008 не встроил эту функцию, а VС++ 2010) - Это происходит на фрагменте кода, приведенном ниже, вероятно, потому, что массивная вставка внутри цикла
 - Этого не происходит, если мы удалим цикл и непосредственно задаем интересное значение (18)
 
Информация о бонусе:
1- BenJ прокомментировал, что проблема не появляется на Visual С++ 2012, то есть это может быть ошибкой в компиляторе
2- Если мы добавим cast в unsigned char в функции Test/Set/ResetBit, ошибка также исчезнет.
size_t TestBit(const unsigned char * bits, size_t pos) { return (((bits)[(pos) >> 3]) &   (1 << (unsigned char)((pos) & 7))) ; }
size_t SetBit(unsigned char * bits, size_t pos)        { return (((bits)[(pos) >> 3]) |=  (1 << (unsigned char)((pos) & 7))) ; }
size_t ResetBit(unsigned char * bits, size_t pos)      { return (((bits)[(pos) >> 3]) &= ~(1 << (unsigned char)((pos) & 7))) ; }
Возникает вопрос:
Случается ли эта ошибка, потому что наш код зависит от поведения undefined, или есть какая-то ошибка в компиляторе VС++ 2010?
Следующий источник является самодостаточным и может быть скомпилирован как таковой на вашем любимом компиляторе:
#include <iostream>
const size_t K_UNKNOWN              = (-1) ;
const size_t K_START                = (0) ;
const size_t K_12                   = (K_START + 12) ;
const size_t K_13                   = (K_START + 13) ;
const size_t K_15                   = (K_START + 15) ;
const size_t K_18                   = (K_START + 18) ;
const size_t K_26                   = (K_START + 26) ;
const size_t K_27                   = (K_START + 27) ;
const size_t K_107                  = (K_START + 107) ;
const size_t K_128                  = (K_START + 128) ;
const size_t K_END                  = (K_START + 208) ;
const size_t K_BITMAP_SIZE          = ((K_END/8) + 1) ;
size_t TestBit(const unsigned char * bits, size_t pos) { return (((bits)[(pos) >> 3]) &   (1 << ((pos) & 7))) ; }
size_t SetBit(unsigned char * bits, size_t pos)        { return (((bits)[(pos) >> 3]) |=  (1 << ((pos) & 7))) ; }
size_t ResetBit(unsigned char * bits, size_t pos)      { return (((bits)[(pos) >> 3]) &= ~(1 << ((pos) & 7))) ; }
size_t getData(size_t p_value)
{
    size_t value = K_UNKNOWN;
    switch(p_value)
    {
        case K_13:      value = K_12;        break;
        case K_18:      value = K_15;        break;
        case K_107:     value = K_15;        break;
        case K_27:      value = K_26;        break;
        case K_128:     value = K_12;        break;
        default:        value = p_value;     break;
    }
    return value;
}
void testBug(const unsigned char * p_bitmap)
{
    const size_t byte = p_bitmap[1] ;
    const size_t bit  = 1 << 7 ;
    const size_t value = byte & bit ;
    if(value == 0)
    {
        std::cout << "ERROR : The bit 15 should NOT be 0" << std::endl ;
    }
    else
    {
        std::cout << "Ok : The bit 15 is 1" << std::endl ;
    }
}
int main(int argc, char * argv[])
{
    unsigned char bitmap[K_BITMAP_SIZE] = {0} ;
    SetBit(bitmap, K_18);
    for(size_t i = 0; i < K_END; ++i)
    {
        if(TestBit(bitmap, i))
        {
            size_t i2 = getData(i);
            SetBit(bitmap, i2);
        }
    }
    testBug(bitmap) ;
    return 0;
}
Некоторая справочная информация: Первоначально:
- Функции Test/Set/ResetBit были макросами.
 - константы определяли
 -  индексы были либо 
long, либоint(в 32-разрядной версии Windows они имеют одинаковый размер) 
Если необходимо, я как можно скорее добавлю несколько дополнительных сведений (например, сгенерированный ассемблер для обеих конфигураций, обновить информацию о том, как g++ обрабатывает проблему).