LINUX.ORG.RU
ФорумTalks

отлов багов в windows и linux


2

3

Начал я переносить свою программу для расчетов с linux на windows, чтобы можно было запускать и там и там. На линуксе до этого запускалось и работало прекрасно, ничто не предвещало неожиданностей. Перенес я файлы на виндовс, сделал модификации для запуска в виндовсе, скомпилировал, и тут полезло... Оказалось у меня было просто огромнейшее количество багов, вроде переполнения, которые в линуксе себя не проявляли, а молча портили память, но на которые при первом же запуске обратила внимание виндовая библиотека C, и вывела тут же сразу номера строк, где засели ошибки.

UPD: и, кстати как я заметил, при компиляции debug, в windows скорость падает куда значительнее, чем в линуксе. Т.е. всяких отладочных средств в программу куда больше засовывается.

UPD2:Несмотря на хороший отлов багов, Release версия виндовая, запущенная на athlon 64x2 2200 МГц, слила по скорости Release линуксовой, запущенной на Athlon II 3000 Мгц в 4 раза

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 4)

за что виндовая библиотека вызвала наряд и отправила тебя на исправительные работы. [[happy end]]

system-root ★★★★★
()

которые в линуксе себя не проявляли, а молча портили память, но на которые сразу же обратила внимание виндовая библиотека C

Эпично. Сейчас защитнички линукса обмакнут ТС в говно... как обычно. Только представьте, сколько софта в линуксе кособоко написано...

RedEyedMan3
()
Ответ на: комментарий от RedEyedMan3

И некоторые еще удивляются почему линакс тормозит. Быдлокодеры же.

Другие же «решают» это покупкой более мощного железа, но это не всегда помогает.

RedEyedMan3
()

А в обратную сторону это работает? А если с GCC и Clang одновременно?

Darth_Revan ★★★★★
()

переполнения, которые в линуксе себя не проявляли, а молча портили память, но на которые при первом же запуске обратила внимание виндовая библиотека C

Это как? Слова-то понятны, но вместе они не стыкуются.
Библиотека? Обратила внимание? Твоё? На твои ошибки?
Я тебя правильно понял?

Перефразируй свою мысль, а то страшно становится.

Stahl ★★☆
()
Ответ на: комментарий от Stahl

Запускаю в линуксе - все молча работает. Запускаю скомпилированую программу в виндовсе - выскакивает окошко Runtime VC library со словами, что в такой-то строчке я мимо массива пишу. Смотрю код - и в самом деле мимо.

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

А ты на плюсах пишешь или на чистом си?
Я что-то помню, что в какой-то из новых стандартов вносили проверку на попадание в массив... Или я путаю чего?

Stahl ★★☆
()
Ответ на: комментарий от cvs-255

скомпилируй свой код шлангом (clang -Wall) и проусти через valgrind.

invy ★★★★★
()

Скомпиль в венде ядро.

roman77 ★★★★★
()

Советую Hardened Linux (PaX patches + grsecurity patches + selinux) - проявляется больше багов чем на OpenBSD и Windows вместе взятых. Так что приходиться вооружаться valgrind + gdb и исправлять, исправлять, исправлять.

Если код на Си - еще советую прогнать через Frama-C через Alt-Ergo solver. Он даже без аннотаций много логических ошибок показывает.

XVilka ★★★★★
()
Ответ на: комментарий от blackst0ne

вот результат проверки серверной части


$ valgrind ./geodesic server
==19181== Memcheck, a memory error detector
==19181== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==19181== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==19181== Command: ./geodesic server
==19181== 
==19181== Mismatched free() / delete / delete []
==19181==    at 0x4C2AB5C: operator delete(void*) (vg_replace_malloc.c:480)
==19181==    by 0x4034ED: recv_server(void*) (in /home/vlad/data/distr/devel/geodesic/build/geodesic)
==19181==    by 0x402A25: main (in /home/vlad/data/distr/devel/geodesic/build/geodesic)
==19181==  Address 0x6fa0340 is 0 bytes inside a block of size 112 alloc'd
==19181==    at 0x4C2A067: operator new[](unsigned long) (vg_replace_malloc.c:363)
==19181==    by 0x4046D0: srv_get_start() (in /home/vlad/data/distr/devel/geodesic/build/geodesic)
==19181==    by 0x4034B4: recv_server(void*) (in /home/vlad/data/distr/devel/geodesic/build/geodesic)
==19181==    by 0x402A25: main (in /home/vlad/data/distr/devel/geodesic/build/geodesic)
==19181== 
recv FIN from 127.0.0.1
recv FIN from 127.0.0.1
recv FIN from 127.0.0.1
recv FIN from 127.0.0.1
recv FIN from 127.0.0.1
==19181== 
==19181== HEAP SUMMARY:
==19181==     in use at exit: 0 bytes in 0 blocks
==19181==   total heap usage: 10,033 allocs, 10,033 frees, 642,144 bytes allocated
==19181== 
==19181== All heap blocks were freed -- no leaks are possible
==19181== 
==19181== For counts of detected and suppressed errors, rerun with: -v
==19181== ERROR SUMMARY: 5 errors from 1 contexts (suppressed: 2 from 2)

Я так понял, что лишнее освобождение. Но совсем не понимаю, откуда там ему быть.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Тут всё ещё круче. Часть таких ошибок должен ловить компилятор:

$ cat ./test.c # Пример кода с ошибкой
int main(void)
{ int a[10];
  a[13] = 3;  
  return a[1];
}
$ gcc ./test.c -Wall # При компиляции даже с -Wall никаких ошибок
$ gcc ./test.c -Wall -O2 # А с -O2 появляются варнинги
./test.c: In function ‘main’:
./test.c:4:3: warning: ‘a[1]’ is used uninitialized in this function [-Wuninitialized]
   return a[1];
   ^
$ clang ./test.c -Wall # А вот clang ошибку ловит сразу
./test.c:3:3: warning: array index 13 is past the end of the array (which contains 10 elements) [-Warray-bounds]
  a[13] = 3;  // oops, overwrote the return address
  ^ ~~
./test.c:2:3: note: array 'a' declared here
{ int a[10];
  ^
1 warning generated.
$

Если же хочешь, чтобы ошибка ловилась именно рантаймом, то тут есть valgrind и ему подобные развлечения

$ gcc ./test.c -g -O0
$ valgrind ./a.out 
....
==26288== Syscall param exit_group(status) contains uninitialised byte(s)
==26288==    at 0x411106E: _Exit (_exit.S:33)
...
$ gcc -fstack-protector-all -fmudflap -lmudflap ./test.c
$ ./a.out 
*******
mudflap violation 1 (check/write): time=1384387918.033837 ptr=0xbfcac434 size=56
pc=0xb7658685 location=`./test.c:3:9 (main)'
      /usr/lib/i386-linux-gnu/libmudflap.so.0(__mf_check+0x45) [0xb7658685]
      ./a.out(main+0xa0) [0x804888d]
      /usr/lib/i386-linux-gnu/libmudflap.so.0(__wrap_main+0x4a) [0xb7658b3a]
Nearby object 1: checked region begins 0B into and ends 16B after
mudflap object 0x99f78c8: name=`./test.c:2:7 (main) a'
bounds=[0xbfcac434,0xbfcac45b] size=40 area=stack check=0r/3w liveness=3
alloc time=1384387918.033824 pc=0xb7658ad5
number of nearby objects: 1
$ 
kim-roader ★★
()

Не пойму в чем проблема в линуксе пользоваться valgrind и gdb. Да и странно как-то ты пишешь, раз у тебя втихаря память рушится. Кроме того, не нужно отключать предупреждения (varnings) gcc. Наоборот лучше их на полную врубить.

Вообще, самый привередливый с/с++ компилятор - это от intel. И желательно там тоже уровень привередливости наивысший поставить. Хорошо так себя проверять.

hibou ★★★★★
()
Последнее исправление: hibou (всего исправлений: 1)

Проверка на выход за границы массива включается автоматически для -O2 либо -Wall. Без включённой оптимизации многие проверки просто невозможны. Всё это описано в манах. Но кто же их читает?!

hope13 ★★★
()

Пользуясь случаем, хочу спросить, кто-нибудь знает нормальные отладчики памяти типа валгринда под венду?

Kosyak ★★★★
()
Ответ на: комментарий от cvs-255

Стартовать valgrind с vgdb, подключиться gdb, при ошибке в валгринде в гдб случится точка останова, а там уже можно разбираться что вызвало, какие значения.

XVilka ★★★★★
()
Ответ на: комментарий от XVilka

Содержимое $HOME/.valgrindrc:

--leak-check=full
--show-reachable=yes
--track-origins=yes
--read-var-info=yes
--suppressions=/home/user/valgrind/suppressions.supp
Добавить "--vgdb=yes --vgdb-error=0" к командной строке В gdb набрать «target remote | vgdb»

Так можно много чего отловить.

XVilka ★★★★★
()
Ответ на: комментарий от RedEyedMan3

Эпично. Сейчас защитнички линукса обмакнут ТС в говно... как обычно. Только представьте, сколько софта в линуксе кособоко написано...

А ноет о том как его обижают.

steemandlinux ★★★★★
()

gcc -Wall -Wextra -Weffc++, cppcheck, valgrind юзай

static_lab ★★★★★
()

Т.е. всяких отладочных средств в программу куда больше засовывается.

Совершенно не обязательно. Есть все шансы, что просто жрёт больше ресурсов системы и тормозит :)

sT331h0rs3 ★★★★★
()
Ответ на: комментарий от cvs-255

там sprintf

sprintf -> snprintf, gets -> fgets и т.д.

Не надо использовать небезопасные функции.

no-dashi ★★★★★
()

В линуксе в glibc тоже всякие проверки есть, дофига их. Только они по дефолту отключены, ибо предполагается что программист под линукс менее криворукий. man mcheck, man mallopt

Harald ★★★★★
()
Ответ на: комментарий от cvs-255

там sprintf(tname, «thread%05i», i); 12 байт

Такое cppcheck хорошо отлавливает.

Ну а по исходной теме — ты сравнивал компиляторы, а написал так, будто сравниваешь ОС.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)

А что ты хочешь, рантайм проверки стоят дорого, оттого и просадка.

ncrmnt ★★★★★
()
Ответ на: комментарий от RedEyedMan3

Ты же тему создавал про хамство среди линуксоидов.

steemandlinux ★★★★★
()

переходи на темную сторону! у нас есть питон и нам никуда не надо торопиться.

der_looser ★★
()
Ответ на: комментарий от hibou

Вообще, самый привередливый с/с++ компилятор - это от intel.

Он в этом плане от гцц недалеко ушел. А самый жесткий - Comeau

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.