Столкнулся с интересной фичей/багом. В следующем примере кода цикл не выполняется из-за того, что случайно объявил переменную константной.
windows, mingw, gcc 4.9.2
#include <iostream>
#include <cassert>
// замена реальной ф-ции для примера,только для целыхint readRawData(char* buffer, size_t size)
{
assert(size == 4);
*((int*)buffer) = 10;
return 4;
}
int main(int argc, char *argv[])
{
int const blockCount = 0; // если const, то цикл ниже не выполняется. если убрать const, все норм
//stream.readRawData((char*)&blockCount, sizeof(blockCount)) // реальная ф-ция
readRawData((char*)&blockCount, sizeof(blockCount)); // замена для примераfor(int i = 0; i < blockCount; ++i) // в отладчике blockCount = 10, но цикл не выполняется, он выкинут при компиляции
std::cout << i << " "; // здесь должно печататься 0 1 2 3 ... 9 но не печатается ))
std::cout << std::endl;
return 0;
}
Здравствуйте, prog123, Вы писали:
P>Столкнулся с интересной фичей/багом.
Ну да, в твоём коде баг (не назвал бы его правда интересным).
А чтобы отлавливать такие ошибки на этапе компиляции придумали reinterpret_cast:
Здравствуйте, prog123, Вы писали:
P>Столкнулся с интересной фичей/багом. В следующем примере кода цикл не выполняется из-за того, что случайно объявил переменную константной. P>windows, mingw, gcc 4.9.2
С компилятора взятки гладки.Ты ж сам обещал, что не будешь менять счетчик, написав const, и поменял. Он вполне в этом месте constant propagation использовать вправе.
Вот то ли дело в древних FORTRAN'ах... Там даже литеральные константы хранились в ячейках памяти, и если такую ячейку изменить, то все 2-ки в программе могли внезапно стать 3-ками, например
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Вот то ли дело в древних FORTRAN'ах... Там даже литеральные константы хранились в ячейках памяти, и если такую ячейку изменить, то все 2-ки в программе могли внезапно стать 3-ками, например
В новых, слышал, тоже можно. Правда, на современных ОС валиться при выполнении будет.
Здравствуйте, prog123, Вы писали:
P>Столкнулся с интересной фичей/багом. В следующем примере кода цикл не выполняется из-за того, что случайно объявил переменную константной.
Подозреваю, что если вынести blockCount в глобальный скоуп, то в "неоптимизированном" коде можно огрести от memory protection — глобальные константы кладутся в read-only секции.
В общем, код — хороший пример того, как делать можно, но не нужно