Вопрос по структурам С
Твои float[] живут в фрейме getTestSinData и умирают при выходе.
# clang -std=c99 1.c -o 1 -faddress-sanitizer -mllvm -asan-use-after-return=1
# ./1
ERROR: AddressSanitizer stack-use-after-return on address 0x7f473b643260 at pc 0x40726a bp 0x7fffcc5260d0 sp 0x7fffcc5260c8
READ of size 4 at 0x7f473b643260 thread T0
0x40726a in testInputs /tmp/test/1.c:51
0x4075e5 in main /tmp/test/1.c:56
0x7f473be61eff in ? ?:0
Address 0x7f473b643260 is located at offset 96 in frame <getTestSinData> of T0's stack:
This frame has 5 object(s):
[32, 48) 'input'
[96, 132) '.compoundliteral'
[192, 208) 'output'
[256, 292) '.compoundliteral9'
[352, 356) 'k'
Угу, понятно, благодарю
не работает , но благодарю за наводку, надо посмотреть в сторону подобных анализаторов ошибок использования памяти
Под gcc мегатул, к сожалению,
под gcc для таких вещей работает valgrind
Он хотел, видимо, сказать "под винду". Но под винду валгринд тоже не работает. Бывает Pin (www.pintool.org который делает то же самое, что и валгринд.
==3672== Conditional jump or move depends on uninitialised value(s)
==3672== at 0x4E7BA22: __printf_fp (printf_fp.c:404)
==3672== by 0x4E781E4: vfprintf (vfprintf.c:1628)
==3672== by 0x4E81275: printf (printf.c:35)
==3672== by 0x4006E5: testInputs (1.c:51)
==3672== by 0x400724: main (1.c:56)
==3688== Uninitialised value was created by a stack allocation
==3688== at 0x400687: testInputs (1.c:49)
Без поддержки со стороны компилятора очень сложно понять что происходит на стеке.
Если успеют, поддержку асана хотят сделать в 4.8. Тогда выйдет следующей весной. Если не успеют — еще следующей весной
Оставить комментарий
valkiria77
Добрый день, столкнулся с проблемой, при написании программы на С. Сразу скажу, что С совсем не родной и не fluent .Ошибку удалось воспроизвести в таком редуцированном варианте.
Платформа: cygwin, компилятор gcc
Вывод:
Т.е. при чтении значений массива из функции где они устанавливаются, все нормально, но при передаче управления в другую ф-цию и чтения тех же ячеек памяти в них лежит какая-то лажа.
Кто нить может помочь определить ошибку?