‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

Слишком умная оптимизация.

Столкнулся с тем, что дебажная версия работает безукоризненно, а релизная - падает, причём там, где уже всё давно отлажено (казалось бы).
Выяснил, где именно падает, по кускам начал отключать код, ведущий к этому месту и выяснил неожиданное.
Оказалось, что компилятор вдруг решил, что три разныъ вызова одной функции с тремя разными аргументами можно заменить на три вызова этой функции с одним и тем же аргументом, причём не разнеся их по моментам, когда алгоритм обращается к результатам вызова, а почему-то скучковав их вокруг второго (не первого, не последнего). То есть, упрощённо говоря,

for (i=0; i<3; i++)
{
foo(i);
}

превратилось в

foo(2);
foo(2);
foo(2);


Ситуация, конечно, несколько сложнее (там вывод значения символов, находящихся в списке), но менее удивительной она от этого не становится.

Копаю дальше.

Upd: победил, вроде. Лёгкий ореол загадочности всё равно остался (гейзенбаг как он есть - при таких ключах сборки проявляется, при сяких не проявляется, с такой прагмой эффект один, а с другой - другой), но после принудительно-параноидальной правки указателей там, где используется обращение к полям структуры, получил:
==2802== Memcheck, a memory error detector
==2802== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==2802== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==2802== Command: ./main
==2802==
nil = 0xc8b4
256 free cells before
creating symbols:
Packed symbol: <0x52414201>
Packed symbol: <0x544f5001>
Packed symbol: <0x52414201>
Packed symbol: <0x4f4f4601>
interning symbols:

symtab:
( ( FOO ) ( POT ) ( BAR ) )
setting new values:
set_symbol_value:
Before: <0xc0cd<0xa2dc.0x4f4f4601>.0xc8b4> ( FOO )
Now: <0xc0cd<0xa2dc.0x4f4f4601>.0xc0fc> ( FOO . "Test string" )
set_symbol_value:
Before: <0xc0b5<0xa2dc.0x52414201>.0xc8b4> ( BAR )
Now: <0xc0b5<0xa2dc.0x52414201>.0xc104> ( BAR . 10 )

{Atom <0xc0b4>: Type [SYMBOL], data <0x52414201>}
{Atom <0xc104>: Type [UINT32], data <0xa>}

symtab after:
( ( FOO . "Test string" ) ( POT ) ( BAR . 10 ) )
purging:
256 free cells after

All done
==2802==
==2802== HEAP SUMMARY:
==2802== in use at exit: 0 bytes in 0 blocks
==2802== total heap usage: 15 allocs, 15 frees, 128 bytes allocated
==2802==
==2802== All heap blocks were freed -- no leaks are possible
==2802==
==2802== For counts of detected and suppressed errors, rerun with: -v
==2802== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Subscribe

  • Толерантность и равноправие

    Подразделение компании Disney, студия Lucas Film больше не будет сотрудничать с актрисой Джиной Карано, которая снималась в сериале "Мандалорец",…

  • Конечно, они ведь не могут

    "Я все еще не могу поверить, что Дж. К. Роулинг написала роман, который подразумевает, что транслюди могут быть злодеями" Это только белый…

  • Принуждение к равноправию

    С 2025 года фильмы, в которых хотя бы один из исполнителей главных ролей не принадлежит к "недопредставленным расовым и этническим группам", не…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 19 comments

  • Толерантность и равноправие

    Подразделение компании Disney, студия Lucas Film больше не будет сотрудничать с актрисой Джиной Карано, которая снималась в сериале "Мандалорец",…

  • Конечно, они ведь не могут

    "Я все еще не могу поверить, что Дж. К. Роулинг написала роман, который подразумевает, что транслюди могут быть злодеями" Это только белый…

  • Принуждение к равноправию

    С 2025 года фильмы, в которых хотя бы один из исполнителей главных ролей не принадлежит к "недопредставленным расовым и этническим группам", не…