Поиск:

Ответ в темуСоздание новой темы Создание опроса
> strcpy_s vs strcpy 
V
    Опции темы
GoldFinch
Дата 14.7.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



есть задача - заполнить массив char[] строкой, неиспользованные байты забить нулями
пишу код
Код

        struct RequestAuthLogin    : serialization::make_simple<RequestAuthLogin>
        {
            static const unsigned char id=0;

            char login[14];
            char password[16];
            unsigned short chksum;

            RequestAuthLogin(const std::string& login_, const std::string& password_, 
                unsigned short chksum_) 
            {
                memset(this,0,sizeof(*this));
                strcpy_s(login,sizeof(login),login_.c_str());
                strcpy_s(password,sizeof(password),password_.c_str());
                chksum=chksum_;
            }
        };

вроде все красиво выглядит, использовал "безопасную" strcpy_s , только вот незадача, эта *нехорошая* функция забивает остаток буфера символами 0xFE

что характерно, в документации об этом ни слова.
PM MAIL ICQ   Вверх
AlexT84
Дата 14.7.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 10.7.2009

Репутация: 1
Всего: 1



Это только в дебаге. В релизе остаток буфера остаётся нетронутым.
PM MAIL   Вверх
Vaulter
Дата 14.7.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



в дебаге просто буфера сразу содержат 0xFE наверно... а могут 0xCD smile
не суть.
суть: слюшай дарагой! у тебя std::string есть? зачем char* а?

Добавлено через 2 минуты и 29 секунд
Код

memset( login, 0, sizeof( login ) );
memset( password, 0, sizeof( password ) );


пробовал?
а memset( this убери от греха подальше smile


--------------------
PM MAIL WWW ICQ   Вверх
GoldFinch
Дата 14.7.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Vaulter, 
1) не char* а char[], и потому что так надо. надо - значит надо.
2) зачем вызывать 2 раза memset если можно вызвать 1 раз?
 
AlexT84, 
верю, только мне теперь не дебажить чтоли?
PM MAIL ICQ   Вверх
Rififi
Дата 14.7.2009, 23:21 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



есть задача - заполнить массив char[] строкой, неиспользованные байты забить нулями

char login[14] = {0};
char password[16] = {0};

+ юзать StrSafe API
PM MAIL   Вверх
Vaulter
Дата 14.7.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



Цитата(GoldFinch @  14.7.2009,  22:06 Найти цитируемый пост)
зачем вызывать 2 раза memset если можно вызвать 1 раз?


Цитата(GoldFinch @  14.7.2009,  22:06 Найти цитируемый пост)
надо - значит надо

 smile 

ну две переменных ж.
зачем две переменных?




--------------------
PM MAIL WWW ICQ   Вверх
jonie
Дата 15.7.2009, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



чет я не понимаю смысла использоваяния безопасных функций без проверки их результата...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
GoldFinch
Дата 15.7.2009, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



jonie, чтобы ворнинга небыло
PM MAIL ICQ   Вверх
AlexT84
Дата 15.7.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 10.7.2009

Репутация: 1
Всего: 1



Цитата(GoldFinch @  14.7.2009,  21:06 Найти цитируемый пост)
AlexT84, 
верю, только мне теперь не дебажить чтоли? 
Ну почему же не дебажить? Зайди в настройки проекта: C/C++ -> Code Generation -> Runtime Libruary и выставь там флаг /MT, или /MD. Будет тебе дебаг проект с релизными библиотеками.
PM MAIL   Вверх
GoldFinch
Дата 15.7.2009, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Цитата(Rififi @  15.7.2009,  00:21 Найти цитируемый пост)

char login[14] = {0};
char password[16] = {0};

в структуре это не работает, см. пост #1
PM MAIL ICQ   Вверх
Vaulter
Дата 16.7.2009, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



кстати, boost::serialization
"держит" ВСЕ STL контейнеры

http://www.boost.org/doc/libs/1_39_0/libs/...alizablemembers




--------------------
PM MAIL WWW ICQ   Вверх
GoldFinch
Дата 16.7.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Vaulter, я рад за boost::serialization, но у меня своя сериализация, бустовская мне не подходит.

пожалуй действительно лучше забить на странный strcpy и использовать std::string
Код

  struct RequestAuthLogin
        {
            static const unsigned char id=0;
            std::string login;
            std::string password;
            unsigned short chksum;
            RequestAuthLogin(const std::string& login_, const std::string& password_, 
                unsigned short chksum_) : login(login_), password(password_), chksum(chksum_) 
            {
                login.append(14-1-login.size(),0);
                password.append(16-1-password.size(),0);
            }
            template<class Archive>
            void serialize(Archive & ar)
            {
                ar & login;
                ar & password;
                ar & chksum;
            }
        };



PM MAIL ICQ   Вверх
mes
Дата 16.7.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(GoldFinch @  16.7.2009,  18:04 Найти цитируемый пост)

пожалуй действительно лучше забить на странный strcpy и использовать std::string


Цитата(GoldFinch @  16.7.2009,  18:04 Найти цитируемый пост)
                login.append(14-1-login.size(),0);
                password.append(16-1-password.size(),0);


а не проще написать свою "strcpy" с нужным поведением ? а то код слишком режет глаз...


Это сообщение отредактировал(а) mes - 16.7.2009, 20:38


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 16.7.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



mes, 
код который я использовал до этого
Код

memset(this,0,sizeof(*this));
memcpy(login,login_.c_str(),login_.size());
memcpy(password,password_.c_str(),password_.size());

тоже вобщем-то резал глаз

писать свою strcpy ради такого случая - у нее будет странная функциональность, и я хз где еще ее можно будет использовать

(какбэ задача - чтобы в буфере архива оказались строки логина и пароля выровненные до 14 и 16 байт соответственно)

PM MAIL ICQ   Вверх
mes
Дата 16.7.2009, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(GoldFinch @  16.7.2009,  19:51 Найти цитируемый пост)
код который я использовал до этого тоже вобщем-то резал глаз

угу  smile 

Цитата(GoldFinch @  16.7.2009,  19:51 Найти цитируемый пост)
писать свою strcpy ради такого случая 

ну так название я специально взял в кавычки, тут подумать надо какую именно логику должна нести функция, чтоб выглядело красиво..




--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.