Кресты / Говнокод #26947 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
catch (Exception &exception)
	{
		Application->ShowException(&exception);
	}
	catch (...)
	{
		try
		{
			throw Exception("");
		}
		catch (Exception &exception)
		{
			Application->ShowException(&exception);
		}
	}

https://github.com/greatis/Anti-WebMiner/blob/master/AntiWebMiner.cpp#L23

Запостил: MAKAKA MAKAKA, (Updated )

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

  • там еще константы прикльные
    // INTERNET_OPTION_CLIENT_CERT_CONTEXT is 84
    	int res = InternetSetOption(m_hRequest, 
    						       84 /*	INTERNET_OPTION_CLIENT_CERT_CONTEXT */, 
    							(void *) m_pContext, sizeof(CERT_CONTEXT));
    Ответить
  • try
     {
       try
       {
    	if(LogFileName.IsEmpty())
    	 return;
       if(FileExists(LogFileName))
    	fs=new TFileStream(LogFileName,fmOpenReadWrite |fmShareDenyNone	);
       else
    	 fs=new TFileStream(LogFileName,fmCreate );
       fs->Seek(0,soFromEnd);
       fs->Write(sText.c_str(),sText.Length());
       fs->Write("\r\n",2);
       }
    
     catch(...)
     {
     }
    
    
     }
     catch(...)
     {
     }
      delete fs;
    
    }

    https://github.com/greatis/Anti-WebMiner/blob/master/main.cpp
    Ответить
      • Чем finally отличается от просто куска после?
        Ответить
        • файнли небось вызывается всегда: и в случае хорошего завершения и в случае исключения
          Ответить
          • Так если поймаем исключение и обработаем, то кусок после выполнится, то же самое если не поймаем исключение.
            Ответить
            • Если не поймаем исключение — кусок никак не выполнится. Управление перейдёт вверх по стеку к первому подходящему обработчику.
              Ответить
        • >>> 1 / 0; print('not finally')
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
          ZeroDivisionError: division by zero


          >>> try:
          ...     1 / 0
          ... finally:
          ...     print('finally!')
          ...
          finally!
          Traceback (most recent call last):
            File "<stdin>", line 2, in <module>
          ZeroDivisionError: division by zero
          Ответить
        • > отличается от просто куска после?

          Кусок на жопе-то остаётся, а не отваливается.
          Ответить
        • https://www.cyberforum.ru/csharp-beginners/thread2317079.html

          > Потому что не всегда имеется возможность в методе правильно обработать исключение — надо пробрасывать его выше и позволить вызывающей стороне произвести обработку (или пробросить еще выше, если она тоже не знает как его обработать), следовательно блок catch присутствует далеко не везде, где есть блок try.
          А вот всякие ресурсы подчистить в случае возникновения исключения необходимо сразу же, т.к. это является деталью реализации и вызвающая сторона о них ничего не знает.

          От себя скажу лишь то, что по-моему так писать систему - это антипаттерн. Потому что клиент не должен ничего знать о внутренностях интерфейса.
          Ответить
      • да, именно) чтобы всегда удалять
        правда хз зачем оно new
        Ответить
          • Допустим, я делаю вот так:

            TFileStream fs(LogFileName, kokokoflags);


            Не случится багор, если в конструкторе вылезет исключение? Если вылезет, то какой-то Stream у меня не закроется, например. С ручным new/delete я хотя бы уверен, что вызову деструктор и почищю за собой.
            Ответить
            • Если объект реализован корректно - ничего плохого не случится. Бросать исключение из конструктора - вполне нормальная практика.

              А если он реализован некорректно - с new будет только хуже.
              Ответить
            • > вызову деструктор

              Деструктор на недоконструированном объекте звать нельзя. Это UB. Всё что успело создаться (родительские классы, поля, локалки и т.п.) и так само размотается, не надо туда лезть руками.

              А ручной delete тебе не на чем будет звать, кстати. new ведь тебе ничего не вернёт при исключении в конструкторе.
              Ответить
                • Угу. Там на самом деле очень простые правила.

                  Если тебе от какой-то либы достались не RAII'шные ресурсы, заверни каждый из них в отдельную RAII'шную обёртку и убедись, что твой деструктор и мувающие методы не бросают исключений. Почему отдельную? Потому что иначе ты заблудишься в лесу из траев.

                  В общем-то и всё. Дальше ты можешь юзать эти обёртки в любых кобенациях и течь.
                  Ответить
                  • Я вот кстати немного подумал, и пришел к неутешительному выводу, что RAII это тоже какая-то питушня анскильная. Потому как Цари лучше какой-то там заедушной автоматической хуйни знают, когда какую хуйню им инициализировать и освобождать. Может у меня там дохуя реалтаймовые вычисления на говноконтроллере, и освобождать какую-то поебень мне нужно не тогда, когда какая-то RAII-тушня решит, а когда у меня не будет реалтаймовой хуйни, и можно спокойно что-то там освобождать.
                    Ответить
                        • Я имел ввиду, что для микроконтроллеров это ок.
                          Но для обычной питушни в большинстве случаев ты хочешь разрушения объекта именно тогда, когда ты больше не хочешь им пользоваться.
                          RAII это боль-мень реализует же.

                          А чтобы понять прелести раи, может пописать на языках с ГЦ, обвешанных анальными костылями типа closable/disposable и с внезапным фризом от мажорного ГЦ, вызванного засиранием кучи в другое время и в другом месте
                          Ответить
                    • Дык эта реалтаймовая хуйня в 99% работает с заранее выделенными объектами/пулами.

                      А если под лочкой или чем-то подобным удалять не хочется - можно мувнуть за скоуп лочки.

                      RAII вполне предсказуемо и контролируемо, в отличие от GC. Оно никогда не триггерится "само по себе".
                      Ответить
                      • >в 99% работает с заранее выделенными объектами/пулами.
                        причем на стеке
                        Ответить
                        • >причем на стеке

                          Нет.

                          Царь объяснял уже.

                          SLAB/SLOB аллокатор. Причём RAII на эту парадигму прекрасно ложится, а скорость аллокаций/деаллокаций такая же как на стеке.
                          Ответить
                          • Это когда ты заранее выделяешь блочок памяти, и там аллоцируешь объекты типа через плейсмент нью, чтобы аллокатор не ебся каждый раз с выискиванием места?

                            годно
                            Ответить
                      • > А если под лочкой или чем-то подобным удалять не хочется - можно мувнуть за скоуп лочки.

                        Ну как бы это уже всё усложняет, что вот допустим кто-то говорит

                        - А давайте такое запилим, что если переменная выходит из скоупа, то автоматом вызываем деструктор
                        - Ну ок, давайте
                        - А вот если надо чтоб этот деструктор вызывался не по завершению скоупа, а потом, давайте сделаем чтоб мувать можно было, и тогда деструктор уже вызовется при окончании скоупа для той мувнутой хрени
                        - Ну ок, давайте
                        - А давайте чтоб еще какая-то поебень, ну например http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1144r4.html
                        ....

                        и вот так вроде бы исходно простая и понятная хуйня обрастает всякими взаимосвязями с другми слоями поебеней, которые говностандартизаторы в крестоговно добавляют https://habr.com/ru/post/484380/
                        и это уже становится не так просто.

                        Если же оставаться на базовом уровне, что вот когда хуйня за скоуп выходит - вызываем такую-то функцию, то это вообще ничем не примечательная хрень, и говорить о ней как о некоторой важной фиче я считаю глупо. Такое и на сишке накостылить можно

                        > RAII вполне предсказуемо и контролируемо, в отличие от GC. Оно никогда не триггерится "само по себе".

                        Так-то если взять ограниченый вариант GC, ну типа просто тупой рефкаунтер, без всякой заумной хрени с поиском циклов, то там тоже все довольно предсказуемо и контролируемо.
                        Ответить
                        • ахаха, ну так естественно чем сложнее система -- тем больеш в ней всяких говнонюансов. Вспомнить хотябы все эти конструкторы в крестах которых куча видов. В сишечке их нет. Просто нет такой проблемы, и всё. И голова не болит

                          Ничего не бесплатно.

                          >вариант GC, ну типа просто тупой рефкаунтер, без всякой заумной хрени с поиском циклов,

                          То это будет не ГЦ, а рефкаунтер типа как в свифте. И он хороший же, правда. У крестовичков это вроде делают шаредптры
                          Ответить
                        • >вот когда хуйня за скоуп выходит - вызываем такую-то функцию, то это вообще ничем не примечательная хрень
                          >Такое и на сишке накостылить можно

                          Неправда же. ОЧЕНЬ сложно отследить выход за скоуп. Всякие goto, гетигп, бряки.

                          Даже в «простой» сишке регулярно возникают проблемы, вписали в длинный метод гетигп забыли goto CLEANUP добавить и ресурсы уже не чистятся. Одноразвратники опять торжествуют.

                          >то это вообще ничем не примечательная хрень
                          Ага, а как же. Именно поэтому a variably modified type такая особенная фигня, из-за которой в стандарте пришлось добавить исключение для goto.
                          Ответить
                          • > Неправда же. ОЧЕНЬ сложно отследить выход за скоуп. Всякие goto, гетигп, бряки.
                            Ну на самом-то деле нихуя такого сверхсложного нет. Проверяем все goto, return, break, longjmp-ы на предмет того, что от них хуйня выходит за скоуп, если выходит, то перед ними освобождаем хуйню. Можно какой-нибудь говнопрепроцессор под это запросто приспособить, хотя и гнутое расширение есть готовое https://govnokod.ru/25526 и еще какая-то поебень без гнутого расширения есть https://govnokod.ru/24517 хотя там вместо обычного return надо какую-то хуйню писать, так что это говно

                            Кстати вот https://ideone.com/lpT99r реальный пример, когда RAII в крестоговне ломается через гнутое расширение

                            > Именно поэтому VLA такая особенная фигня, из-за которой в стандарте пришлось добавить исключение для goto.
                            Просто надо использовать alloca(), и никакие VLA нахуй не нужны
                            Ответить
                            • >нихуя такого сверхсложного нет. Проверяем все goto, return, break, longjmp

                              надо просто быть внимательным и аккуратным программистом, и всегда думать
                              Ответить
                            • >хотя и гнутое расширение есть готовое
                              Всегда уважал вас как борца за эстетику кода.

                              Но вот это:
                              char *x __attribute__ (( cleanup (myfree)  )) = malloc(1);

                              ЁБАНЫЙ ВЫРВИГЛАЗЫЙ ПИЗДЕЦ!

                              На этом фоне даже крестопарашная std::дрисня не выглядит такой уж жуткой.
                              std::map<std::string, it>
                              Ответить
                              • > ЁБАНЫЙ ВЫРВИГЛАЗЫЙ ПИЗДЕЦ!

                                Обычно эту поебень через макроговно заворачивают. Там я специально показал это в первозданном виде.

                                Вот например такой вариант можно представить:
                                #include <stdio.h>
                                #include <stdlib.h>
                                
                                void myfree(void *ptr)
                                {
                                  printf("%p\n", *(void **)ptr);
                                  free(*(void **)ptr);
                                  printf("freed!\n");
                                }
                                
                                #define  RAIICRAP(type, cleanfunc) typeof(type)  __attribute__ (( cleanup (cleanfunc)  ))
                                
                                int main(void) {
                                  RAIICRAP(char *, myfree) x = malloc(1);
                                  printf("%p\n", x);
                                  return 0;
                                }
                                Ответить
                            • > Просто надо использовать alloca(), и никакие VLA нахуй не нужны

                              АААААААААА!!!

                              Слова не лалки, но Царя.

                              (неистово жмёт кнопку плюс один)
                              Ответить
                              • А Боманд (вроде?) говорил, что динамически вертеть стек не нужно, а нужно лучше сразу выделять фиксированный размер: это же бесплатно.

                                Ну типа

                                char buffer[MAX];

                                а потом туда писать
                                Ответить
                        • > ничем не примечательная хрень

                          Ну ты что, посмотри как в жабе или питоне сраный try/with боготворят. А это как раз самая базовая форма, даже каскадить на поля структур не умеет, в отличие от крестов.
                          Ответить
                          • Ну если заедушные питушки боготворят какие-то базовые хуйни, на которые нормальные пацаны даже не обратят внимания, то это только их (питушков) проблема. Пусть кукарекают, что с них взять?
                            Ответить
                            • Просто раньше у них и такого не было. Городили леса из траев и кукарекали как же хорошо жить с GC.
                              Ответить
                              • Старый джавист к нам в оркестр пришел
                                Старый джавист песенку спел
                                Как хорошо с GC жить
                                Как хорошо вручную вот так писать
                                BufferedWriter bw = null;
                                
                                try {
                                    bw = new BufferedWriter(new FileWriter("test.txt"));
                                    bw.write("test");
                                    bw.flush(); // you can omit this if you don't care about errors while flushing
                                    bw.close(); // you can omit this if you don't care about errors while closing
                                } catch (IOException e) {
                                    // error handling (e.g. on flushing)
                                } finally {
                                    IOUtils.closeQuietly(bw);
                                }

                                А лучше всех ему -- получающему зарплату за количество сторочек в проекте старому джависту
                                Ответить
                              • >Городили леса из траев и кукарекали как же хорошо жить с GC.

                                Так и сейчас городят.
                                try~with не работает для многих ресурсов, как например лочки или сёмафоры.
                                ReentrantLock lock = new ReentrantLock();
                                
                                void koko() {
                                    lock.lock();
                                    try {
                                        kookoodah();
                                    } finally {
                                        lock.unlock();
                                    }
                                Ответить
                                • а юзинг нельзя? он не клозабл?

                                  вижу, что нет

                                  ну какие питушки-то а
                                  Ответить
                                    • ну я спросил, имплементит ли лок клозабл, потому что если да, что его можно врапнуть в юзинг, а если нет, то релизить его нужно мануально

                                      не знаю как еще более по русски сказать
                                      Ответить
                                  • https://github.com/xetorthio/jedis/issues/562
                                    https://github.com/xetorthio/jedis/issues/500


                                    2013. Проблема:
                                    >I'm also proposing Jedis class to implement java.lang.Closeable interface to take advantage of Java 7 'try with resources' feature and to provide a transparent and cleaner object returning to the pool mechanism.

                                    2014. Решение:
                                    >try (Jedis jedis = pool.getResource()) {}
                                    >Jedis was accessed from a pool. Jedis should be returned to the pool.
                                    >Instead the connection is closed.
                                    >This makes it impossible to use Jedis in a try-with-resource without closing it.

                                    2015. Итог:
                                    >This issue was closed by won't fix. But notice that #909 and 6701b07 have merged to use close() instead of returnResource() or returnBrokenResource() after 3.0.0-SNAPSHOT.

                                    >The latest usage is following. Make sure everybody knows about that smiley

                                    Jedis jedis = null;
                                    try {
                                      jedis = pool.getResource();
                                      /// ... do stuff here ... for example
                                      jedis.set("foo", "bar");
                                      String foobar = jedis.get("foo");
                                      jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
                                      Set<String> sose = jedis.zrange("sose", 0, -1);
                                    } finally {
                                      if (jedis != null) {
                                        jedis.close();
                                      }
                                    }


                                    Какой try-with-resource )))
                                    Ответить
                    • >и пришел к неутешительному выводу, что RAII это тоже какая-то питушня анскильная

                      С риал тайм аргументами не согласен по причинам изложенным бормандом.

                      А RAII питушня, потому что сцуко неявная. И потому не trivially reallocatable.
                      Потому вектор питухов там не мувается нормально reallocом, а на каждой питушне нужен конструктор+деструктор.

                      Вообще raiiшные замашки и в Сишке есть, начались они с С99.

                      Там, ЕМНИП можно сделать goto за VLA и стек порвать.

                      При K&R такой хуйни не было.

                      Раньше ведь в сишке в силу простоты можно было прыгать свитчом и goto в произовольное место функции.
                      Ответить
                      • ну и переменные стало можно объявлять внутри блоков, а раньше только на уровне функции.

                        Я вот не знаю, гарантирует ли мне стандарт жизнь переменной при выходе из блока или нет. Если нет, то что будет, если я выпрыгну и впрыгну обратно? Или упрыгаю с указателем на неее?
                        Ответить
                        • Не, там прикол в другом.

                          Попробовать впрыгнуть в блок за аллокацию, чтобы они освободило массив, не аллоцируя его на стеке.

                          В крестовой парадигме это delete без new.
                          void a(){
                          ...
                              if (...) goto AFTER:
                              {
                                  int[n] vla;
                               ...
                          AFTER:
                              }
                          
                          }
                          Правда компиляторы гады умные, там надо поебаться чтобы это говнище скомпилилось.

                          А вот c alloca всё просто, так это вообще счастье и удача.

                          Её пидорасит даже от простого инлайна.

                          https://govnokod.ru/26809#comment561177
                          Ответить
                          • понятно) да, жесть.

                            Но у меня проще вопрос: переменная разрушается или нет при выходе из блока по стандарту? Законно вообще вот так делать?
                            int *p;
                            	if (1)
                            	{
                            		int q = 12;
                            		p = &q;
                            	}
                            	printf("%d", *p);
                            Ответить
                            • > переменная разрушается или нет при выходе из блока по стандарту?

                              Это ж Сишка. Там ничего автоматически не разрушается.
                              Только переменные на стеке.

                              > Законно вообще вот так делать?
                              Я когда-то давно читал хороший пример про вещи в отеле.
                              Ответить
                            • >Законно вообще вот так делать?

                              https://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope/6445794

                              You rent a hotel room. You put a book in the top drawer of the bedside table and go to sleep. You check out the next morning, but "forget" to give back your key. You steal the key!

                              A week later, you return to the hotel, do not check in, sneak into your old room with your stolen key, and look in the drawer. Your book is still there. Astonishing!

                              How can that be? Aren't the contents of a hotel room drawer inaccessible if you haven't rented the room?

                              Well, obviously that scenario can happen in the real world no problem. There is no mysterious force that causes your book to disappear when you are no longer authorized to be in the room. Nor is there a mysterious force that prevents you from entering a room with a stolen key.

                              The hotel management is not required to remove your book. You didn't make a contract with them that said that if you leave stuff behind, they'll shred it for you. If you illegally re-enter your room with a stolen key to get it back, the hotel security staff is not required to catch you sneaking in. You didn't make a contract with them that said "if I try to sneak back into my room later, you are required to stop me." Rather, you signed a contract with them that said "I promise not to sneak back into my room later", a contract which you broke.

                              In this situation anything can happen. The book can be there -- you got lucky. Someone else's book can be there and yours could be in the hotel's furnace. Someone could be there right when you come in, tearing your book to pieces. The hotel could have removed the table and book entirely and replaced it with a wardrobe. The entire hotel could be just about to be torn down and replaced with a football stadium, and you are going to die in an explosion while you are sneaking around.
                              Ответить
                              • Ты меня не понял)

                                Определить переменную на стеке функции и вернуть на нее указатель никогда не было законно.

                                Но перменные объявлялись внутри функции, и жили до кона функции всегда.

                                А в с99 стало можно объявить их внутри блока. вот мне и интересно: они все еще живут до конца функции, или только до конца блока
                                Ответить
                                • Так они же не «живут». Скоупы, это просто логическая абстракция.

                                  Переменная, это просто какое-то место в стеке или значение в регистре.

                                  А конец функции только сдвигает esp.

                                  >Только переменные на стеке.
                                  Я выше был некорректен. Даже значения в стековом массиве обычно не чистятся, а остаются.

                                  Данные есть где-то за пределами esp, однако они недоступны програмно, если заранее не украсть указатель.

                                  >они все еще живут до конца функции
                                  Тогда бы данный код переполнял стек, аллоцируя 42*100500 интов.
                                  for (i=0;i<100500;++i){
                                      int x[42]={};
                                      ...
                                  }
                                  Ответить
                                  • >А конец функции только сдвигает esp.
                                    А это деталь реализации или часть стандарта?

                                    Гарантируется ли мне, что на любой архитектуре всегда стек подвинут только при выходе из функции, то есть если я создал переменную в блоке if(){}, то она всегда доступна до конца функции
                                    Ответить
                                • вызови другую функцию, проверь, изменилось ли значение по указателю (я думаю, что место выделяется раз в начале функции и в теории может просто не использоваться). или прямо SP посмотри.
                                  Ответить
        • Наследников TObject вроде нельзя на стеке создавать. Совместимость с делфи. Поэтому new.
          Ответить
              • ну мартышка видит, что это VCL #include <vcl.h>
                просто я не знал, что там так всё
                Ответить
                • > vcl.h

                  Х.з., я не смотрел код, мне обычно лень ссылки открывать, только комменты читаю.

                  Но MFC, VCL и winapi я чую за километр. Этот запах невозможно забыть.
                  Ответить
                  • Буква T пахнет VCLом
                    Буква C и буква I пахнут MFC.

                    А win32API просто пахнет LPDWORD, и течет
                    Ответить
                    • У каждого дела
                      Запах особый:
                      В булочной пахнет
                      Тестом и сдобой.

                      Мимо столярной
                      Идёшь мастерской, –—
                      Стружкою пахнет
                      И свежей доской.

                      Пахнет маляр
                      Скипидаром и краской.
                      Пахнет стекольщик
                      Оконной замазкой.

                      Куртка шофёра
                      Пахнет бензином.
                      Блуза рабочего –—
                      Маслом машинным.

                      Пахнет кондитер
                      Орехом мускатным.
                      Доктор в халате –—
                      Лекарством приятным.

                      Рыхлой землёю,
                      Полем и лугом
                      Пахнет крестьянин,
                      Идущий за плугом.

                      Рыбой и морем
                      Пахнет рыбак.
                      Только безделье
                      Не пахнет никак.

                      Сколько ни душится
                      Лодырь богатый,
                      Очень неважно
                      Он пахнет, ребята!
                      Ответить
    • Даже обругиваемый всеми Бейсик стоял на более высокой эволюционной ступени обработки ошибок.

      On Error выглядит благодатью на фоне обилия анскильного try~catch бойлерплейта и goвняно-rustовых проверочек
      r, err := kokoko()
      if err != nil {
      Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8