C \ UNIX \ strcmp первое использование неверно, исправить все остальное время - PullRequest
0 голосов
/ 06 апреля 2011

Привет всем, я написал код на Microsoft VS, который должен сравнивать введенные пароли с паролями, хранящимися в базе данных, и возвращать одобренные или отклоненные ... он отлично работал на windows, но после преобразования в UNIX (с использованием eclipse) произошла забавная вещь - всегда, первый вызов этой функции не возвращает утвержденное значение, когда это необходимо, но повторный вызов функции с точно такими же параметрами возвращает утверждено ... по желанию. после отладки я почти уверен, что проблема в «strcmp», который возвращает false при первом запуске и true во всех остальных запусках с точно такими же параметрами.

у кого-нибудь есть идея, в чем может быть проблема ??

пример для команд: добавить JT 111 // добавляем пароль в БД

логин jt 111

1011 * отказано *

логин jt 111

одобрено

void login_helper(char *user, char *password){
        int found = 0;
        int i;
        for (i=0 ; i<space ; i++){
            if (strcasecmp(data[i].name,user) == 0) {
                found = 1;
                if (strcmp(data[i].hash ,Md5FromString(password)) == 0)
                    {
                    printf("approved.\n");
                    break;
                }
                else {
                    printf("denied.\n");
                    break;
                }
            }
        }
        if (found == 0) printf("denied.\n");
    }

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Я предсказываю, что вызов Md5FromString(password) возвращает указатель на буфер, который больше не действителен, когда возвращается функция Md5FromString(). Это будет означать, что вы сталкиваетесь с неопределенным поведением, и в некоторых случаях вам везет, а в других - не везет.

Отправьте код на Md5FromString().

1 голос
/ 06 апреля 2011

Я действительно сомневаюсь, что есть какая-то проблема в strcmp ().: -)

(есть отличная книга по разработке ПО под названием «Прагматичный программист» Эндрю Ханта и Дэвида Томаса, в которой есть совет по отладке под названием «выбор» не сломан », что в конечном итоге означаетчто действительно маловероятно, что базовая системная функция (например, select () или strcmp ()) не работает.)

Вы пытались распечатать содержимое data [i] .hash и возвращенное значение?'Md5FromString (password)' прямо перед strcmp ()?

Что-то вроде:

            char *md5;
            ...
            md5 = Md5FromString(password);
            printf("i: %d, hash: %s, md5: %s\n", i, data[i].hash, md5);
            if (strcmp(data[i].hash, md5) == 0)
                {
                ...

Кроме того, кто выделяет память для функции Md5FromString ()?Вы можете отправить код для Md5FromString ()?

Ура, Пауло

...