LINUX.ORG.RU

История изменений

Исправление superuser, (текущая версия) :

Что-то сильно опасна ваша Сишечка.
Почему if в Си так опасно себя ведёт?

#include <stdio.h>
#include <stdint.h> // SIZE_MAX

int is_contained(size_t h0, size_t hlen, size_t q0, size_t qlen)
{
	printf("h0=%lu\n", h0);
	printf("hlen=%lu\n", hlen);
	printf("q0=%lu\n", q0);
	printf("qlen=%lu\n", qlen);
	
    if (q0 < h0) return 1;
    if (q0 + qlen < h0) return 2;
    if (q0 + qlen > h0 + hlen) return 3;
    return 0;
}

int main (int argc, char ** argv) {
    int r;
    //printf("SIZE_MAX=%lu\n\n", SIZE_MAX);
    r=is_contained(10, SIZE_MAX,  0, SIZE_MAX); printf("r=%u\n\n", r);
    r=is_contained(10, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r); // ужас: r=2
    r=is_contained( 0, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r);
}
h0=10
hlen=18446744073709551615
q0=0
qlen=18446744073709551615
r=1

h0=10
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=2

h0=0
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=0
cast wandrien
Upd: понял, переполнение

Исправление superuser, :

Что-то сильно опасна ваша Сишечка.
Почему if в Си так опасно себя ведёт?

#include <stdio.h>
#include <stdint.h> // SIZE_MAX

int is_contained(size_t h0, size_t hlen, size_t q0, size_t qlen)
{
	printf("h0=%lu\n", h0);
	printf("hlen=%lu\n", hlen);
	printf("q0=%lu\n", q0);
	printf("qlen=%lu\n", qlen);
	
    if (q0 < h0) return 1;
    if (q0 + qlen < h0) return 2;
    if (q0 + qlen > h0 + hlen) return 3;
    return 0;
}

int main (int argc, char ** argv) {
    int r;
    //printf("SIZE_MAX=%lu\n\n", SIZE_MAX);
    r=is_contained(10, SIZE_MAX,  0, SIZE_MAX); printf("r=%u\n\n", r);
    r=is_contained(10, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r); // ужас: r=2
    r=is_contained( 0, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r);
}
h0=10
hlen=18446744073709551615
q0=0
qlen=18446744073709551615
r=1

h0=10
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=2

h0=0
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=0
cast wandrien
Аааа, переполнение

Исправление superuser, :

Что-то сильно опасна ваша Сишечка.
Почему if в Си так опасно себя ведёт?

#include <stdio.h>
#include <stdint.h> // SIZE_MAX

int is_contained(size_t h0, size_t hlen, size_t q0, size_t qlen)
{
	printf("h0=%lu\n", h0);
	printf("hlen=%lu\n", hlen);
	printf("q0=%lu\n", q0);
	printf("qlen=%lu\n", qlen);
	
    if (q0 < h0) return 1;
    if (q0 + qlen < h0) return 2;
    if (q0 + qlen > h0 + hlen) return 3;
    return 0;
}

int main (int argc, char ** argv) {
    int r;
    //printf("SIZE_MAX=%lu\n\n", SIZE_MAX);
    r=is_contained(10, SIZE_MAX,  0, SIZE_MAX); printf("r=%u\n\n", r);
    r=is_contained(10, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r); // ужас: r=2
    r=is_contained( 0, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r);
}
h0=10
hlen=18446744073709551615
q0=0
qlen=18446744073709551615
r=1

h0=10
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=2

h0=0
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=0
cast wandrien

Исправление superuser, :

Что-то сильно опасна ваша Сишечка.
Почему if в Си так опасно себя ведёт?

#include <stdio.h>
#include <stdint.h> // SIZE_MAX

int is_contained(size_t h0, size_t hlen, size_t q0, size_t qlen)
{
	printf("h0=%lu\n", h0);
	printf("hlen=%lu\n", hlen);
	printf("q0=%lu\n", q0);
	printf("qlen=%lu\n", qlen);
	
    if (q0 < h0) return 1;
    if (q0 + qlen < h0) return 2;
    if (q0 + qlen > h0 + hlen) return 3;
    return 0;
}

int main (int argc, char ** argv) {
    int r;
    //printf("SIZE_MAX=%lu\n\n", SIZE_MAX);
    r=is_contained(10, SIZE_MAX,  0, SIZE_MAX); printf("r=%u\n\n", r);
    r=is_contained(10, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r); // ужас: r=2
    r=is_contained( 0, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r);
}
h0=10
hlen=18446744073709551615
q0=0
qlen=18446744073709551615
r=1

h0=10
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=2

h0=0
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=0

Исправление superuser, :

Что-то сильно опасна ваша Сишечка.
Почему if в Си так опасно себя ведёт?

#include <stdio.h>
#include <stdint.h> // SIZE_MAX

int is_contained(size_t h0, size_t hlen, size_t q0, size_t qlen)
{
	printf("h0=%lu\n", h0);
	printf("hlen=%lu\n", hlen);
	printf("q0=%lu\n", q0);
	printf("qlen=%lu\n", qlen);
	
    if (q0 < h0) return 1;
    if (q0 + qlen < h0) return 2;
    if (q0 + qlen > h0 + hlen) return 3;
    return 0;
}

int main (int argc, char ** argv) {
    int r;
    //printf("SIZE_MAX=%lu\n\n", SIZE_MAX);
    r=is_contained(10, SIZE_MAX,  0, SIZE_MAX); printf("r=%u\n\n", r);
    r=is_contained(10, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r); // ужас
    r=is_contained( 0, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r);
}
h0=10
hlen=18446744073709551615
q0=0
qlen=18446744073709551615
r=1

h0=10
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=2

h0=0
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=0

Исправление superuser, :

Что-то сильно опасна ваша Сишечка

#include <stdio.h>
#include <stdint.h> // SIZE_MAX

int is_contained(size_t h0, size_t hlen, size_t q0, size_t qlen)
{
	printf("h0=%lu\n", h0);
	printf("hlen=%lu\n", hlen);
	printf("q0=%lu\n", q0);
	printf("qlen=%lu\n", qlen);
	
    if (q0 < h0) return 1;
    if (q0 + qlen < h0) return 2;
    if (q0 + qlen > h0 + hlen) return 3;
    return 0;
}

int main (int argc, char ** argv) {
    int r;
    //printf("SIZE_MAX=%lu\n\n", SIZE_MAX);
    r=is_contained(10, SIZE_MAX,  0, SIZE_MAX); printf("r=%u\n\n", r);
    r=is_contained(10, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r); // ужас
    r=is_contained( 0, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r);
}
h0=10
hlen=18446744073709551615
q0=0
qlen=18446744073709551615
r=1

h0=10
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=2

h0=0
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=0
А почему if в Си так опасно себя ведёт?

Исходная версия superuser, :

Что-то сильно опасна ваша Сишечка

#include <stdio.h>
#include <stdint.h> // SIZE_MAX

int is_contained(size_t h0, size_t hlen, size_t q0, size_t qlen)
{
	printf("h0=%lu\n", h0);
	printf("hlen=%lu\n", hlen);
	printf("q0=%lu\n", q0);
	printf("qlen=%lu\n", qlen);
	
    if (q0 < h0) return 1;
    if (q0 + qlen < h0) return 2;
    if (q0 + qlen > h0 + hlen) return 3;
    return 0;
}

int main (int argc, char ** argv) {
	int r;
    //printf("SIZE_MAX=%lu\n\n", SIZE_MAX);
    r=is_contained(10, SIZE_MAX,  0, SIZE_MAX); printf("r=%u\n\n", r);
    r=is_contained(10, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r); // ужас
    r=is_contained( 0, SIZE_MAX, 10, SIZE_MAX); printf("r=%u\n\n", r);
}
h0=10
hlen=18446744073709551615
q0=0
qlen=18446744073709551615
r=1

h0=10
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=2

h0=0
hlen=18446744073709551615
q0=10
qlen=18446744073709551615
r=0
А почему if в Си так опасно себя ведёт?