0

入力されたパスワードをデータベースに保存されているパスワードと比較し、承認または拒否を返すと思われるMicrosoft VSでコードを書きました... Windowsでは完全に機能しましたが、UNIXに変換した後(Eclipseを使用)、面白いことが起こりました-常に、この関数への最初の呼び出しは、承認された値を返す必要がありますが、まったく同じパラメーターで関数を再度呼び出すと、承認された...必要に応じて返されます。デバッグ後、問題は「strcmp」にあると確信しています。これは、最初の実行で false を返し、まったく同じパラメーターでの他のすべての実行で true を返します。

何が問題なのか誰にも考えがありますか??

コマンドの例: add jt 111 // パスワードを DB に追加する

ログイン 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 による「The Pragmatic Programmer」という SW 開発に関する優れた本があり、「'select' は壊れていない」というデバッグに関するヒントが含まれています。 (たとえば、select() または strcmp()) は壊れています。)

'data[i].hash' の内容と strcmp() の直前に 'Md5FromString(password)' によって返された値を printf しようとしましたか?

何かのようなもの:

            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 に答える