Russian Qt Forum

Qt => Вопросы новичков => Тема начата: nikeo от Март 03, 2013, 18:22



Название: Помогите немного))
Отправлено: nikeo от Март 03, 2013, 18:22
смысл такой:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BUFF_LEN 56

const char* const greeting = "Your message is: ";

void usage();

int main(int argc, char* argv[])
{
char buff[MAX_BUFF_LEN];
if(argc <= 1)
usage();

strcpy(buff,greeting);
strncat(buff,argv[1],MAX_BUFF_LEN);

printf(buff);
}

void usage()
{
printf("Problem1 [message]");
exit(-1);
}

есть тут какие то ошибки,кроме переполнения буфера?а то я не могу понять))
Прошу прощения за столь банальный вопрос.


Название: Re: Помогите немного))
Отправлено: gil9red от Март 03, 2013, 19:55
Код:
const char* const
серьезно? О_о
а в чем смысл функции void usage()?

exit(-1); вызывает падение

увеличьте размер буфера, может его не хватает

вы уверены, что у вас вообще передается 2 параметр ехе?
1 параметр - путь к самой программе


Название: Re: Помогите немного))
Отправлено: nikeo от Март 03, 2013, 20:16
Код:
const char* const
серьезно? О_о
а в чем смысл функции void usage()?

exit(-1); вызывает падение

увеличьте размер буфера, может его не хватает

вы уверены, что у вас вообще передается 2 параметр ехе?
1 параметр - путь к самой программе

константный указатель на константу - что тут такого?)
код не мой,мне ошибки найти надо)

ну вызывает она падение программы,разве это ошибка?


Название: Re: Помогите немного))
Отправлено: gil9red от Март 03, 2013, 20:19
Давно не видел подобных сишных извращений :)

Если к вашему ехе нет параметра, то и это вызовет падение программы
strncat(buff,
           argv[1], // выход за пределы
           MAX_BUFF_LEN);

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


Название: Re: Помогите немного))
Отправлено: nikeo от Март 03, 2013, 20:23
Давно не видел подобных сишных извращений :)

да бред бредом)еще мне интересно,программа "упадет", если ввести строку длиннее чем 50 символов...почему именно 50?


Название: Re: Помогите немного))
Отправлено: nikeo от Март 03, 2013, 20:27
Давно не видел подобных сишных извращений :)

Если к вашему ехе нет параметра, то и это вызовет падение программы
strncat(buff,
           argv[1], // выход за пределы
           MAX_BUFF_LEN);

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

именно так я и проверял,просто мне надо найти ошибки в коде,а следовательно:
переполнение буфера
отсутствие оператора return в функции main
программа падает изза вызова функции exit(-1)

что то еще упустил?


Название: Re: Помогите немного))
Отправлено: gil9red от Март 03, 2013, 20:29
выход за пределы массива, если ехе не имеет параметра
Код:
argv[1]


Код:
argv[0] - абсолютный путь к самой программе
Код:
argv[1], argv[2] и т.д. - дополнительные параметры, передаваемые ехе
их количество указано в argc


Название: Re: Помогите немного))
Отправлено: nikeo от Март 03, 2013, 20:32
выход за пределы массива, если ехе не имеет параметра
Код:
argv[1]


так это разве не переполнение буфера?)
если не будет параметров - произойдет вызов функции usage()


Название: Re: Помогите немного))
Отправлено: gil9red от Март 03, 2013, 20:35
Код:
int a[4];

int x = a[4]; // разве это переполнение буфера? О_о
// диапазон индексов данного массива от 0 до 3, а я указываю 4 индекс

тоже самое и в вашем случаи :)


Название: Re: Помогите немного))
Отправлено: nikeo от Март 03, 2013, 21:01
Код:
int a[4];

int x = a[4]; // разве это переполнение буфера? О_о
// диапазон индексов данного массива от 0 до 3, а я указываю 4 индекс

тоже самое и в вашем случаи :)
теперь я понял что вы хотели сказать)))

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

но почему падает если передать от 51 символа?не от 38,не от 56,а от 51?


Название: Re: Помогите немного))
Отправлено: Igors от Март 03, 2013, 21:57
еще мне интересно,программа "упадет", если ввести строку длиннее чем 50 символов...почему именно 50?
Потому что последний аргумент strncat ограничивает не общую длину а только кол-во добавляемых. Аккуратнее так
Код
C++ (Qt)
strncat(buff, argv[1], MAX_BUFF_LEN - strlen(greeting) - 1);
А лучше так
Код
C++ (Qt)
char * buf = new char[strlen(greeting) + strlen(argv[1]) + 1];
strcpy(buf, greeting);
strcat(buf, argv[1]);
printf(buf);
...
delete [] buf;
 



Название: Re: Помогите немного))
Отправлено: nikeo от Март 04, 2013, 08:40
Да вот и я так думаю,но смысл как раз в ошибке по информационной безопасности,я то сам такой код писать бы не стал)


Название: Re: Помогите немного))
Отправлено: Fat-Zer от Март 05, 2013, 19:12
чего-то развели муть.... никакого переполнения тут нет... exit(-1) уж тем более не ошибка и ни какого падения она не вызывает, а только штатное завершение с ошибкой...
единственно, что потенциально опасно, так это printf(buff): если передаваемая строка будет содержать что-то типа %s, то программа действительно упадёт...


Название: Re: Помогите немного))
Отправлено: Old от Март 05, 2013, 19:20
никакого переполнения тут нет...
Неужели? :)


Название: Re: Помогите немного))
Отправлено: Igors от Март 05, 2013, 22:02
Та как-то оно написано "чмошно". То usage - поди пойми что внутри него exit, значение 56 тоже "чудное". Ну ладно, допустим пресекли переполнение - но хз это весь вывод или огрызок. Странная какая-то "информационная безопасность"


Название: Re: Помогите немного))
Отправлено: Old от Март 06, 2013, 10:09
Та как-то оно написано "чмошно".
А что вы хотите от тестового задания, которое написано специально дырявым, что бы студенты учились взглянув на него, находить проблемные места. :)


Название: Re: Помогите немного))
Отправлено: Igors от Март 06, 2013, 10:47
А что вы хотите от тестового задания, которое написано специально дырявым, что бы студенты учились взглянув на него, находить проблемные места. :)
Да что-то уж "слишком тонко"  :)