Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: _countof, errno_t, strncpy_s и так далее. Какая версия g++?  (Прочитано 25225 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« : 19-03-2010 10:59 » 

Народ, кто знает, есть ли какая-нибудь версия g++, которая поддерживала бы strncpy_s, strncat_s, _TRUNCATE и так далее? Или придется писать перевод? Или есть h. файл и библиотека, которые можно было бы просто добавить?
Речь идет о Sun'e, не о Линуксе. Версию сообщу дополнительно.
« Последнее редактирование: 19-03-2010 11:06 от Sashok » Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 19-03-2010 11:16 » 

Насколько понимаю, версия тут не имеет значения: эти функции (strncpy_s и т.п.) относятся к расширению стандартной библиотеки, специфичному для Microsoft. Их придётся писать руками - или найти стороннюю библиотеку, реализующую расширения стандартной библиотеки для g++.
Записан
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #2 : 19-03-2010 11:29 » 

Да в том-то и беда, что, судя по форумам, Мелкомягкие пытаются их протащить как часть стандарта языка. Вот я и думаю, что, может быть кто-то уже сделал? Или хотя бы вразумительное описание найти? А то на MSDN описание внутренне противоречиво.
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 19-03-2010 12:01 » 

Sashok, Когда это станет частью стандарта. Тогда и появится в стандартной поставке GCC. Я насколько знаю, разработчики компилятора стараются достаточно точно следовать букве стандарта.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #4 : 20-03-2010 14:48 » 

Finch, а ты не мог бы попробовать, может быть твоя версия g++ эти добавки поддерживает?
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 20-03-2010 14:58 » new

На все три, строчка grep -R "strncat_s" /usr/include не дала результата. Значит их у меня не содержится в инклудах. Но есть strncat и strncpy
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 20-03-2010 18:22 » 

Sashok, найди документацию в MSDN и напиши свой вропер.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #7 : 20-03-2010 20:35 » 

RXL, это первое, с чего я начал: нашел микрософтовскую документацию MSDN. По поводу strncat_s на протяжении двух абзацей там дается взаимно противоречивая информация.

Может быть, кто-нибудь с ними работал и может дать толковое описание? Конкретно:
strncat_s, strcpy_s, sscanf_s, sprintf_s . Я имею ввиду все, как ведут себя при любых значениях параметров, есть ли exception и пр.
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 20-03-2010 20:37 » 

Протрезвею и прочту Улыбаюсь
Просто боюсь, что сейчас дам неверный совет.
Не могли они ничего сложного придумать - у них, в плане stdlib, обычно только какие-то заплатки, чтобы это можно было под винду использовать.
« Последнее редактирование: 20-03-2010 20:43 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 21-03-2010 09:09 » 

Фактически, делают то же самое, что функции без _s, только проверяют размер выходного буфера, чтобы не переполнить (потому и _s, что типа secure-ные насчёт out of range). Плюс опция, что делать в случае, если буфера всё-таки не хватило.
Никаких исключений не генерируют, возвращают код ошибки. В MSDN есть детальное описание.
« Последнее редактирование: 21-03-2010 09:11 от Вад » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 21-03-2010 12:32 » 

Параметр-ограничитель есть в функциях с 'n'. Например, strncpy и strcpy: в первом есть, а во втором нет. Смысл: копируется либо вся строка, терминированная '\0', либо, если не помещается, то count байт и тогда терминатор отсутствует.

Код:
char *strncpy(
   char *strDest,
   const char *strSource,
   size_t count
);
http://msdn.microsoft.com/ru-ru/library/xdsywd25.aspx

Бороться можно примерно так:

Код:
char dst[10];

strncpy(dst, src, 9);
dst[9] = 0;

Минус - строка может быть обрезана без предупреждения.


Отличие '_s' - в параметре:
Код:
size_t numberOfElements,

Цитата
These functions try to copy the first D characters of
Код:
strSource
to strDest, where D is the lesser of count and the length of strSource. If those D characters will fit within strDest (whose size is given as numberOfElements) and still leave room for a null terminator, then those characters are copied and a terminating null is appended; otherwise, strDest[0] is set to the null character and the invalid parameter handler is invoked, as described in Parameter Validation.

There is an exception to the above paragraph. If count is _TRUNCATE, then as much of strSource as will fit into strDest is copied while still leaving room for the terminating null which is always appended.

http://msdn.microsoft.com/ru-ru/library/5dae5d43.aspx

Как я понял, это попытка контролировать ситуацию, когда терминирующий '\0' не влезает.
« Последнее редактирование: 21-03-2010 12:35 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #11 : 21-03-2010 14:44 » 

Вад, RXL, ну с этим-то я разобрался. А обычными strncpy, strncat я уже давно пользуюсь.
Вопрос в том, что мне нужно полное и непротиворечивое описание мелкомягких добавок. А вот пример того, что дает Микрософт:
http://msdn.microsoft.com/en-us/library/w6w3kbaf.aspx
Цитата
Error Conditions
strDestination                 numberOfElements      strSource     Return value     Contents of strDestination
NULL or unterminated      any                               any              EINVAL              not modified
any                                any                               NULL           EINVAL               not modified
any                                0, or too small                any             ERANGE             not modified

 Remarks
These functions try to append the first D characters of strSource to the end of strDest, where D is the lesser of count and the length of strSource. If appending those D characters will fit within strDest (whose size is given as numberOfElements) and still leave room for a null terminator, then those characters are appended, starting at the original terminating null of strDest, and a new terminating null is appended; otherwise, strDest[0] is set to the null character and the invalid parameter handler is invoked, as described in Parameter Validation.
Как легко заметить, в случае, если количество элементов (2 столбец)  0 или слишком мало (то есть предлагаемое для копирования количество не влезает) в таблице говорится, что результирующий буфер не изменится. А в комментарии под таблицей написано, что у него обнуляется нулевой элемент, то есть пустая строка. Чему верить?
Как легко догадаться, одна ошибка вызывает у программиста недоверие ко всем текстам из того же источника. Ага
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 21-03-2010 17:22 » 

Sashok, я так понимаю, что не производится копирование, но терминатор в начало добавляется.

Если я правильно понял, то цель этих нововведений — иметь в dst либо полную копию, либо пустую строку. Но в любом случае — валидную, т.к. strncpy не дает такой гарантии.

Честно говоря, я не понимаю, зачем было добавлять еще один параметр, т.к. 'count' уже задает максимальный размер принимающего буфера. Майкрософт...  А черт его знает...
« Последнее редактирование: 21-03-2010 17:27 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #13 : 21-03-2010 17:35 » 

Sashok, я так понимаю, что не производится копирование, но терминатор в начало добавляется.

Если я правильно понял, то цель этих нововведений — иметь в dst либо полную копию, либо пустую строку. Но в любом случае — валидную, т.к. strncpy не дает такой гарантии.

Честно говоря, я не понимаю, зачем было добавлять еще один параметр, т.к. 'count' уже задает максимальный размер принимающего буфера. Майкрософт...  А черт его знает...
Ну, я вообще не согласен с большинством того, что делают в Микрософте... Хотя они по-своему логичны: вводят не особенно нужные добавки, но затрудняют миграцию кода ОТ них куда-то еще. Т.е., в конечном счете, привязывают клиентов.
Что же касается понимания, как работает функция, я бы считал так же, как и ты, но слова "not modified" в последнем столбце последней строки заставляют усомниться. В конце концов, строка в dst в обоих случаях валидная, но, согласись, чтобы писать переходник, хорошо бы знать, что туда загонять: оставлять как есть, или писать пустую строку. 
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 21-03-2010 17:37 » 

Sashok, выход только один: провести тесты в студии.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines