powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что в функции не так?
25 сообщений из 29, страница 1 из 2
Что в функции не так?
    #39734108
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нравится, но не пойму, что именно в этой функции(не моей, нашел в чужом коде)
не так, когда возможны пробои памяти и т.д.
Это такой типа заменитель сравнивалки строк.

Подскажите, где стремные места

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int compareSubstring(int i, const char* str, int len, const char* subStr)
{
	int si = 0;

	for (; subStr[si] != 0; ++si, ++i)
		if ((i + 1) > len || subStr[si] != str[i])
			return 0;
	return 1;
}
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734118
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

А чем strcmp - не подходит?
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734120
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинПодскажите, где стремные места

Снаружи. Из-за отсутствия каких-либо проверок на вменяемость параметров эту функцию легко
неправильно вызвать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734129
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserА чем strcmp - не подходит?

strcmp требует две нуль-терминированные строки, чего в данном случае не наблюдается.
strncmp облажается если длина строки меньше длины образца.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734131
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovstrcmp требует две нуль-терминированные строки, чего в данном случае не наблюдается.

В for - идет сравнение с нулем. Значит они нуль терминированные!

strncmp облажается если длина строки меньше длины образца.

А если указатели передать неизвестно на что вообще ерунда будет!
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734137
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserВ for - идет сравнение с нулем.

Только для subStr. Сама строка задаётся с длиной.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734139
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Тогда расскажите что каждый параметр означает?
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734149
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserТогда расскажите что каждый параметр означает?

А самому догадаться сложно?

Первый - начальная позиция для поиска.
Второй - указатель на блок данных.
Третий - длина блока данных.
Четвёртый - образец для поиска (вероятнее всего используется литерал).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734154
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovblonduserТогда расскажите что каждый параметр означает?

А самому догадаться сложно?

Первый - начальная позиция для поиска.
Второй - указатель на блок данных.
Третий - длина блока данных.
Четвёртый - образец для поиска (вероятнее всего используется литерал).


Молодец.
Призовая игра.

Код: plaintext
1.
if(len - i > 0) strncmp(str+ i, subStr, len - i);
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734163
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovblonduserВ for - идет сравнение с нулем.

Только для subStr. Сама строка задаётся с длиной.


Теоретически с длиной, а практически там может быть, что угодно, я не пойму этот идиотизм, зачем передавать длину параметром, вместо того, чтобы брать ее внутри функцц
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734164
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserМолодец.
Призовая игра.

Маладец, теперь промоделируй вызов compareSubstring(0, "a", 1, "abc");
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734254
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинDimitry Sibiryakovпропущено...

Только для subStr. Сама строка задаётся с длиной.


Теоретически с длиной, а практически там может быть, что угодно, я не пойму этот идиотизм, зачем передавать длину параметром, вместо того, чтобы брать ее внутри функцц
первых три параметра это то что в С++ называется std::string_view.

я бы как минимум добавил проверку на конец строки.
Код: plaintext
1.
for (; subStr[si] != 0 && str[i] != 0; ++si, ++i)
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734293
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCcРолг Хупинпропущено...


Теоретически с длиной, а практически там может быть, что угодно, я не пойму этот идиотизм, зачем передавать длину параметром, вместо того, чтобы брать ее внутри функцц
первых три параметра это то что в С++ называется std::string_view.

я бы как минимум добавил проверку на конец строки.
Код: plaintext
1.
for (; subStr[si] != 0 && str[i] != 0; ++si, ++i)



да, только там i - параметр, он может быть и за пределами строки

Сделал так

Код: plaintext
1.
2.
3.
4.
int  minlen = min(strlen(str),len);

	for (; subStr[si] != 0 && i<=minlen && str[i] != 0; ++si, ++i)
		if (subStr[si] != str[i]) return 0;
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734299
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинда, только там i - параметр, он может быть и за пределами строки

Вам виднее. Я разделяю функции по параметрам на два типа. Уровня API и внутренние. В последних параметры должны быть гарантированно правильные.
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734303
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинСделал так

"Поздравляю, Шарик", ты только что породил бага, приводящего к сегфолту в случаях если
данные в буфере не имеют нуля на конце.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734322
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупиня не пойму этот идиотизм, зачем передавать длину параметром, вместо того, чтобы брать ее внутри функцц
Во-первых производительность - эта функция вызывается неоднократно (снаружи есть i++), т.к. надо найти подстроку в строке.
Во-вторых строка сама может быть подстрокой в наборе строк с каким-то разделителем, например ';'.
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734325
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинСделал так
Фигню сделал. Вопрос зачем?

Скорее всего тут нездоровое в параметрах: str или subStr указывают на несуществующую память. В итоге сглючивает тут, но проблема выше в месте вызова, как уже подметили 21736387
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734339
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovРолг ХупинСделал так

"Поздравляю, Шарик", ты только что породил бага, приводящего к сегфолту в случаях если
данные в буфере не имеют нуля на конце.


да? и чем же стало хуже?

Я добавил проверку на 0 и + беру минимум длины строки и переданной длины
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734341
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут ты только тормоз добавил
Код: plaintext
1.
int  minlen = min(strlen(str),len);
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734342
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И как написал Dimitry Sibiryakov - strlen(str) может вызвать segfault
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734344
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупини чем же стало хуже?

Повторяю медленно: твой код упадёт с ошибкой segmentation fault (access violation) на
вызове strlen() если у str на конце нет терминирующего нуля.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734350
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovРолг Хупини чем же стало хуже?

Повторяю медленно: твой код упадёт с ошибкой segmentation fault (access violation) на
вызове strlen() если у str на конце нет терминирующего нуля.


Имхуется мне, что по сравнению с исходным вариантом (1-й пост) хуже не стало, разве что , если нет 0 на конце строки, то надо доверять переданной длине....
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734353
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин... если нет 0 на конце строки, то надо доверять переданной длине....
если нет 0 на конце строки, то твоя прога вылетит на strlen(str)
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734354
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинИмхуется мне, что по сравнению с исходным вариантом (1-й пост) хуже не стало

Исходный вариант не приводил к этой ошибке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что в функции не так?
    #39734357
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин, еще раз повторю:

Скорее всего тут нездоровое в параметрах: str или subStr указывают на несуществующую память. В итоге сглючивает тут, но проблема выше в месте вызова, как уже подметили 21736387
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что в функции не так?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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