obfy icon indicating copy to clipboard operation
obfy copied to clipboard

check_license() and check_license1() from the README do not behave identical

Open BullyWiiPlaza opened this issue 5 years ago • 3 comments

The README introduces a non-obfuscated example check_license() code and an obfuscated check_license1() code. Logically, generating a key based on the user name and then checking the license should always return 1:

const auto user_name = "obfy";
const auto generated_license = generate_license(user_name);
const auto is_license_valid = check_license1(user_name, generated_license.c_str());
std::cout << "License valid: " << is_license_valid << std::endl;

If I run this code it actually prints 0 using check_license1() but 1 using check_license() regardless of debug or release build. Shouldn't both functions behave idental? Why don't they?

BullyWiiPlaza avatar Jun 22 '20 22:06 BullyWiiPlaza

Thanks for reporting this issue, let me check the reason for this misbehaviour and I will get back to this thread when I have some conclusion why this happens.

fritzone avatar Jun 24 '20 09:06 fritzone

The problem is with the post-increment operator in this line:

V(current) += user[V(i)++];

Changing it to

V(current) += user[V(i)];
V(i)++;

makes the sample work.

The root cause appears to be this implementation of the post-increment operator:

    /* post increment/decrement */
    refholder<T> operator++(int) { refholder<T> rv(*this); operator ++(); return rv; }

I only had a brief look at the code but it seems refholder<T> rv(*this) only creates a shallow copy, the reference continues to point to the same underlying value so it will get mutated by operator++.

chausner avatar Jan 30 '21 00:01 chausner

Any updates on this matter regarding pull requests or commits to the repository?

BullyWiiPlaza avatar Aug 06 '22 10:08 BullyWiiPlaza