
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.65.101] |
![]() |
|
Сообщ.
#1
,
|
|
|
Код до сих пор работал с использованием fopen(),
где-то из файла текстового читали, где-то в другой файл записывали. Всё было ОК. Потом поменяли везде fopen() на fopen_s(). Казалось бы, по сути одно и то же. Режимы и алгоритм остались прежние: ![]() ![]() ... errno_t err = fopen_s(&fpPFile, szFP_FName, "wt"); ... fprintf(fpPFile, "PlanRev:%d\n", nRevision); ... Почему же в новой версии (с fopen_s()) доступ к файлу эксклюзивный стал (пока он открытый)? Т.е., не дает открыть файл из другого процесса/приложения, пока его не закроешь здесь. С простым fopen() с этим всё было ОК. В МСДН что-то про это не нашел в описании функции. |
![]() |
Сообщ.
#2
,
|
|
Цитата Azopp @ Ну как же: fopen_s, _wfopen_sВ МСДН что-то про это не нашел в описании функции. Цитата Files that are opened by fopen_s and _wfopen_s are not sharable. If you require that a file be sharable, use _fsopen, _wfsopen with the appropriate sharing mode constant—for example, _SH_DENYNO for read/write sharing. |
Сообщ.
#3
,
|
|
|
Цитата Qraizer @ Цитата Azopp @ Ну как же: fopen_s, _wfopen_sВ МСДН что-то про это не нашел в описании функции. Цитата Files that are opened by fopen_s and _wfopen_s are not sharable. If you require that a file be sharable, use _fsopen, _wfsopen with the appropriate sharing mode constant—for example, _SH_DENYNO for read/write sharing. Спасибо! Как-то не заметил вчера. Интересно, _fsopen() ближе к обычному fopen(), как я понял, но почему-то оно не 'deprecated'. |
![]() |
Сообщ.
#4
,
|
|
Устаревшими с точки зрения безопасности объявлены все те, которые в частности могут ненамеренно служить чёрным входом к личным данным и одновременно являются стандартными функциями, т.е. описываются Стандартом языка. С этой точки зрения дефолтовое разрешение совместного доступа может служить причиной утечки персональных данных, т.к. возможности указать режим разделения доступа отсутствует. Потому безопасная функция совместный доступ запрещает.
Указанная _fsopen() явно требует указывать режим разделения, а значит перекладывает ответственность с себя на программиста. При этом она не является стандартной функцией языка, т.е. использующий её программист с большей вероятностью знает, что делает, когда разрешает тот или иной режим разделения. Дурацкая ИМХО политика, но уж какова есть. |