Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Цикл по массиву / 8 сообщений из 8, страница 1 из 1
03.07.2018, 07:23
    #39668569
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по массиву
Может я уже туплю, неужели в этой функции всё хорошо и нет выхода за пределы выделенной памяти?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
static size_t
convert_from_pgbinary(const char *value, char *rgbValue, SQLLEN cbValueMax)
{
	size_t		i,
				ilen = strlen(value);
	size_t			o = 0;

	for (i = 0; i < ilen;)
	{
		if (value[i] == BYTEA_ESCAPE_CHAR)
		{
			if (value[i + 1] == BYTEA_ESCAPE_CHAR) //<---------------------?
			{
				if (rgbValue)
					rgbValue[o] = value[i];
				o++;
				i += 2;
			}
			else if (value[i + 1] == 'x')//<---------------------?
			{
				i += 2;
				if (i < ilen)
				{
					ilen -= i;
					if (rgbValue)
						pg_hex2bin(value + i, rgbValue + o, ilen);
					o += ilen / 2;
				}
				break;
			}
			else
			{
				if (rgbValue)
					rgbValue[o] = conv_from_octal(&value[i]);
				o++;
				i += 4;
			}
		}
...
Рейтинг: 0 / 0
03.07.2018, 07:27
    #39668570
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по массиву
Нет выхода, т.к. в конце 0-й байт, т.е.
Код: plaintext
1.
value[strlen(value)] == 0


ASCIIZ-строка
...
Рейтинг: 0 / 0
03.07.2018, 07:50
    #39668580
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по массиву
Dima TНет выхода, т.к. в конце 0-й байт, т.е.
Код: plaintext
1.
value[strlen(value)] == 0


ASCIIZ-строка


А вот здесь, когда i = ilen-1, т.е. на последнем элементе
они смело идут за пределы
if (value[i + 1]
...
Рейтинг: 0 / 0
03.07.2018, 08:02
    #39668581
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по массиву
Ролг ХупинА вот здесь, когда i = ilen-1, т.е. на последнем элементе
они смело идут за пределы
if (value[i + 1]
Нет, потому что i + 1 == strlen(value), т.е. value[i + 1] == 0

ASCIIZ-строка занимает strlen(value) + 1 байт. Ссылку почитал?
...
Рейтинг: 0 / 0
03.07.2018, 08:15
    #39668583
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по массиву
Например строка "ABC" хранится как {'A', 'B', 'C', 0}, т.е. 4 байта, но strlen("ABC") == 3
...
Рейтинг: 0 / 0
03.07.2018, 08:26
    #39668585
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по массиву
Dima TРолг ХупинА вот здесь, когда i = ilen-1, т.е. на последнем элементе
они смело идут за пределы
if (value[i + 1]
Нет, потому что i + 1 == strlen(value), т.е. value[i + 1] == 0

ASCIIZ-строка занимает strlen(value) + 1 байт. Ссылку почитал?

это то ясно, но они ведь не на 0 проверяют, а допукают, что там еще символы
...
Рейтинг: 0 / 0
03.07.2018, 08:42
    #39668590
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по массиву
Ролг Хупинэто то ясно, но они ведь не на 0 проверяют, а допукают, что там еще символы
Там обработка текущего символа в зависимости от следующего. У последнего следующий 0.
Это какой-то парсер строки определенного формата, надо смотреть описаловку формата, а потом уже решать допустимо ли парсить таким образом.

Изначально ты другой вопрос задал:
Ролг Хупиннет выхода за пределы выделенной памяти?
я тебе выше ответил что нет, и выше разъяснил почему.
...
Рейтинг: 0 / 0
11.07.2018, 09:14
    #39672374
a guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по массиву
Ролг ХупинМожет я уже туплю, неужели в этой функции всё хорошо и нет выхода за пределы выделенной памяти?Если строка не может заканчиваться на BYTEA_ESCAPE_CHAR, то нет.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Цикл по массиву / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]