1. Список говнокодов пользователя cfdev

    Всего: 7

  2. C# / Говнокод #3682

    +117

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    static int ReadEvent (byte [] source, int off, int size, out InotifyEvent evt)
    {
        evt = new InotifyEvent ();
        if (size <= 0 || off > size - 16) {
            return -1;
        }
    
        int len;
        if (BitConverter.IsLittleEndian) {
            evt.WatchDescriptor = source [off] + (source [off + 1] << 8) +
                        (source [off + 2] << 16) + (source [off + 3] << 24);
            evt.Mask = (InotifyMask) (source [off + 4] + (source [off + 5] << 8) +
                        (source [off + 6] << 16) + (source [off + 7] << 24));
            // Ignore Cookie -> +4
            len = source [off + 12] + (source [off + 13] << 8) +
                (source [off + 14] << 16) + (source [off + 15] << 24);
        } else {
            evt.WatchDescriptor = source [off + 3] + (source [off + 2] << 8) +
                        (source [off + 1] << 16) + (source [off] << 24);
            evt.Mask = (InotifyMask) (source [off + 7] + (source [off + 6] << 8) +
                        (source [off + 5] << 16) + (source [off + 4] << 24));
            // Ignore Cookie -> +4
            len = source [off + 15] + (source [off + 14] << 8) +
                (source [off + 13] << 16) + (source [off + 12] << 24);
        }
    
        if (len > 0) {
            if (off > size - 16 - len)
                return -1;
            string name = Encoding.UTF8.GetString (source, off + 16, len);
            evt.Name = name.Trim ('\0');
        } else {
            evt.Name = null;
        }
    
        return 16 + len;
    }

    Mono, обёртка вокруг INotify (вокруг папки INotify создаёт поток (файл?), который нужно с помощью read читать в буфер, и в буфере будет лежать объект-событие в говносериализованной форме).

    Давно столько магических чисел в одном месте не видел o_O

    Можно ли в C# решить элегантнее?
    Аналог всего этого кода на Си: struct inotify_event *event = ( struct inotify_event*) &buffer[i]

    cfdev, 11 Июля 2010

    Комментарии (5)
  3. Си / Говнокод #3575

    +140

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    int 
    grub_auth_strcmp (const char *user_input, const char *template) 
    { 
      int ok = 1; 
      const char *ptr1, *ptr2; 
      for (ptr1 = user_input, ptr2 = template; *ptr1; ptr1++) 
        if (*ptr1 == (ptr2 ? *ptr2 : ptr1[1]) && ok && ptr2 != NULL) 
          ptr2++; 
        else 
          ok = 0; 
     
      return !ok; 
    }

    Несвежий говнокод (давно пропатчено) и, возможно, кто-то скажет "баян", однако оставлю это здесь.
    Код из загрузчика grub 1.97, проверка пароля. Принимает за верный пароль любую подстроку пароля.

    cfdev, 27 Июня 2010

    Комментарии (18)
  4. C# / Говнокод #3540

    +125

    1. 1
    2. 2
    3. 3
    int platform = (int) Environment.OSVersion.Platform;
    if (platform != 4 && platform != 128)
          return;

    Из gbrainy (входит в поставку Ubuntu 10.04), причём это рекомендованный самим Мигелем де Иказой подход.
    Экскурс: в кроссплатформенном™ фреймворке MS .NET 1.0/1.1® в энумерации PlatformID не было ничего кроме Windows'ов (Linux в паре мест официально числился Invalid). Ребята из моно кустарно добавили PlatformID.Unix == 128. Затем в MS. NET 2.0 всё-таки открыли для себя Mac OS X и Unix, но проставили PlatformID.Unix == 4. Благими намерениями вымощена дорога в к говнокоду :)

    cfdev, 22 Июня 2010

    Комментарии (27)
  5. C# / Говнокод #3261

    +113

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    private static void assertNoReflection()
    {
        foreach (StackFrame stackFrame in new StackTrace().GetFrames())
        {
            if (stackFrame.GetMethod().DeclaringType.Namespace == "System.Reflection")
            {
                throw new MethodAccessException();
            }
        }
    }
    
    internal static string GetKey()
    {
        assertNoReflection();
    
    // ...
    }

    Вот так вот приходится говнить, потому что в дотнете рефлексией можно спокойно вызывать internal- и private- методы.
    assertNoReflection(); проверяет, что вверх по стеку вызовов никто не балуется рефлексией.
    После assertNoReflection(); из нативной длл получаем обфусцированную (вручную, лол) строку, которая далее с помощью запутанных алгоритмов (некоторые параметры для "расшифровки" опять берутся из нативной длл) приводит её в вид пароля (для доступа к запароленному архиву).
    Софт не прямо уж суперсекретный, просто нужно скрыть ресурсы хотя бы для приличия. Пароль через подключение к серверу не катит.
    Ко всему этому оно собрано в одно exe моновским mkbundle'ом (рефлектор не может открыть!) и поверх upx'ом. В общем, большое количество кулхацкеров отсекается (должны знать ассемблер и MSIL).
    Чувствую, что говнорешение, но не могу придумать что-то более умное. Обфускаторы тоже не очень катят, ибо плохо дружат с моно.

    cfdev, 18 Мая 2010

    Комментарии (10)
  6. VisualBasic / Говнокод #3142

    −114

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    Public Function Cost(ByVal Vip1 As Boolean, ByVal Dat1 As Date, ByVal Kol1 As Integer, ByVal Cost1 As Decimal) As Decimal
    
            If Vip1 Then
                Return Bas(Cost1, Kol1) * 0.9 + IIf(Cost1 * Kol1 < 50, 50, Bas(Cost1, Kol1) * 0.11)
            Else
                Dim Sk1 As Decimal
                If Leto(Dat1) Then
                    Sk1 = IIf(Bas(Cost1, Kol1) < 1000, 2, 3)
                Else
                    Sk1 = IIf(Bas(Cost1, Kol1) < 1100, 3, 0)
                End If
                Dim Sk2 As Decimal = IIf(Kol1 > 500, 5, 0)
                Dim Sk3 As Decimal
                If Leto(Dat1) Then
                    Sk3 = IIf(Bas(Cost1, Kol1) < 100, 100, Bas(Cost1, Kol1) * 0.1)
                Else
                    Sk3 = IIf(Bas(Cost1, Kol1) < 110, 110, Bas(Cost1, Kol1) * 0.11)
                End If
                Return (Bas(Cost1, Kol1) - Bas(Cost1, Kol1) * Sk1 * 100 - Bas(Cost1, Kol1) * Sk2 * 100 + Sk3)
            End If
        End Function

    Стандартный ынтырпрайз-говнокод, но изюминка, собсно, не в нём, а в нём:

    http://www.sql.ru/forum/actualthread.aspx?bid=9&tid=467673&hl=

    2striker. теперь предпросмотр показывает всегда не php, а си. Спасибо за фикс.

    cfdev, 01 Мая 2010

    Комментарии (5)
  7. C# / Говнокод #3117

    +135

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    // Дефолтный конструктор:
     public Random() 
            : this(Environment.TickCount) {
          }
    
    // Перенаправляемся сюда...
        public Random(int Seed) {
            int ii;
            int mj, mk;
        
            //Initialize our Seed array.
            //This algorithm comes from Numerical Recipes in C (2nd Ed.)
            mj = MSEED - Math.Abs(Seed);

    Очередной "изящный" говнокод в исходниках .NET.
    Говнокод в том, что Environment.TickCount через каждые 24,9 дней возвращает Int32.MinValue, который скормится Math.Abs, который резонно выкинет исключение OverflowException. Вроде бы мелочь, но... Вспомним теперь падение .NET-софта на Лондонской бирже и последующие миллионные убытки. Для загруженных non-stop-серверов непростительно. Хотя в принципе Microsoft аптаймами и не славился :)

    cfdev, 27 Апреля 2010

    Комментарии (43)
  8. C# / Говнокод #3116

    +111

    1. 1
    2. 2
    3. 3
    4. 4
    try {} finally {
             retVal = NativeMethods.CreateProcess ( /* ... */ );
            /* ... и дальше остальной код... */
    }

    Откопано в исходниках .NET 2.0 Framework, так реализуется Process.Start. Не очень понял замысла. Нашёл, что finally обязательно продолжит исполняться, если во время его исполнения на поток ВНЕЗАПНО вызван метод Abort. Т.е. если потоку, создающему процесс, сделать аборт, процесс всё равно упорно создаcтся и запустится (чистки памяти я не нашёл). В чём смысл? Так можно было бы тогда всякий код оборачивать в finally... Ящитаю, что это всё костыли вокруг говноархитектуры. Не зря в Яве Thread.stop сделали deprecated. А вы как считаете?

    cfdev, 27 Апреля 2010

    Комментарии (38)