On Mon, Feb 28, 2011 at 12:44:38PM +0300, Vladimir Karpinsky wrote: > 28.02.2011 12:36, REAL пишет: > > Дайте url на исходники. > > http://plkv.gsras.ru/~karp/mtpackage.tar.gz > > Дальше я пытаюсь выполнить процедуру, описанную в example2/readme. make CFLAGS="-g -O2" немедленно указывает на место ошибки: cc bin2sac.c -c -g -O2 In file included from /usr/include/stdio.h:912:0, from bin2sac.c:2: In function ‘sprintf’, inlined from ‘main’ at bin2sac.c:20:8: /usr/include/bits/stdio2.h:34:3: error: call to __builtin___sprintf_chk will always overflow destination buffer In function ‘sprintf’, inlined from ‘main’ at bin2sac.c:21:8: /usr/include/bits/stdio2.h:34:3: error: call to __builtin___sprintf_chk will always overflow destination buffer make: *** [bin2sac.o] Ошибка 1 char chd[8][24], ename[16], sname[8]; ... for(i=0;i<8;i++) sprintf(chd[i],"-12345 -12345 -12345 "); sprintf(ename,"-12345 -12345 "); sprintf(sname,"-12345 "); ... sprintf(chd[0],"%-8s%-16s",sname,ename); При выделении места под строки забыли про завершающий '\0'. Затычка: --- bin2sac.c.orig 2011-02-09 04:16:23.000000000 +0300 +++ bin2sac.c 2011-02-28 21:24:11.179999993 +0300 @@ -10,7 +10,7 @@ main(ac,av) int i, npts, year, jday, hour, min, sec, msec, ihd[40]; float dt, B=0.0, E, fhd[70], *tr, evla, evlo, stla, stlo, dist; float azi, bazi, cmpaz, cmpinc; - char chd[8][24], ename[16], sname[8]; + char chd[8+1][24], ename[16+1], sname[8+1]; /* Initialize Header */ Однако это не избавляет от попадания '\0' в chd[1][0] после выполнения sprintf(chd[0],"%-8s%-16s",sname,ename); - это лечится только переписыванием кода, как и возможность переполнения буферов ename и sname в случае неверных входных данных. К сожалению, такие переполнения буферов в стеке (на 1 байт) valgrind не ловит - срабатывает только проверка при возврате из функции, включаемая опцией -fstack-protector (в ALT эта опция включена по умолчанию), когда уже сложно установить, в каком именно месте функции произошло переполнение буфера. Однако при включении оптимизации (-O2) начинает работать опция -D_FORTIFY_SOURCE=2 (также используется в ALT по умолчанию); в данном случае проблема обнаруживается ещё при компиляции, в других случаях возможен аварийный останов при выполнении. Добавление exit(0) просто отключает проверку при возврате из main(), поскольку этот возврат уже не выполняется. Лучше вместо этого написать хотя бы return 0 (о проверке результатов write() в данном случае, похоже, мечтать уже не приходится). Ну и стоило бы ткнуть авторов носом в результаты сборки с CFLAGS="-g -O2 -Wall -W" - наличие предупреждений вида warning: 'quiet' is used uninitialized in this function (даже не may be used uninitialized, а именно is used uninitialized) не внушает уверенности в правильности работы этого кода.