Russian Qt Forum
Ноябрь 25, 2024, 22:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Помогите немного))  (Прочитано 7505 раз)
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);
}

есть тут какие то ошибки,кроме переполнения буфера?а то я не могу понять))
Прошу прощения за столь банальный вопрос.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Март 03, 2013, 19:55 »

Код:
const char* const
серьезно? О_о
а в чем смысл функции void usage()?

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

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

вы уверены, что у вас вообще передается 2 параметр ехе?
1 параметр - путь к самой программе
« Последнее редактирование: Март 03, 2013, 20:32 от gil9red » Записан

nikeo
Гость
« Ответ #2 : Март 03, 2013, 20:16 »

Код:
const char* const
серьезно? О_о
а в чем смысл функции void usage()?

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

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

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

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

ну вызывает она падение программы,разве это ошибка?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Март 03, 2013, 20:19 »

Давно не видел подобных сишных извращений Улыбающийся

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

попробуйте через консольку запустить ехешник, передав какую нибудь строку, тогда не будет падения программы
« Последнее редактирование: Март 03, 2013, 20:22 от gil9red » Записан

nikeo
Гость
« Ответ #4 : Март 03, 2013, 20:23 »

Давно не видел подобных сишных извращений Улыбающийся

да бред бредом)еще мне интересно,программа "упадет", если ввести строку длиннее чем 50 символов...почему именно 50?
Записан
nikeo
Гость
« Ответ #5 : Март 03, 2013, 20:27 »

Давно не видел подобных сишных извращений Улыбающийся

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

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

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

что то еще упустил?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #6 : Март 03, 2013, 20:29 »

выход за пределы массива, если ехе не имеет параметра
Код:
argv[1]


Код:
argv[0] - абсолютный путь к самой программе
Код:
argv[1], argv[2] и т.д. - дополнительные параметры, передаваемые ехе
их количество указано в argc
« Последнее редактирование: Март 03, 2013, 20:31 от gil9red » Записан

nikeo
Гость
« Ответ #7 : Март 03, 2013, 20:32 »

выход за пределы массива, если ехе не имеет параметра
Код:
argv[1]


так это разве не переполнение буфера?)
если не будет параметров - произойдет вызов функции usage()
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Март 03, 2013, 20:35 »

Код:
int a[4];

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

тоже самое и в вашем случаи Улыбающийся
Записан

nikeo
Гость
« Ответ #9 : Март 03, 2013, 21:01 »

Код:
int a[4];

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

тоже самое и в вашем случаи Улыбающийся
теперь я понял что вы хотели сказать)))

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

но почему падает если передать от 51 символа?не от 38,не от 56,а от 51?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Март 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;
 

Записан
nikeo
Гость
« Ответ #11 : Март 04, 2013, 08:40 »

Да вот и я так думаю,но смысл как раз в ошибке по информационной безопасности,я то сам такой код писать бы не стал)
Записан
Fat-Zer
Гость
« Ответ #12 : Март 05, 2013, 19:12 »

чего-то развели муть.... никакого переполнения тут нет... exit(-1) уж тем более не ошибка и ни какого падения она не вызывает, а только штатное завершение с ошибкой...
единственно, что потенциально опасно, так это printf(buff): если передаваемая строка будет содержать что-то типа %s, то программа действительно упадёт...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Март 05, 2013, 19:20 »

никакого переполнения тут нет...
Неужели? Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Март 05, 2013, 22:02 »

Та как-то оно написано "чмошно". То usage - поди пойми что внутри него exit, значение 56 тоже "чудное". Ну ладно, допустим пресекли переполнение - но хз это весь вывод или огрызок. Странная какая-то "информационная безопасность"
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.274 секунд. Запросов: 23.