Кто-нибудь может объяснить это неясное поведение? - PullRequest
2 голосов
/ 30 августа 2011

Я пытаюсь написать сканер портов для курса безопасности.Я решил написать это на C на Linux, так как никогда не делал ничего, связанного с сетями, кроме Java.Я использую GCC 4.4.5 на Ubuntu 10.10.У меня есть основная функция, которая анализирует аргументы, а затем вызывает функцию сканирования с результирующими переменными.Вот моя полная программа: http://pastebin.com/DHU7SEQR

Проблема, с которой я столкнулся, заключается в том, что она не работает должным образом (она сообщает, что все порты открыты), если я не распечатаю переменные, полученные от пользователя перед вызовомфункция (или изменить порядок параметров, передаваемых в исполняемый файл), что для меня абсолютно бессмысленно.Обратите внимание на закомментированную строку (150), оставив эту строку закомментированной и откомпилировав с помощью команды

gcc scanner.c -o scanner

, а затем запустив программу с

./scanner -a 127.0.0.1 -b 0 -e 1000 -t 1000

, в результате появится отчет обо всехпорты должны быть открыты.Однако раскомментирование этой строки (т. Е. Распечатка всех переменных перед вызовом функции) приводит к правильному сообщению о состоянии портов.Изменение порядка следования параметров на

./scanner -b 0 -e 1000 -t 1000 -a 127.0.0.1

, похоже, также работает, как и добавление оператора printf к каждому блоку case (даже если не выводятся сами переменные).

1 Ответ

5 голосов
/ 30 августа 2011
$ valgrind ./scanner -a 127.0.0.1 -b 0 -e 1000 -t 1000
==3800== Memcheck, a memory error detector
==3800== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==3800== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==3800== Command: ./scanner -a 127.0.0.1 -b 0 -e 1000 -t 1000
==3800== 
==3800== Syscall param socketcall.getsockopt(optlen) points to uninitialised byte(s)
==3800==    at 0x4F15DCA: getsockopt (syscall-template.S:82)
==3800==    by 0x400BC5: scan (scanner.c:83)
==3800==    by 0x400DBB: main (scanner.c:152)
==3800==  Address 0x7ff000330 is on thread 1's stack
==3800== 
==3800== Syscall param socketcall.getsockopt(optlen_out) points to uninitialised byte(s)
==3800==    at 0x4F15DCA: getsockopt (syscall-template.S:82)
==3800==    by 0x400BC5: scan (scanner.c:83)
==3800==    by 0x400DBB: main (scanner.c:152)
==3800==  Address 0x7ff000330 is on thread 1's stack
==3800== 

Проверьте справочную страницу для getsockopt(2).

Для получения opt (), optlen - это аргумент значение-результат, изначально содержащий размер буфера, на который указывает optval, и модифицируется по возвращении, чтобы указать фактический размер возвращаемого значения. Если значение параметра не должно быть поставлено или возвращено, optval может быть НЕДЕЙСТВИТЕЛЕН. "

Итак, вам нужно инициализировать len в строке 82.

Примечание. Возможны другие проблемы с кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...