Вопрос № 73798: Здравствуйте. Подзадолбал меня уже Visual своими предупреждениями насчет стандартных строковых С-функций. Например:
warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.
Я смотрел в MSDN эти "...Вопрос № 73837: Здраствуйте!!! Я никак не могу найти как рисовать или вставлять текст вне сообщение WM_PAINT. Или какие есть еще функции вывода тектса в рабочию область кроме DrawText()
И еще один вопрос: никак не могу определить акселераторы в ресурсах! Если мо...Вопрос № 73858: Есть ли в составе wininet.dll функция для определения даты создания
файла, который нужно скачать. Т.е. основываясь на дате надо определить стоит ли скачивать обнавление....
Вопрос № 73.798
Здравствуйте. Подзадолбал меня уже Visual своими предупреждениями насчет стандартных строковых С-функций. Например:
warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.
Я смотрел в MSDN эти " ..._s" функции - это почти тоже самое, только добавлен еще один параметр - размер буфера-приемника.
До сих пор я не обращал на такие предупреждения внимания, относился к ним как к "защите от дурака". Но может быть я просто мало знаю и могут быть "подводные камни" на уровне ниже API. Например что нибуть связанное с многопоточностью и т. п. И может приключиться
какой нибудь "unsafe" по не зависящим от меня причинам.
Вопрос такой: Стоит ли применять этот "язык С++ от Microsoft"?
Спасибо.
Отправлен: 02.02.2007, 18:28
Вопрос задал: Lameruga (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 3)
Отвечает: Базанов Иван Александрович
Здравствуйте, Lameruga!
Употреблять стоит - это защита от переполнения буфера приемника.
--------- Программист ошибается дважды: первый раз при рождении, второй при выборе профессии
Ответ отправил: Базанов Иван Александрович (статус: 3-ий класс)
Ответ отправлен: 02.02.2007, 18:53 Оценка за ответ: 4
Отвечает: burbot
Здравствуйте, Lameruga!
С моей точки зрения ответ однозначен - ДА! Использовать стоит. Более того это необходимо если Вы пишете программу, которая выполняет некие функции системного администрирования с привилегиями суперпользователя.
Дело в том, что стандартные функции strcat, strcpy и т.д. не выполняют проверку переполения буфера. Они ориентируются только на то, что каждая строка должна заканчиваться нулевым символом.
Возьмем, к примеру, функцию strcat (добавляет строку в конец другой строки).
Она принимает всего два параметра: указатель на буфер-приемник и указатель на буфер-источник.
Допустим, что размер памяти, отведенный для буфера-приемника, равен 256 байт.
Если в качестве буфера-источника передать строку длиной, скажем, 512 байт и допустить, что буфер-приемник был до выполнения функции пуст, то 256 байт буфера-источника лягут в буфер-приемник, а остальные 256 байт лягут в память сразу после буфера-приемника. А там может быть все, что угодно, как данные, так и код программы.
Как программист Вы знаете, что у Вас буфер-приемник всего 256 байт и не станете передавать функции буфер-источник больше этого размера.
НО!!! Допустим, что Вы сами не знаете заранее длину буфера-источника. Скажем, Вы считываете строку из Edit-контрола какого-либо диалогового окна и передаете считанную строку функции strcat в качестве буфера-источника.
Вот тут-то у Вас и появилось потенциально уязвимое место в Вашей программе, которое с радостью воспримет какой-либо кул-хацкер, написав к Вашей программе так называемый ЭКСПЛОЙТ, т.е. программу, которая использует уязвимость другой программы для разрушения защиты этой программы и выполнения вредоносных действий.
Уязвимость такого рода называется ПЕРЕПОЛНЕНИЕМ БУФЕРА.
Надеюсь, написал хоть и длинно, зато понятно.
Поищите в инете информацию по каким либо эксплойтам на переполнение буфера.
Вы будете удивлены, как их много ;)
Лично я для работы со строками использую либо самописные функции, в которых производится проверка на переполение буфера, либо использую функции типа StringCb... или StringCch... , которые объявлены в файле strsafe.h из состава PlatformSDK.
Всего доброго!
--------- Хорошо смеется тот, кто смеется над собой. (C)
Ответ отправил: burbot (статус: 2-ой класс)
Ответ отправлен: 02.02.2007, 20:10 Оценка за ответ: 5 Комментарий оценки: Убедили. Respect.
Вопрос № 73.837
Здраствуйте!!! Я никак не могу найти как рисовать или вставлять текст вне сообщение WM_PAINT. Или какие есть еще функции вывода тектса в рабочию область кроме DrawText()
И еще один вопрос: никак не могу определить акселераторы в ресурсах! Если можно сылки на примеры сделаны на Cи!
Спасибо!!!
Отправлен: 02.02.2007, 23:34
Вопрос задал: HITY (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Tek
Здравствуйте, HITY!
По поводу вывода текста:
Есть еще TextOut, ExtTextOut, PolyTextOut, DrawTextEx.
Только чем вас не устраивает DrawText просто. Им можно рисовать и вне WM_PAINT.
Если проблема в отсутствии контекста устройства, то его можно получать функциями GetDC, GetWindowDC, CreateCompatibleDC и т. д.
--------- WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 9-ый класс)
Ответ отправлен: 05.02.2007, 09:23 Оценка за ответ: 4 Комментарий оценки: спасибо, но хотелось бы еще пример!!
Отвечает: Лысков Игорь Витальевич
Здравствуйте, HITY!
По поводу акселераторов:
// константы (примерные)
#define IDA_ACCEL 0x100
#define IDM_EXIT 0x200
// выделяем память под handle
HACCEL hAccel ;
// загружаем
hAccel = LoadAccelerators( hInstance, MAKEINTRESOURCE( IDA_ACCEL ) ) ;
// используем
while (GetMessage( &msg, NULL, 0, 0 ))
{
if (!TranslateAccelerator( hWnd, hAccel, &msg ))
{
TranslateMessage( &msg ) ;
DispatchMessage( &msg ) ;
}
}
// ну и описываем в ресурсах
IDA_ACCEL ACCELERATORS MOVEABLE PURE
BEGIN
VK_F7, IDM_EXIT, VIRTKEY, SHIFT, NOINVERT
END
//В результате, при нажатии Shift+F7 придет сообщение WM_COMMAND с параметром IDM_EXIT
PS А вообще, читаем MSDN...
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 05.02.2007, 19:26 Оценка за ответ: 5 Комментарий оценки: спасибо! только у меня MSDN нет где можно его скачать??
Вопрос № 73.858
Есть ли в составе wininet.dll функция для определения даты создания
файла, который нужно скачать. Т.е. основываясь на дате надо определить стоит ли скачивать обнавление.
Отправлен: 03.02.2007, 07:40
Вопрос задал: Bcd (статус: 1-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: burbot
Здравствуйте, Bcd!
Все зависит от протокола, который Вы используете.
Для FTP:
-----------
Функция FtpFindFirstFile.
В качестве параметра Вы передаете этой функции указатель на структуру WIN32_FIND_DATA. Функция заполняет эту структуру данными. В структуре присутствуют:
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
Для Gopher:
-----------
Функция GopherFindFirstFile.
В качестве параметра Вы передаете этой функции указатель на структуру GOPHER_FIND_DATA. Функция заполняет эту структуру данными. Вот только даты создания в этой структуре нет. Есть только дата последней модификации:
FILETIME LastModificationTime;
Для HTTP:
------------
С протоколом HTTP будет чуть-чуть посложнее. Для него нет подобных функций. И тоже, насколько мне известно, невозможно получить дату создания. Можно только дату последней модификации. Копайте в сторону HttpOpenRequest, HttpAddRequestHeaders, HttpQueryInfo с флагами HTTP_QUERY_LAST_MODIFIED и HTTP_QUERY_FLAG_SYSTEMTIME.
Всего доброго!
--------- Хорошо смеется тот, кто смеется над собой. (C)
Ответ отправил: burbot (статус: 2-ой класс)
Ответ отправлен: 06.02.2007, 19:30 Оценка за ответ: 5 Комментарий оценки: Спасибо за обширный ответ!