Минимальный пример, собирать с дефолтными настройками релиза, т.е. с оптимизацией и с /LTCG
"Hello world" пишется два раза.
__declspec(noinline) void test(size_t s)
{
if (1 > s)
printf("Hello world\n");
}
void zero()
{
test(0);
}
void full()
{
test(1);
}
int main()
{
zero();
full();
}
Это место в libpng:
void PNGAPI
png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
{
png_infop info_ptr = *ptr_ptr;
if (info_ptr == NULL) return;
png_debug(1, "in png_info_init_3");
if (png_sizeof(png_info) > png_info_struct_size) // всегда выполняется в релизе
{
png_destroy_struct(info_ptr); // и вот это нам явно не подходит, если менеджер памяти подменен
info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
*ptr_ptr = info_ptr;
}
/* set everything to 0 */
png_memset(info_ptr, 0, png_sizeof(png_info));
}