10 Ağustos 2017 Perşembe

memcmp

Giriş
Şu satırı dahil ederiz.
#include <string.h>
Döndürdüğü sonuç için açıklama şöyle
The memcmp() function returns an integer greater than, equal to, or less than zero, accordingly as the object pointed to by s1 is greater than, equal to, or less than the object pointed to by s2.
C11'deki açıklama şöyle
The sign of a nonzero value returned by the comparison functions memcmp, strcmp, and strncmp is determined by the sign of the difference between the values of the first pair of characters (both interpreted as unsigned char) that differ in the objects being compared.
POSIX'deki açıklama şöyle
The sign of a non-zero return value shall be determined by the sign of the difference between the values of the first pair of bytes (both interpreted as type unsigned char) that differ in the objects being compared.
Yani sadece >0, =0 ve <0 değerine bakmak gerekir.
Örnek
Şöyle yaparız.
int equal4(const char* a, const char* b)
{
  return memcmp(a, b, 4) == 0;
}

int less4(const char* a, const char* b)
{
  return memcmp(a, b, 4) < 0;
}
Örnek
Şöyle yaparız.
template <class T>
inline bool operator==(const T& a, const T& b)
{
  return memcmp(&a, &b, sizeof(a)) == 0;
}
Güvenlik
Açıklaması şöyle
Do not use memcmp() to compare security critical data, such as cryptographic secrets, because the required CPU time depends on the number of equal bytes. Instead, a function that performs comparisons in constant time is required.
Güvenlik ile alakalı bu açıklamanın izahı şöyle. memcmp ilk farklı byte değerini bulduğu zaman hemen döner. Saldırgan zamanları ölçerek hangi byte'ın farklı olduğunu bularak bir sürü deneme ile doğru byte dizisini bulabilir. Bu saldırı tipine "side channel attack" deniliyor. Açıklaması şöyle
Side channel attacks across the Internet are entirely possible. The jitter in latency can be compensated for with a bit of statistics.
Biraz evhamın ölçüsü kaçmış gibi :)

Hiç yorum yok:

Yorum Gönder