История изменений
Исправление 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
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
Аааа, переполнение
Исправление 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=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
Исходная версия 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