0

嘿,我在 microsoft VS 上写了一些代码,假设将输入的密码与存储在数据库中的密码进行比较并返回批准或拒绝......它在 Windows 上运行得非常好,但在转换为 UNIX(使用 eclipse)之后发生了一件有趣的事情 -总是,第一次调用此函数时不会返回批准的值,但再次调用具有完全相同的参数的函数会返回批准的......根据需要。调试后,我很确定问题出在“strcmp”中,它在第一次运行时返回 false,在所有其他运行时返回 true,参数完全相同。

任何人都知道可能是什么问题?

命令示例: add jt 111 // 将密码添加到数据库

登录 jt 111

拒绝

登录 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");
    }
4

2 回答 2

3

我预测调用会返回一个指向缓冲区的指针,该缓冲区在函数返回Md5FromString(password)时不再有效。Md5FromString()这意味着您遇到了未定义的行为,并且在某些情况下会很幸运,而在其他情况下会很不幸。

将代码发布到Md5FromString().

于 2011-04-05T22:49:29.017 回答
1

我真的怀疑 strcmp() 有什么问题。:-)

(Andrew Hunt 和 David Thomas 有一本关于 SW 开发的优秀书籍,名为“The Pragmatic Programmer”,其中有一个关于调试的技巧,叫做“'select' is not broken”,这最终意味着基本的系统功能真的不太可能(例如 select() 或 strcmp())已损坏。)

您是否尝试在 strcmp() 之前打印“data[i].hash”的内容和“Md5FromString(password)”返回的值?

就像是:

            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() 的代码吗?

干杯,保罗

于 2011-04-05T23:45:40.553 回答