Security Enhancements in the CRT
От: Tilir Россия http://tilir.livejournal.com
Дата: 01.03.07 14:06
Оценка:
Вопрос не спешный, я просто любопытствую.

MSVC постоянно предлагает такие функции, например sprintf_s вместо sprintf (последняя помечена обидным deprecated), тогда как в стандарте C о них ни слова и другие компиляторы их не знают. Приходится руками отключать соответствующие warning'и (или объявлять _CRT_SECURE_NO_DEPRECATE). Собственно вопросы:
1. Это очередная "превосходная фича" от MS или нечто действительно ценное, на что следует обратить внимание?
2. Нужны ли они, применяете ли их вы лично и зачем?
3. Где об этом можно почитать подробнее (какой-нибудь внятный туториал: вот без sprintf_s было плохо, с вот с ним стало хорошо)?
Re: Security Enhancements in the CRT
От: remark Россия http://www.1024cores.net/
Дата: 01.03.07 14:15
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Вопрос не спешный, я просто любопытствую.


T>MSVC постоянно предлагает такие функции, например sprintf_s вместо sprintf (последняя помечена обидным deprecated), тогда как в стандарте C о них ни слова и другие компиляторы их не знают. Приходится руками отключать соответствующие warning'и (или объявлять _CRT_SECURE_NO_DEPRECATE). Собственно вопросы:

T>1. Это очередная "превосходная фича" от MS или нечто действительно ценное, на что следует обратить внимание?
T>2. Нужны ли они, применяете ли их вы лично и зачем?
T>3. Где об этом можно почитать подробнее (какой-нибудь внятный туториал: вот без sprintf_s было плохо, с вот с ним стало хорошо)?

Вот без него было плохо:

char too_short_buffer[10];
sprintf(buf, "%s", s);


И вот без него было плохо:

char buffer[10];
snprintf(buf, 128, "%s", s);


Вот с ним стало хорошо:

char buffer[10];
sprintf_s(buf, "%s", s);




T>1. Это очередная "превосходная фича" от MS или нечто действительно ценное, на что следует обратить внимание?


Смотри сам. Если для тебя те проблемы, которые решают эти функции являются проблемами, то применяй. Если тебе и так хорошо, и ты никогда не считал это проблемами, то и не парься. Я так думаю.

T>2. Нужны ли они, применяете ли их вы лично и зачем?


Я лично их не применял, т.к. printf сам по себе убогий — неудобный, небезопасный и медленный. И такие навороты ему не помогут. Имхо. Кривого могила исправит
Но если я был вынужден использовать printf, то возможно бы и применял.

T>3. Где об этом можно почитать подробнее (какой-нибудь внятный туториал: вот без sprintf_s было плохо, с вот с ним стало хорошо)?


MSDN



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Security Enhancements in the CRT
От: Аноним  
Дата: 01.03.07 14:34
Оценка:
R>Я лично их не применял, т.к. printf сам по себе убогий — неудобный, небезопасный и медленный. И такие навороты ему не помогут. Имхо. Кривого могила исправит
R>Но если я был вынужден использовать printf, то возможно бы и применял.
какие громкие слова...
чем же пользуется маг?
Re[3]: Security Enhancements in the CRT
От: remark Россия http://www.1024cores.net/
Дата: 01.03.07 14:45
Оценка:
Здравствуйте, Аноним, Вы писали:

R>>Я лично их не применял, т.к. printf сам по себе убогий — неудобный, небезопасный и медленный. И такие навороты ему не помогут. Имхо. Кривого могила исправит

R>>Но если я был вынужден использовать printf, то возможно бы и применял.
А>какие громкие слова...

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

А>чем же пользуется маг?


Что имхо стоит внимания и чем я пользуюсь (за мага спасибо ):
1. std::ostringstream — это удобно и безопасно. Но не так быстро.
2. boost::format — это ещё удобнее и безопасно. Но ещё медленнее.
3. самописный аналог boost::format — это ещё удобнее, расширяемее, безопаснее и мега быстро, вобщем супер


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Security Enhancements in the CRT
От: Аноним  
Дата: 01.03.07 14:48
Оценка:
R>1. std::ostringstream — это удобно и безопасно. Но не так быстро.
R>2. boost::format — это ещё удобнее и безопасно. Но ещё медленнее.
R>3. самописный аналог boost::format — это ещё удобнее, расширяемее, безопаснее и мега быстро, вобщем супер
скромно так...
фстудию
Re[4]: Security Enhancements in the CRT
От: Аноним  
Дата: 01.03.07 14:53
Оценка:
R>1. std::ostringstream — это удобно и безопасно. Но не так быстро.
насчет удобно — очень спорный момент. как может быть удобно городить(вставлять в текст — _совсем_ не наглядно!) кучу манипуляторов и иже с ними для форматированного вывода? %)
Re[5]: Security Enhancements in the CRT
От: remark Россия http://www.1024cores.net/
Дата: 01.03.07 14:54
Оценка:
Здравствуйте, Аноним, Вы писали:

R>>1. std::ostringstream — это удобно и безопасно. Но не так быстро.

R>>2. boost::format — это ещё удобнее и безопасно. Но ещё медленнее.
R>>3. самописный аналог boost::format — это ещё удобнее, расширяемее, безопаснее и мега быстро, вобщем супер
А>скромно так...
А>фстудию

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


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: Security Enhancements in the CRT
От: SergH Россия  
Дата: 01.03.07 15:02
Оценка: 1 (1) +1
Здравствуйте, remark, Вы писали:

R>фсё руки не доходят его фстудию вынести...


Договорись с руками, общественность ждёт
Делай что должно, и будь что будет
Re[5]: Security Enhancements in the CRT
От: remark Россия http://www.1024cores.net/
Дата: 01.03.07 15:12
Оценка: :)
Здравствуйте, Аноним, Вы писали:

R>>1. std::ostringstream — это удобно и безопасно. Но не так быстро.

А>насчет удобно — очень спорный момент. как может быть удобно городить(вставлять в текст — _совсем_ не наглядно!) кучу манипуляторов и иже с ними для форматированного вывода? %)

согласен.

я сам использую примерно следующий вид:
fmt % "data in hex: " %hex(data, len)% ", date: " %date<full_format>(d);


при этом такие "манипуляторы" необходимо применять только когда необходимо "объединить" несколько переменных (как для hex) или когда нужно передать ещё некие настройки (как для даты)
для остальных случаев предусмотрено разумное поведение по-умолчанию:

fmt % "number: " %i% ", string: " %s% ", unsigned number: " %u;



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: Security Enhancements in the CRT
От: hVostt Россия http://hvostt.ru
Дата: 02.03.07 18:12
Оценка:
Здравствуйте, remark, Вы писали:

R>я сам использую примерно следующий вид:

R>
R>fmt % "data in hex: " %hex(data, len)% ", date: " %date<full_format>(d);
R>


R>
R>fmt % "number: " %i% ", string: " %s% ", unsigned number: " %u;
R>


разреши поинтересоваться, что это за % (проценты)? эквивалент << ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
специализация — удел насекомых... (с) Р. Хайнлайн
Форматтер
От: Critical Error ICQ: 123736611
Дата: 03.03.07 02:45
Оценка:
Здравствуйте, remark, Вы писали:

R>3. самописный аналог boost::format — это ещё удобнее, расширяемее, безопаснее и мега быстро, вобщем супер


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

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

Юзаю так:
// простой пример
formatc("my % formatter") % "super"; // -> "my super formatter"
// расширение выравнивания
formatc("version %<10") %0.2; // -> "version        0.2"
// манипулятор
formatc("hex % number") %sf_hex %0x123; // -> "hex 123 number"
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Security Enhancements in the CRT
От: Павел Кузнецов  
Дата: 04.03.07 13:55
Оценка:
Здравствуйте, Tilir, Вы писали:

T>MSVC постоянно предлагает такие функции, например sprintf_s вместо sprintf (последняя помечена обидным deprecated), тогда как в стандарте C о них ни слова и другие компиляторы их не знают. Приходится руками отключать соответствующие warning'и (или объявлять _CRT_SECURE_NO_DEPRECATE). Собственно вопросы:

T>1. Это очередная "превосходная фича" от MS или нечто действительно ценное, на что следует обратить внимание?
T>2. Нужны ли они, применяете ли их вы лично и зачем?
T>3. Где об этом можно почитать подробнее (какой-нибудь внятный туториал: вот без sprintf_s было плохо, с вот с ним стало хорошо)?

Это всё, действительно, Microsoft-specific, но с вполне реальными шансами войти в следующий стандарт, т.к. обсуждается в комитете:
N1007 07-Apr-2003 Lovell, Security and Standard C Libraries
N1031 26-Sep-2003 Meyers, Specification for secure C Libray functions
N1044 17-Nov-2003 Meyers, New work item proposal for secure C Library functions
N1049 06-Feb-2004 Plauger, Suggested changes to N1031 secure C library functions
N1055 04-Mar-2004 Meyers, Security TR working draft
N1059 04-Mar-2004 Meyers, Security TR Editor's Report
N1063 30-Mar-2004 Meyers, Late Issues with N1055
N1078 27-Sep-2004 Meyers, Working draft of Security TR 24731
N1079 27-Sep-2004 Meyers, Security TR 24731 Editor's Report
N1126 2005/08/29 Stoughton, Specification for Safer C Library Functions &mdash; Part 2: Dynamic Allocation Functions
N1193 2006/10/03 Stoughton, Specification for C Library Functions &mdash; Part 2: Dynamic Allocation Functions
comp.std.c
и т.п.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Security Enhancements in the CRT
От: johny5 Новая Зеландия
Дата: 05.03.07 04:48
Оценка: 2 (1)
R>И вот без него было плохо:

R>
R>char buffer[10];
R>snprintf(buf, 128, "%s", s);
R>


R>Вот с ним стало хорошо:


R>
R>char buffer[10];
R>sprintf_s(buf, "%s", s);
R>



Это неверно, sprintf_s так же требует явного указания размера входного буффера (sprintf_s не занимается магией). Следовательно с этой точки зрения, sprintf_s работает в точности как snprintf.

Разница только в том, что sprintf_s дополнительно проверяет ошибки в форматирующей строке и гарантирует NULL-terminated строку.
Re[2]: Security Enhancements in the CRT
От: Tilir Россия http://tilir.livejournal.com
Дата: 05.03.07 06:39
Оценка:
Здравствуйте, remark, Вы писали:

T>>3. Где об этом можно почитать подробнее (какой-нибудь внятный туториал: вот без sprintf_s было плохо, с вот с ним стало хорошо)?


Я немножко подкорректировал ваши примеры для наглядности:

R>Вот без него было плохо:


// Было - плохо.
int too_long_integer = 123456789;
char too_short_buffer[5];
int numchar = sprintf(too_short_buffer, "%d", too_long_integer);
printf("buffer = %s, numchar = %d", too_short_buffer, numchar);


У меня при этом корректно вывелось "buffer = 123456789, numchar = 9" и отладчик выдал предупреждение "stack corrupted".

R>Вот с ним стало хорошо:


// Стало - хорошо?
int too_long_integer = 123456789;
char too_short_buffer[5];
int numchar = sprintf_s(too_short_buffer, 5, "%d", too_long_integer);
printf("buffer = %s, numchar = %d", too_short_buffer, numchar);


Всё вывалилось в exception, на экране вообще ничего не вывелось.

Давайте разберёмся, а хорошо ли стало?

1. Стало не по стандарту. Я не включаю ничего кроме <stdio.h>, а пользуюсь функциями, про которые любой компилятор, кроме cl спросит "где это"? И будет совершенно прав.

Но, что ещё хуже:

2. А что мне потом с этим exception делать? В стандарте C никаких исключений вообще не прописано — поймать его и обработать можно только в рамках C++, а на C++ ostringstream существенно удобнее.

Вот если бы MS-овская реализация возвращала -1, вместо того, чтобы кидать исключение... Но, если подумать, у нас ведь есть вариант как вернуть -1 вместо исключения, вот он:

// Стало - хорошо!
int too_long_integer = 123456789;
char too_short_buffer[5];
int numchar = snprintf(too_short_buffer, 5, "%d", too_long_integer);
if (-1 != numchar)
  printf("buffer = %s, numchar = %d", too_short_buffer, numchar)
else
  printf("Опаньки");


Так что я всё-таки чего-то не понимаю.
Re[7]: Security Enhancements in the CRT
От: remark Россия http://www.1024cores.net/
Дата: 05.03.07 07:54
Оценка:
Здравствуйте, hVostt, Вы писали:

V>Здравствуйте, remark, Вы писали:


R>>я сам использую примерно следующий вид:

R>>
R>>fmt % "data in hex: " %hex(data, len)% ", date: " %date<full_format>(d);
R>>


R>>
R>>fmt % "number: " %i% ", string: " %s% ", unsigned number: " %u;
R>>


V>разреши поинтересоваться, что это за % (проценты)? эквивалент << ?


да


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Security Enhancements in the CRT
От: remark Россия http://www.1024cores.net/
Дата: 05.03.07 08:01
Оценка:
Здравствуйте, johny5, Вы писали:


J>Это неверно, sprintf_s так же требует явного указания размера входного буффера (sprintf_s не занимается магией). Следовательно с этой точки зрения, sprintf_s работает в точности как snprintf.


А вот и не угадал:

template <size_t size>
int sprintf_s(
char (&buffer)[size],
const char *format [,
argument] ...
);





1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[8]: Security Enhancements in the CRT
От: HiSH Россия http://m0riarty.ya.ru
Дата: 05.03.07 08:09
Оценка: -1
Здравствуйте, remark, Вы писали:

R>>>
R>>>fmt % "number: " %i% ", string: " %s% ", unsigned number: " %u;
R>>>


V>>разреши поинтересоваться, что это за % (проценты)? эквивалент << ?


R>да


Питончег?
Re[3]: Security Enhancements in the CRT
От: remark Россия http://www.1024cores.net/
Дата: 05.03.07 08:09
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Давайте разберёмся, а хорошо ли стало?


T>1. Стало не по стандарту. Я не включаю ничего кроме <stdio.h>, а пользуюсь функциями, про которые любой компилятор, кроме cl спросит "где это"? И будет совершенно прав.


Тебе решать использовать расширения или нет. Никто не обещает, что расширения переносимы.
... хотя скоро может и станет здесь
Автор: Павел Кузнецов
Дата: 04.03.07


T>Но, что ещё хуже:


T>2. А что мне потом с этим exception делать? В стандарте C никаких исключений вообще не прописано — поймать его и обработать можно только в рамках C++, а на C++ ostringstream существенно удобнее.


Очевидно, что при компиляции С- кода не могут лететь исключения...

А вообще смотри:

There are versions of sprintf_s that offer additional control over what happens if the buffer is too small. For more information, see _snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l.


T>Вот если бы MS-овская реализация возвращала -1, вместо того, чтобы кидать исключение... Но, если подумать, у нас ведь есть вариант как вернуть -1 вместо исключения, вот он:


T>
T>// Стало - хорошо!
T>int too_long_integer = 123456789;
T>char too_short_buffer[5];
T>int numchar = snprintf(too_short_buffer, 5, "%d", too_long_integer);
T>if (-1 != numchar)
T>  printf("buffer = %s, numchar = %d", too_short_buffer, numchar)
T>else
T>  printf("Опаньки");
T>


T>Так что я всё-таки чего-то не понимаю.


Чего хорошего? Будет у тебя проект в два раза больше с тем же функционалом....


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[9]: Security Enhancements in the CRT
От: remark Россия http://www.1024cores.net/
Дата: 05.03.07 09:26
Оценка: -1
Здравствуйте, HiSH, Вы писали:

HSH>Здравствуйте, remark, Вы писали:


R>>>>
R>>>>fmt % "number: " %i% ", string: " %s% ", unsigned number: " %u;
R>>>>


V>>>разреши поинтересоваться, что это за % (проценты)? эквивалент << ?


R>>да


HSH>Питончег?


сплюсплюсчег


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Security Enhancements in the CRT
От: Critical Error ICQ: 123736611
Дата: 05.03.07 13:35
Оценка:
Здравствуйте, remark, Вы писали:

R>Чего хорошего? Будет у тебя проект в два раза больше с тем же функционалом....


И медленнее. Кстати никто не ставил эксперимент, выводить в консоль принтфом строчки в цикле. Я заметил, что консоль на VS2005 тормознее раз в 5-10 по сравнению с VS2003 или MinGW. Не связано ли это с майкрософтовскими нововведениями?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.