Здравствуйте, z00n, Вы писали:
Z>Онлайн демо грядущей разработки MS (http://research.microsoft.com/en-us/projects/pex/)
Z>http://www.pexforfun.com/
Ну для кого "грядущей", а для других вполне нормально и сейчас используемой.
Здравствуйте, z00n, Вы писали:
Z>Онлайн демо грядущей разработки MS (http://research.microsoft.com/en-us/projects/pex/)
Z>http://www.pexforfun.com/
Дык в MSDN Magazine про неё писали ещё с полгода назад...
Здравствуйте, z00n, Вы писали:
Z>http://www.pexforfun.com/
Черт, машина оказалась умнее меня

Хотел нагрузить её задачкой
public static string Puzzle(int x)
{
if (x <= 0) { return "nice try"; }
while (x > 1)
{
if (x % 2 == 0) { x = x / 2; }
else { x = x * 3 + 1; }
}
return x.ToString();
}
так она помимо "nice try" и "1" в числе возможных вариантов нашла совершенно мной не предвиденное (Аноним может себе позволить признаться) значение "0". Вердикт — срочно в продакшен круглосуточно крутиться на сервере и искать баги.
Здравствуйте, koandrew, Вы писали:
K>Дык в MSDN Magazine про неё писали ещё с полгода назад...
Это анонс сайта
http://www.pexforfun.com а не самого Pex'а
Здравствуйте, z00n, Вы писали:
Z>Онлайн демо грядущей разработки MS (http://research.microsoft.com/en-us/projects/pex/)
Z>http://www.pexforfun.com/
а про что это? — чет ниче не понял
А>А> public static string Puzzle(int x)
А> {
А> if (x <= 0) { return "nice try"; }
А> while (x > 1)
А> {
А> if (x % 2 == 0) { x = x / 2; }
А> else { x = x * 3 + 1; }
А> }
А> return x.ToString();
А> }
А>
А>так она помимо "nice try" и "1" в числе возможных вариантов нашла совершенно мной не предвиденное (Аноним может себе позволить признаться) значение "0". Вердикт — срочно в продакшен круглосуточно крутиться на сервере и искать баги.
А как тут 0 может сыграть ? Он же по нему сразу выйти должен по первому условию x<=0
Здравствуйте, Аноним, Вы писали:
А>а про что это? — чет ниче не понял
А почитать описание не судьба?
Коротко — автоматический тул для анализа кода и создания юнит-тестов.
Здравствуйте, z00n, Вы писали:
Z>Онлайн демо грядущей разработки MS (http://research.microsoft.com/en-us/projects/pex/)
Pex не смог придумать никаких интересных входных данных для таких методов:
public static void Foo(object x)
{
if (x is Func<string>)
throw new Exception();
}
public static void Foo(object x)
{
if (x is Array)
throw new Exception();
}
public static void Foo(object x)
{
if (x != null && x.Equals(DayOfWeek.Friday))
throw new Exception();
}
public static void Foo(Type x)
{
if (x != null && x.IsGenericType)
throw new Exception();
}
public static void Foo(Type x)
{
if (x != null && x.IsClass)
throw new Exception();
}
public static void Foo(Array x)
{
if (x != null && x.Rank == 1)
throw new Exception();
}
public static void Foo(Array x)
{
if (x != null && x.Length == 1)
throw new Exception();
}
Но, в целом, тул очень интересный.
Здравствуйте, Аноним, Вы писали:
А>>А>> public static string Puzzle(int x)
А>> {
А>> if (x <= 0) { return "nice try"; }
А>> while (x > 1)
А>> {
А>> if (x % 2 == 0) { x = x / 2; }
А>> else { x = x * 3 + 1; }
А>> }
А>> return x.ToString();
А>> }
А>>
А>>так она помимо "nice try" и "1" в числе возможных вариантов нашла совершенно мной не предвиденное (Аноним может себе позволить признаться) значение "0". Вердикт — срочно в продакшен круглосуточно крутиться на сервере и искать баги.
А>А как тут 0 может сыграть ? Он же по нему сразу выйти должен по первому условию x<=0
Тут фишка — в переполнениях типа int в строке, где производится умножение на 3.
Рассмотрим упрощённый случай, когда переполнение будет на первой же итерации цикла while.
Первое переполнение для int происходит при переходе от 2^31-1 (int.MaxValue) к 2^31 (int.MinValue).
Соответственно, в нашем случае минимальным нечётным x, при котором выражение x * 3 + 1 превысит 2^31-1, будет
x = 715827883 (результатом программы будет число -2147483646).
При дальнейшем увеличении x с шагом 2 будем получать на выходе похожие отрицательные числа, растущие к 0.
Второе переполнение для int происходит при переходе от 2^32-1 к 2^32.
Аналогично, минимальным нечётным x, при котором выражение x * 3 + 1 превысит 2^32-1, будет
x = 1431655765, а результатом программы будет наш искомый 0