1. C++ / Говнокод #4686

    +166

    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
    JNIEXPORT jstring JNICALL _Java_com_fl_nat_Status_listProcessess0(JNIEnv *env, jobject obj) {
        char format[1024*128];
        char name[128];
        
        unsigned long procs[1024], needed, ret;
        if(!EnumProcesses(procs, sizeof(procs), &needed)) return (*env)->NewStringUTF(env, "");
    
        ret = needed / sizeof(unsigned long);
        unsigned int i = 0;
        for(; i < ret; i++) {
            if(procs[i] == 0) continue;
    
            HANDLE hproc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, procs[i]);
            GetModuleBaseName(hproc, 0, name, 128);
    
            strncat(format, name, strlen(name));
            strncat(format, ",", 1);
            sprintf(name, "%i", procs[i]);
            strncat(format, name, strlen(name));
            strncat(format, ";", 1);
    
            CloseHandle(hproc);
        }
    
        return (*env)->NewStringUTF(env, format);
    }

    к говнокоду №4685

    итак, эта программа (JNI на C++ и "клиентская" часть на Java) создают список процессов таким извращенным образом:
    C++ создает строку вида "имяпроцесса1,идпроцесса1;имяпроцесса2,и дпроцесса2;", после чего жабо-код парсит эту строку, переводя её в массив обьектов SystemProcess

    Запостил: danilissimus, 19 Ноября 2010

    Комментарии (18) RSS

    • Native inteface - ЭТО ЗЛО!
      Ответить
      • да ну?
        а как же с нативным кодом вязаться?
        Ответить
        • Ну уж только в самых крайних случаях, которых не так уж и много. Если нельзя найти альтернативу JNI, то да!
          Ответить
    • 1. переменная цикла зачем-то вынесена наружу.
      2. не понятно почему в needed нельзя вернуть сразу нужное число, что не делить потом на sizeof(unsigned long).
      3. strncat(format, name, strlen(name)); попытался обрезать строку, а получилось то же, что и strcat( format, name );
      4. format не проинициализирован перед strncat(). итог - жди нерегулярного вылета.
      5. strncat(format, ",", 1); просто чудесно :))
      6. подозрительные return'ы.
      7. 128Kb на стеке.
      8. не помешали бы константы для размеров.
      есть дополнения ? :)
      Ответить
      • 9. Не проверяется успех вызова GetModuleBaseName
        10. В юникод билде возможно переполнение name
        Ответить
        • MAX_PATH же!
          Ответить
          • GetModuleBaseName требует TCHAR и размер буфера в символах
            Ответить
            • при уникоде благополучно свалится уже на "C:\Documents and Settings\Local Settings\Application Data\Sun\Java"
              Ответить
              • о каком именно стандарте уникода идет речь?
                и сколько байт по-твоему "C:\Documents and Settings\Local Settings\Application Data\Sun\Java" займет?
                Ответить
        • 11. name может быть обрезан в строке 14
          12. в строке 13 подразумевается существование процесса, тогда как в говнокоде 4685 создаются новые SystemProcess (??)
          13. потенцильное переполнение строки format ибо каждая "запись" занимает до 143 байт и их может быть до 1024 штук
          14. формат sprintf() в строке 18 выведет знаковое целое число. более того на компиляторах, где sizeof(long) > sizeof(int), unsigned long при выводе sprintf(..., "%i", ...) может быть обрезан
          15. jobject obj нигде не используется
          Ответить
          • п.13 откуда 143 ? У меня получается 139 = 127 (максимальная длина name) + 2(запятая и точка с запятой) + 10(максимальное строковое представление unsigned long ( если 32bit ) ). Если иметь в виду п.14, то 140.
            А кол-во процессов разве ограничено 1024 ? Хотя вероятно EnumProcesses() не должен вернуть больше.
            Ответить
            • да, точно 140

              unsigned long procs[1024];
              Ответить
              • Только вот в EnumProcesses вторым параметром отнюдь не 1024 передается. Но исходя из дальнейших преобразований needed можно предположить, что пересчитывается в 1024. Хотя начинку EnumProcesses() было бы интересно посмотреть.
                Ответить
          • >15. jobject obj нигде не используется
            в obj - ссылка на обьект, "вызвавший" метод.
            в функции в JNI должен быть обязательно обьявлен
            Ответить
      • >6. подозрительные return'ы.
        почему?
        http://java.sun.com/docs/books/jni/html/objtypes.html
        $3.2.1
        Ответить
    • - Замётано. Я безумно за тебя рад. Ты же сох по ней несколько лет.
      Ответить

    Добавить комментарий