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

    +7

    1. 1
    TPrimitive a((TLine())), b((TCircle()));

    Вынужденный говнокод.
    Должно быть:

    TPrimitive a(TLine()), b(TCircle());

    Но это будет объявлением 2х указателей на функции.

    HaskellGovno, 16 Августа 2012

    Комментарии (49)
  2. C++ / Говнокод #11588

    +28

    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
    byte* GetBuffer0(bool free = false)
    {
    	static std::auto_ptr<byte> transferBuffer;
    
    	if (free)
    	{
    		delete [] transferBuffer.release();
    	}
    	else
    	{
    		if (!transferBuffer.get())
    		{
    			transferBuffer.reset(new byte[BUFFER_SIZE]);
    		}
    	}
    	return transferBuffer.get();
    }
    
    byte* GetBuffer1(bool free = false)
    {
    	static std::auto_ptr<byte> transferBuffer;
    
    	if (free)
    	{
    		delete [] transferBuffer.release();
    	}
    	else
    	{
    		if (!transferBuffer.get())
    		{
    			transferBuffer.reset(new byte[BUFFER_SIZE]);
    		}
    	}
    	return transferBuffer.get();
    }

    legacy-дебри

    ni3_inv, 14 Августа 2012

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

    +18

    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
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    template <typename TYPE> class Ptr
    {
    public:
        Ptr():
            Pointer_(0),
            IsValid_(false)
        {
        }
        Ptr( const Ptr<TYPE> &other )
        {
            this->Pointer_ = other.Pointer_;
            this->IsValid_ = other.IsValid_;
        }
        Ptr( TYPE* &ptr ):
            IsValid_(true)
        {
            if ( std::find( Ptr<TYPE>::List_.begin(), Ptr<TYPE>::List_.end(), ptr ) == Ptr<TYPE>::List_.end() )
                Ptr<TYPE>::List_.push_back( ptr );
            this->Pointer_ = ptr;
        }
        ~Ptr()
        {
        }
    
        inline Ptr<TYPE>& operator = ( const Ptr<TYPE> &other )
        {
            this->Pointer_ = other.Pointer_;
            this->IsValid_ = other.IsValid_;
    
            return *this;
        }
    
        inline Ptr<TYPE>& operator = ( TYPE* &ptr )
        {
            if ( std::find( Ptr<TYPE>::List_.begin(), Ptr<TYPE>::List_.end(), ptr ) == Ptr<TYPE>::List_.end() )
                Ptr<TYPE>::List_.push_back( ptr );
    
            this->Pointer_ = ptr;
            this->IsValid_ = true;
    
            return *this;
        }
    
        inline bool operator == ( const Ptr<TYPE> &other )
        {
            return (this->Pointer_ == other.Pointer_) ? true:false;
        }
    
        inline bool operator != ( const Ptr<TYPE> &other )
        {
            return (this->Pointer_ != other.Pointer_) ? true:false;
        }
    
        inline TYPE* operator -> ()
        {
            return this->Pointer_;
        }
    
        inline bool isValid() const
        {
            if (!this->IsValid_)
                return false;
            return this->IsValid_ = ( (std::find( Ptr<TYPE>::List_.begin(), Ptr<TYPE>::List_.end(), this->Pointer_ ) == Ptr<TYPE>::List_.end() ) ? false:true );
        }
    
        inline void release()
        {
            if ( this->isValid() )
            {
                Ptr<TYPE>::List_.erase( std::find( Ptr<TYPE>::List_.begin(), Ptr<TYPE>::List_.end(), this->Pointer_ ) );
                delete this->Pointer_;
            }
    
            this->Pointer_ = 0;
            this->IsValid_ = false;
        }
    
        inline TYPE* get()
        {
            return this->Pointer_;
        }
    private:
        TYPE* Pointer_;
        mutable bool IsValid_;
    
        static std::list < TYPE* > List_;
    };
    
    template <typename TYPE> std::list < TYPE* > Ptr<TYPE>::List_;

    HaskellGovno, 12 Августа 2012

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

    +8

    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
    bool ASN1Parser::ConvertOID(const ASN1Block &blk, char *oid, unsigned int bufSize) {
        int a = 0;
        bool first = true;
        char tmp[32];
        oid[0] = 0;
        for (unsigned int i=0;i<blk.size;i++) {
            unsigned char c = data[blk.offset+i];
            if (c & 0x80) {
                a = (a << 7) | (c & 0x7F);
            } else {
                a = (a << 7) | (c & 0x7F);
                if (!first) {
                    sprintf(tmp,".%d",a);
                } else {
                    sprintf(tmp,"%d.%d",a/40,a%40);
                }
                a=0;
                first = false;
                if (strlen(tmp) >= bufSize) return false;
                strcat(oid, tmp);
            }
        }
        return true;
    }

    И еще один говнокодец на тему ASN.1 - распаковка OID'а.
    Кто найдет ошибку - получит пирожок с полочки ;)

    bormand, 12 Августа 2012

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

    +24

    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
    #include <stdio.h>
    #include "gost.h"
    
    int main() {
        MemoryFile mf("root.cer");
        MemoryFile mf2("test.cer");
    
        ASN1Parser parser(mf);
        ASN1Parser parser2(mf2);
    
        ASN1Block e1[2];
        parser.Split("30{30{A0#,02$1,30#,30#,30#,30#,30{30#,03$2},A3#},30#,03#}", e1);
    
        unsigned char px[32], py[32], r[32], s[32], h[32];
        for (int i=0;i<32;i++) {
            px[i] = mf.data[e1[1].offset+i+3];
            py[i] = mf.data[e1[1].offset+i+35];
        }
    
        parser2.Split("30{30$1,30#,03$2}", e1);
        for (int i=0;i<32;i++) {
            r[i] = mf2.data[e1[1].offset+64-i];
            s[i] = mf2.data[e1[1].offset+32-i];
        }
    
        Gost3411 hash;
        hash.AddData(mf2.data+e1[0].offset-4, e1[0].size+4);
        hash.Finish(h);
    
        Gost3410 g;
        if (!g.VerifySignature(h, px, py, r, s)) {
            printf("Invalid!");
        } else {
            printf("Valid!");
        }
        return 0;
    }

    Продолжение http://govnokod.ru/11528. Вот так я проверял валидность сертификата...
    Прекрасные говорящие имена переменных...
    Удобный парсер ASN.1...
    Отличная инкапсуляция...
    Ни одного магического числа...

    bormand, 12 Августа 2012

    Комментарии (13)
  6. C++ / Говнокод #11574

    +20

    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
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    //Вколите мне каплю никотина, а когда меня разорвет - сожгите ошметки напалмом.
    //Только это смоет мой позор.
    
    //Примерно так у меня выглядит вся обработка исключений:
    int main(int, char**) //или wWinMain, не важно
    {
    	try
    	{
    		//all stuff here
    	}
    	catch(std::exception e)
    	{
    		MessageBoxA(NULL, e.what(), "oops", MB_OK | MB_ICONERROR);
    	}
    	catch(...)
    	{
    		MessageBoxA(NULL, "Unknown error", "oops", MB_OK | MB_ICONERROR);
    	}
    	return 0;
    }
    
    //А еще у меня есть свой класс строки:
    class MyString
    {
    	wchar_t * data;
    	size_t length;
    	MyString(wchar_t * _data, size_t _length) : data(_data), length(_length) { }
    public:
    	//...
    	static MyString MyString::fromNumber(int num) 
    	{ //Грешен, определяю функции в заголовочном, хотя это и не тот случай.
    		wchar_t * data = new wchar_t[16];
    		HRESULT hr = StringCchPrintfW(data, 16, L"%d", num);
    		if(FAILED(hr))
    		{
    			throw std::exception("shit happend inside MyString::fromNumber(int)");
    		}
    		size_t len = 0;
    		hr = StringCchLengthW(data, 16, &len);
    		if(FAILED(hr))
    		{
    			throw std::exception("shit happend inside MyString::fromNumber(int)");
    		}
    		return MyString(data, len);
    	}
    };
    
    //А вкупе с обработкой исключений чуть выше...
    //Чуть не забыл про auto_ptr. Укорочено до сути.
    class Base
    {
    protected:
    	std::auto_ptr<SomeType> data; //А где он инициализируется?...
    public:
    	virtual ~Base() { }
    };
    class Deriv : public Base
    {
    public:
    	Deriv() : Base() 
    	{ 
    		data = std::auto_ptr<SomeType>(new SomeType(args)); //...а вот тут он инициализируется!
    	}
    	virtual ~Deriv() { }
    };
    
    //Паттерны!
    class Single
    {
    	Single(); //Без реализации.
    	template<typename T> Single(T); //Без реализации.
    	template<typename T1, typename T2> T1 operator = (T2); //Без реализации.
    	class Ton
    	{
    		//...
    	};
    	static Ton object;
    	static Ton initObject();
    public:
    	Ton & instance() { return object; }
    };
    
    
    //Мне стыдно.

    Xom94ok, 11 Августа 2012

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

    +83

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    void somefunc(bool val)
    {
        assert(0 == val || 1 == val);
    ...
    }

    Многоуровневый говнокод. Во первых, индусское сравнение задом наперед. Во вторых, выражение в ассерте всегда истенно. Когда GCC возбухнул по этому поводу, то код был за-#ifdef-ен, но оставлен для других менее умных компиляторов.

    alexzak, 11 Августа 2012

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

    +23

    1. 1
    QHash<QByteArray, QSharedPointer<KeywordAnalyzerResult::Statistics> >::const_iterator i = res.result()->constBegin();

    Создание STL-style итератора для Qt-ных контейнеров обычно выглядит уродски.

    viktorious, 10 Августа 2012

    Комментарии (14)
  9. C++ / Говнокод #11549

    +34

    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
    #include "xsmell.hpp"
    #include <iostream>
    
    TAG(html,  NO_ATTRIBS);
    TAG(head,  NO_ATTRIBS);
    TAG(title, NO_ATTRIBS);
    TAG(body,  NO_ATTRIBS);
    TAG(p,     NO_ATTRIBS);
    TAG(a,     ATTRIB(href));
    TAG(img,   ATTRIB(src), ATTRIB(alt));
    
    int main()
    {
        using namespace xsmell;
    
        document doc = 
            _
            <html>_
                <head>_
                    <title>"XSMELL demo"<!title>_
                <!head>_
                <body>_
                    <p>"Yesssssssssssssssss!"<!p>_
                    <img .src("chucknorris.png") .alt("sneezing eyes open")>_ <!img>_
                <!body>_
            <!html>
            _;
    
        std::cout << doc << '\n';
    
        return 0;
    }

    C++ умеет HTML не хуже этих ваших похапешечек ;)

    https://bitbucket.org/edd/xsmell/src

    bormand, 07 Августа 2012

    Комментарии (259)
  10. C++ / Говнокод #11528

    +12

    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
    void EllipticPoint::Add(const EllipticPoint &b, const EllipticCoord &a, const EllipticCoord &p, EllipticPoint &res) {
        if (!x.IsNotZero() && !y.IsNotZero()) {
            res = b;
        } else if (!b.x.IsNotZero() && !b.y.IsNotZero()) {
            res = *this;
        } else if (x.Compare(b.x)!=0) {
            EllipticCoord tmp1, tmp2, lambda;
            b.x.Sub(x,p,tmp1); tmp1.Invert(p,tmp2);
            b.y.Sub(y,p,tmp1); tmp1.Mul(tmp2,p,lambda);
            lambda.Mul(lambda,p,tmp1);
            tmp1.Sub(x,p,tmp2); tmp2.Sub(b.x,p,res.x);
            x.Sub(res.x,p,tmp1); lambda.Mul(tmp1,p,tmp2); tmp2.Sub(y,p,res.y);
        } else if (y.Compare(b.y)==0) {
            EllipticCoord tmp1, tmp2, tmp3, lambda;
            x.Mul(x,p,tmp1); tmp1.Add(tmp1,p,tmp3); tmp1.Add(tmp3,p,tmp2); tmp2.Add(a,p,tmp1);
            y.Add(y,p,tmp2); tmp2.Invert(p,tmp3); tmp1.Mul(tmp3,p,lambda);
            lambda.Mul(lambda,p,tmp1); tmp1.Sub(x,p,tmp2); tmp2.Sub(x,p,res.x);
            x.Sub(res.x,p,tmp1); lambda.Mul(tmp1,p,tmp3); tmp3.Sub(y,p,res.y);
        } else {
            res.x.SetZero();
            res.y.SetZero();
        }
    }

    Из моего велосипеда четырехлетней давности.
    Кусочек реализации ГОСТ Р 34.10-2001.

    bormand, 03 Августа 2012

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