LINUX.ORG.RU

Pointer dereference + postincrement, будет ли UD?

 , ,


0

2

Зравствуйте!

Есть задача разбить строку вида <login>/<password> на две. Делаю вот так:

char *login = getInput(); // getInput возвращает сабжевую строку
char *password = strchr(login, '/');
if (! password) {
    // handle error
}
*password++ = '\0';

printf("login: %s\npassword: %s\n", login, password);

Всё бы хорошо, но одна строчка вызывает подозрение на UD:

*password++ = '\0';
Данная строчка должна заменить '/' на '\0'. Но где-то я слышал, что постинкремент укразателя как lvalue может вызвать UD.

Ответ на: комментарий от emulek

может это совсем не логин/пароль?

А что ещё может быть в переменных login и password?

может это static переменная? Или там свой alloc с GC и подсчётом ссылок?

Пусть ТС лучше скажет. Я использовал хрустальный шар и он говорит мне что там ручное управление памятью. Алсо, такое использование памяти может сбить GC с толку.

ТС спрашивал не об этом.

Я знаю, это мои пять копеек.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Пусть ТС лучше скажет. Я использовал хрустальный шар и он говорит мне что там ручное управление памятью. Алсо, такое использование памяти может сбить GC с толку.

он уже сказал, там у его

DESCRIPTION The strdup() function returns a pointer to a new string which is a duplicate of the string s. Memory for the new string is obtained with malloc(3), and can be freed with free(3).

Я знаю, это мои пять копеек.

да, я был неправ.

emulek
()
Ответ на: комментарий от true_admin

Пусть ТС лучше скажет. Я использовал хрустальный шар и он говорит мне что там ручное управление памятью.

Если вкратце,то да: там самописный аллокатор + объект контекста. Сабжевый вызов происходит в main, а getInput возвращает указатель на элемент (единожды) скопированного argv.

KennyMinigun ★★★★★
() автор топика
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от emulek

strdup в коде примера я использовал, чтоб не модифицировать строковую константу, ибо это UB. Хотя можно было для каноничности сделать так:

char login[] = "login/password"; 

KennyMinigun ★★★★★
() автор топика
Ответ на: комментарий от KennyMinigun

чтоб не модифицировать строковую константу, ибо это UB.

не, это не UB. Тут тебе сразу система по рукам даст(программу грохнет), если ты туда полезешь, так только в MS-DOS можно было баловаться ☺

я понял, что мне в твоём коде не нравится: для этого есть стандартная strtok(3). Читай ман, там и примерчик есть.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.