Re: [C#, Этюд] SortedSet
От: Пельмешко Россия blog
Дата: 19.07.10 17:16
Оценка: 57 (5)
Здравствуйте, nikov, Вы писали:

N>
N>using System.Collections.Generic;

N>public class C
N>{
N>    public static bool Foo(string x, string y)
N>    {
N>        var s = new SortedSet<string>();
N>        s.Add(x);
N>        return x.Length != y.Length && s.Contains(y);
N>    }
N>}
N>


N>Может ли метод Foo вернуть true?


Легко:
Foo("abc", "abc\0\0");

Корень зла?
Console.WriteLine("abc".CompareTo("abc\0\0"));

Давненько поигрался с Pex, он сломал половину моего кода понапихав \0 в строки, сейчас легко было догадаться
Re: [C#, Этюд] SortedSet
От: _FRED_ Черногория
Дата: 19.07.10 17:24
Оценка: 8 (1) +1
Здравствуйте, nikov, Вы писали:

N>using System.Collections.Generic;

N>public class C
N>{
N>    public static bool Foo(string x, string y)
N>    {
N>        var s = new SortedSet<string>();
N>        s.Add(x);
N>        return x.Length != y.Length && s.Contains(y);
N>    }
N>}


N>Может ли метод Foo вернуть true?

N>(класс System.Collections.Generic.SortedSet<T> стандартный, из System.dll)

Конечно: дефолтовый компаратор культурозависимый (используется текущая культура). String::Length возвращает "физическое" число символов, а культура может посчитать, что некоторая последовательность символов равна одному символу.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: [C#, Этюд] SortedSet
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 19.07.10 20:53
Оценка: 7 (2)
Здравствуйте, Muxa, Вы писали:

M>вот с этого места --*(ptr1 — 1) поподробнее пожалуйста. что произошло? и как это повлияло на длину твоей фигни (ac.str)?


Видим, в .NET в качестве строкового формата используется BSTR — в нем длина хранится перед указателем на начало строки.
Re: [C#, Этюд] SortedSet
От: _FRED_ Черногория
Дата: 20.07.10 07:21
Оценка: +1 :)
Здравствуйте, nikov, Вы писали:

N>        var s = new SortedSet<string>();

N>Может ли метод Foo вернуть true?
N>(класс System.Collections.Generic.SortedSet<T> стандартный, из System.dll)

Интересно, что EqualityComparer<string>.Default будет "правильным", всмысле сравнение пойдёт по правилу Ordinal, что приводит к интересному [парадоксальному!] результату:
str1.Equals(str2) != (str1.CompareTo(str2) == 0)

Какое поле для творчества тестировщикам!
Help will always be given at Hogwarts to those who ask for it.
Re: [C#, Этюд] SortedSet
От: Caracrist https://1pwd.org/
Дата: 19.07.10 20:24
Оценка: 24 (1)
Здравствуйте, nikov, Вы писали:

N>
N>using System.Collections.Generic;

N>public class C
N>{
N>    public static bool Foo(string x, string y)
N>    {
N>        var s = new SortedSet<string>();
N>        s.Add(x);
N>        return x.Length != y.Length && s.Contains(y);
N>    }
N>}
N>


N>Может ли метод Foo вернуть true?

N>(класс System.Collections.Generic.SortedSet<T> стандартный, из System.dll)

совсем злостный хакк
        [StructLayout(LayoutKind.Explicit)]
        struct ArrayConvert
        {
            [FieldOffset(0)]
            public string str;
            [FieldOffset(0)] 
            public int[] arr;
        }
        static void Main(string[] args)
        {
            ArrayConvert ac = new ArrayConvert();
            ac.str = "fignya";
            unsafe
            {
               fixed (int* ptr1 = ac.arr)
               {
                   --*(ptr1 - 1);
               }
            }
            Console.WriteLine(Foo("fignya",ac.str));
        }

~~~~~
~lol~~
~~~ Single Password Solution
[C#, Этюд] SortedSet
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.07.10 16:59
Оценка:
using System.Collections.Generic;

public class C
{
    public static bool Foo(string x, string y)
    {
        var s = new SortedSet<string>();
        s.Add(x);
        return x.Length != y.Length && s.Contains(y);
    }
}


Может ли метод Foo вернуть true?
(класс System.Collections.Generic.SortedSet<T> стандартный, из System.dll)
Re[2]: [C#, Этюд] SortedSet
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.07.10 17:24
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Легко:

П>
П>Foo("abc", "abc\0\0");
П>


Отлично! А можешь найти пример со строками, не содержащими '\0'?
Re[2]: [C#, Этюд] SortedSet
От: Muxa  
Дата: 19.07.10 20:51
Оценка:
вот с этого места --*(ptr1 — 1) поподробнее пожалуйста. что произошло? и как это повлияло на длину твоей фигни (ac.str)?
Re[3]: [C#, Этюд] SortedSet
От: andy1618 Россия  
Дата: 20.07.10 00:07
Оценка:
Здравствуйте, nikov, Вы писали:

N>Отлично! А можешь найти пример со строками, не содержащими '\0'?


В моей локали (французский+русский) прокатывает:
string s1 = "ae";
string s2 = ((char)230).ToString();  // "æ"
Console.WriteLine(s1.CompareTo(s2)); // returns 0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.