Valgrind: «Условный переход или перемещение зависит от неинициализированных значений» в математических функциях - PullRequest
0 голосов
/ 24 февраля 2020

Я не могу найти причину условного перехода в моей программе на C ++. Я тестирую его с помощью Valgrind 3.11.0, и программа компилируется с g cc 5.4.0.

Проблема заключается в том, что эти условные переходы, по-видимому, происходят в функциях trigonometri c с использованием инструкций AVX, но также с функциями sqrt(), не в моем коде. Ниже я вставляю сообщения Valgrind:

==29490== Conditional jump or move depends on uninitialised value(s)
==29490==    at 0x54436DD: __sin_avx (s_sin.c:482)
...

==29490== Conditional jump or move depends on uninitialised value(s)
==29490==    at 0x54449D4: __cos_avx (s_sin.c:597)
...
==28458== Conditional jump or move depends on uninitialised value(s)
==28458==    at 0x543F7B7: __ieee754_atan2_avx (e_atan2.c:434)
==28458==    by 0x53F746F: atan2 (w_atan2.c:36)
...

==29490== Conditional jump or move depends on uninitialised value(s)
==29490==    at 0x53F8258: sqrt (w_sqrt.c:27)

Я надеюсь, что кто-то может помочь. Спасибо.

1 Ответ

0 голосов
/ 24 февраля 2020

Функции, подобные atan2, сравнивают аргументы с некоторыми константами внутри себя (например, if (x < 0) ...). Если то, что вы передали, имеет неинициализированное значение, valgrind справедливо пожалуется (попробуйте, например, double x, y; atan2(x, y);). Проблема не в математических функциях, а в вызывающем.

Необходимо убедиться, что аргументы правильно инициализированы, что может быть нетривиальным, поскольку неинициализированные значения могут распространяться из неожиданных мест. Попробуйте скомпилировать свой код с символами отладки, чтобы увидеть, может ли valgrind напечатать более подробную обратную трассировку.

...