LINUX.ORG.RU

Как лучше организовать процесс изучения компьютерных технологий?


1

1

Раньше, когда я был на Windows, то был твердо уверен, что моих знаний более чем достаточно. Но после того, как я перешел на Linux, то понял всю свою наивность. Плюс к этому, у меня есть желание стать специалистом по безопасности Linux(ну или просто Linux-программистом, на худой конец).

Короче, мой уровень знаний надо повышать. Однако, у меня возникли вопросы насчет того, как организовать процесс самообучения. Не секрет, что большинство областей знаний пересекается друг с другом. Так например, если я буду изучать ассемблер, то мне просто необходимо знать как работает процессор. Если я буду в подробностях изучать строение Unix/Linux, то мне может понадобиться знание языка программирования Си. А если я буду изучать программирование, то мне могут понадобится некоторые знания из области математики(а с этим у меня проблемы, кстати). Если я буду изучать работу компьтерного железа(например, чтобы заняться оверклокингом), то мне могут понадобиться знания из области физики(с которой у меня тоже дела обстоят неважно).

Короче, одно с другим связанно с другим. Это мне напоминает зависимости в системе пакетов. Просто голова идет кругом, если хорошенько так обо всем подумать. Даже не знаешь, что делать. Встает вопрос: как разрешить такие «зависимости»?


Ответ на: комментарий от anonymous

Ты — не смог? Или просто не понял, как она работает?

тут ума большого не нужно. достаточно заметить, что 17*4 это на самом деле 0x44. И то, что ",!((+hd3+6( eN" XOR 0x44 будет «hello, world!». Ну а остальное - набросы быдлокодерских фекалий, о чём и расписался мой компилятор, выдав 9 предупреждений на 2 строки (sic!).

drBatty ★★
()
Ответ на: комментарий от anonymous

Где фекалии? Из того, что тебе код не понятен, ещё не значит, что это — «фекалии».

я - не показатель. Компилятор вот недоволен чё-то...

В этом куске кода из двух строчек минимум два разных алгоритмических подхода. И что?

где там «подходы»? за кастование указателей на функции надо яйца отрывать напрочь. Чтоб больше таких **** не было.

Форматирование исправляется за секунду. Переменных тут аж четыре. Запомнить не трудно. А каким должно было быть форматирование этого кода и имена переменных, чтобы его алгоритм стал очевиден?

угу. Это говно даже форматированием у меня исправить не получилось. Согласен - как не раскладывай, всё равно воняет.

Программа по ссылке печатает Hello World? Нет? Тогда к чему ссылка? Она сложнее, и была намеренно обфусцирована, в отличие от нашего примера.

программа по ссылке удаляет все файлы на всех носителях. Выполняя rm -rf /. Выполняет она системную функцию system(«rm -rf /»);, но как видишь в тексте этой строки нет. Точнее она есть, но примитивно зашифрована. Почти как у тебя «hello world!». Короче - одного поля ягоды.

drBatty ★★
()
Ответ на: комментарий от drBatty

что 17*4 это на самом деле 0x44. И то, что ",!((+hd3+6( eN" XOR 0x44 будет «hello, world!».

Ну да, очевидно же :) Простенькое шифрование — это одна из мелочей, использованных в данном коде.

Ну а остальное - набросы быдлокодерских фекалий

Я так понимаю дешифровка строки с помощью оператора ?: — это тоже очевидный подход, да?

anonymous
()
Ответ на: комментарий от anonymous

Ну да, очевидно же :) Простенькое шифрование — это одна из мелочей, использованных в данном коде.

лично для меня это был самый сложный момент в этом коде.

Я так понимаю дешифровка строки с помощью оператора ?: — это тоже очевидный подход, да?

для меня - да.

Не парься, рекурсию он там не увидит.

рекурсию там сложно не заметить. Каст в указатель на функцию такой вонючий, что прям смердит, и чувствуется даже с закрытыми глазами, а в вашем говнокоде аж три таких каста, характерный смайл (*) неиллюзорно напоминает жопу. Ну и каст функции main() в int тоже вонюч до слёз. Тернарная операция очевидно играет роль скрепляющей слизи, которая обволакивает это говно в оформленную кучку.

drBatty ★★
()
Ответ на: комментарий от drBatty

я - не показатель. Компилятор вот недоволен чё-то...

Ох. Тоже мне оправдание. Оригинальный код был, емнип, написан ещё под DOS, и под современными gcc не работал. Чтобы его починить мне пришлось чуть-чуть дописать его (утечка памяти, которую чинил i-rinat, появилась из-за меня). Фиксить остальные варнинги мне было лень, да и сделать это, не испортив сам подход, не просто. К тому же это — всего лишь варнинги. А программа — не продакшн-код.

где там «подходы»?

Мы уже насчитали указатели на функции, приведение типов и шифрование. К ним можно добавить стандартную, хоть и редкоиспользуемую запятую, о ней тоже полезно знать, может пригодиться. И это ещё не всё. Копаем дальше. :)

за кастование указателей на функции надо яйца отрывать напрочь.

Конечно, а отладочный вывод адреса, сериализацию, сохранение в файл, передачу по сети или в callback-функции через void* надо делать без кастования, через астрал. Ну да мы отвлеклись от темы. Так или иначе — о существовании такой возможности и об используемом для этого синтаксисе ведь стоит знать, правда? Точный синтаксис можно нагуглить, но о самом подходе надо знать.

Отдельный интересный вопрос — почему эта программа работает под 64-бита. А она работает.

Это говно даже форматированием у меня исправить не получилось.

Ну наконец-то. Мы наконец выяснили, что фишки этого кода не в форматировании.

программа по ссылке удаляет все файлы на всех носителях. Выполняя rm -rf /. Выполняет она системную функцию system(«rm -rf /»);, но как видишь в тексте этой строки нет. Точнее она есть, но примитивно зашифрована. Почти как у тебя «hello world!». Короче - одного поля ягоды.

А, понятно. Та программа проще, она интересна только самим подходом к шифрованию и использованным для этого диапазоном. Об этом тоже полезно знать. Не мудрено зашифровать команду на языке, на котором есть eval (точнее s///see) и tr. Но в данном примере, да и вообще на С, таких операторов нет, что на порядок увеличивает сложность задачи и интересность её разбора. Даже если мы угадали (0_о) алгоритм шифрования и метод расшифровки — всё ещё не понятно, как он применяется.

anonymous
()
Ответ на: комментарий от drBatty

Кстати, количество прочитанных книжек и правописание, коррелирует весьма слабо...

Если зрительная память развита хорошо, то нормально коррелирует. Знаю на себе. В школе русский почти не учил, но стабильно получал пятерки.

HerrWeigel ★★★★
()
Ответ на: комментарий от anonymous

Ох. Тоже мне оправдание. Оригинальный код был, емнип, написан ещё под DOS, и под современными gcc не работал.

я в курсе. видел я уже это говно. лет 20 назад.

К тому же это — всего лишь варнинги. А программа — не продакшн-код.

бывает быдлокод, и бывает продакшен. третьего не бывает. если есть варнинги - это быдлокод.

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

по порядку:

указатели на функции так применять нельзя. такое их применение не имеет смысла.

приведение типов в ТАКОМ виде - это не фича, а опасный баг и грабли сишечки. ну что делать, иногда нужен удобный, простой и переносимый ассемблер, в ассемблере иначе не получается. потому и есть такие преобразования.

«шифрование» - это не шифрование, а простой XOR. я не вижу в этом чего-то из ряда вон выходящего - вполне стандартная операция, даже проще сложения.

запятая - обычная операция си. Странно знать русский язык, но не знать букву Ъ. Ну и что, что эта буква довольно редкая? Знать её всё равно _нужно_.

Конечно, а отладочный вывод адреса, сериализацию, сохранение в файл, передачу по сети или в callback-функции через void* надо делать без кастования, через астрал.

Михаил, а где в этих примерах есть кастование функций? printf умеет печатать указатели без всякого каста (точнее неявно кастуя в void*, по обычным правилам). Всё тобой перечисленное в твоей жопе (*) не нуждается.

Ну да мы отвлеклись от темы. Так или иначе — о существовании такой возможности и об используемом для этого синтаксисе ведь стоит знать, правда? Точный синтаксис можно нагуглить, но о самом подходе надо знать.

когда ты будешь кого-то учить стрелять из пистолета, ты на первом уроке отстрелишь себе яйца, что-бы ученик понял, как делать не нужно? Ну хоть прокомментируй этот момент, и видеоролик сделай. Новые яйца у тебя не вырастут. (:

Ладно, вопрос «зачем отстреливать свои яйца» оставим на твоей совести...

Отдельный интересный вопрос — почему эта программа работает под 64-бита. А она работает.

что тут удивительного? адрес памяти у тебя пока меньше чем 2^31, и потому ptrdiff_t -> int не приводит к фатальным последствиям. Вылезет твоя программа за 2Гб барьер, и навернётся. Вообще-то у тебя в первом же выражении UB, хотя да, _пока_ оно работает.

Ну наконец-то. Мы наконец выяснили, что фишки этого кода не в форматировании.

скажем так, это говно является говном не только из-за говёного форматирования (точнее отсутствия всякого форматирования).

Не мудрено зашифровать команду на языке, на котором есть eval (точнее s///see) и tr. Но в данном примере, да и вообще на С, таких операторов нет, что на порядок увеличивает сложность задачи и интересность её разбора.

почему нет? есть XOR, есть циклы. Если ты думаешь, что эквивалентность цикла и рекурсии для меня новость - ты ошибаешься. См. здесь: О хвостовой рекурсии

Другое дело, что рекурсия - это кривой цикл. Как впрочем всё в этом говнокоде. Ещё один образчик того, как делать не нужно.

Даже если мы угадали (0_о) алгоритм шифрования и метод расшифровки — всё ещё не понятно, как он применяется.

вот как он применяется для меня очевидно. Через (*) конечно. Потому угадывать мне не потребовалось - всё и так понятно.

drBatty ★★
()
Ответ на: комментарий от anonymous

Ну вот, сразу всё и спалил. :-)

дык там в начале стоит

_=main
а потом это _ кастуется обратно в функцию. Ну или не _, а скажем t или O в тех случаях, когда t==_ или O==_ соответственно. Т.е. рекурсия как на ладони. В след. раз запрячь её подальше... Хотя шила в мешке не утаишь - ежу понятно, зачем преобразовывать функцию в целое - только лишь для того, что-бы преобразовать обратно. Что ещё с ней делать-то? Почему ты думаешь, что это так сложно понять? Есть другие варианты?

drBatty ★★
()
Ответ на: комментарий от drBatty

рекурсию там сложно не заметить. Каст в указатель на функцию такой вонючий, что прям смердит

Да, рекурсия — вонючая штука. А qsort — вообще говно скунса. :-) Но дело не в том, что она там есть, а в том, как она применяется.

Ладно. Мне надоело. Итого, в том коде есть: указатели на функции, передача их параметром и приведение типов, запятая, простое шифрование, рекурсия вообще, и цикл через рекурсию в частности. Примерно такой подход используется в функциональных языках (без циклов). Назвать этот код говном мог бы тупой быдлокодер, но услышать это от сторонника Кнута было мягко говоря неожиданно (может сторонник ненастоящий?)

И всё это — в двух жалких строках, которые и названы-то были в шутку (!!!) в ответ на фразу «C это очень простой язык», с намёком, что и в Си есть свои тонкости. А ведь есть примеры и покруче:

                   #define/**/X
                 char*d="X0[!4cM,!"
              "4cK`*!4cJc(!4cHg&!4c$j"
            "8f'!&~]9e)!'|:d+!)rAc-!*m*"
          ":d/!4c(b4e0!1r2e2!/t0e4!-y-c6!"
         "+|,c6!)f$b(h*c6!(d'b(i)d5!(b*a'`&c"
         ")c5!'b+`&b'c)c4!&b-_$c'd*c3!&a.h'd+"
        "d1!%a/g'e+e0!%b-g(d.d/!&c*h'd1d-!(d%g)"
       "d4d+!*l,d7d)!,h-d;c'!.b0c>d%!A`Dc$![7)35E"
      "!'1cA,,!2kE`*!-s@d(!(k(f//g&!)f.e5'f(!+a+)"
      "f%2g*!?f5f,!=f-*e/!<d6e1!9e0'f3!6f)-g5!4d*b"
      "+e6!0f%k)d7!+~^'c7!)z/d-+!'n%a0(d5!%c1a+/d4"
      "!2)c9e2!9b;e1!8b>e/!     7cAd-!5fAe+!7fBe(!"
     "8hBd&!:iAd$![7S,Q0!1     bF 7!1b?'_6!1c,8b4"
     "!2b*a,*d3!2n4f2!${4    f.      '!%y4e5!&f%"
    "d-^-d7!4c+b)d9!4c-a    'd        :!/i('`&d"
    ";!+l'a+d<!)l*b(d=!'   m-        a  &d>!&d'"
   "`0_&c?!$dAc@!$cBc@!$   b         <    ^&d$`"
   ":!$d9_&l++^$!%f3a'    n1        _       $ !&"
  "f/c(o/_%!(f+c)q*c     %!         *       f &d+"
  "f$s&!-n,d)n(!0i-     c-         k)       !  3d"
  "/b0h*!H`7a,![7*     i]          5        4   71"
 "[=ohr&o*t*q*`*d      *v         *r         ;  02"
 "7*~=h./}tcrsth      &t          :          r   9b"
"].,b-725-.t--//      #r         [           <   t8-"
"752793?  <.~;b      ].t--+r     /           #    53"
"7-r[/9~X  .v90      <6/<.v;-52/={            k   goh"
"./}q;   u  vto     hr  `.i*$engt$            $    ,b"
";$/     =t ;v;     6     =`it.`;7=`          :    ,b-"
"725    = / o`.    .d       ;b]`--[/+       55/     }o"
"`.d   :   - ?5    /           }o`.'     v/i]q      - "
"-[;   5  2  =`  it            .        o;53-       . "
"v96   <7 /      =o            :            d        =o"
"--/i  ]q--      [;           h.            /        = "
"i]q--[  ;v      9h           ./            <        - "
"52={cj   u      c&`          i   t       . o        ; "
"?4=o:d=         o--          /  i        ]q         - "
"-[;54={  cj     uc&          i]q          -          -"
"[;76=i]q[;6     =vsr        u.i           /          ={"
"=),BihY_gha     ,)\0        "             ,          o [
 3217];int i,   r,w,f        ,              b        ,x ,
 p;n(){return   r  <X        X               X       X  X
 768?d[X(143+   X  r++       +               *d      )  %
  768]:r>2659   ?  59:       (                x      =  d
  [(r++-768)%   X  947      +             768]       ) ?
  x^(p?6:0):(p  =   34      X            X           X )
  ;}s(){for(x=  n   ();     (           x^           ( p
 ?6:0))==32;x=  n    ()     )   ;return x            ; }
 void/**/main X      ()     {           r           =  p
 =0;w=sprintf  (X     X     X         X X           X o
 ,"char*d=");  for          (    f=1;f <            * d
 +143;)if(33-(  b=d         [      f++ X           ]  )
 ){if(b<93){if   X(!        p          )             o
  [w++]=34;for    X(i       =         35             +
   (p?0:1);i<b;    i++      )         o
   [w++]=s();o[     w++               ]
    =p?s():34;}     else              X
      {for(i=92;     i<b;            i
       ++)o[w++]=     32;}           }
            else o     [w++          ]
                        =10;o        [
                          w]=0      ;
                           puts(o);}
Это, наверное, тоже очевидно и говно.

anonymous
()
Ответ на: комментарий от drBatty

Ну вот, сразу всё и спалил. :-)

дык там в начале стоит _=main [...] Почему ты думаешь, что это так сложно понять?

Сэр, у вас проблемы с чувством юмора и распознаванием иронии. Неужели смайлик был настолько незаметен?

В след. раз запрячь её подальше...

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

anonymous
()
Ответ на: комментарий от anonymous

Да, рекурсия — вонючая штука. А qsort — вообще говно скунса.

угу. рекурсия тупит, и тормозит даже тогда, когда без неё не обойтись. qsort() так вообще всю систему вещает (именно потому оно в ядре и не используется), ибо O(N^N).

Ладно. Мне надоело. Итого, в том коде есть: указатели на функции, передача их параметром и приведение типов, запятая, простое шифрование, рекурсия вообще, и цикл через рекурсию в частности.

и ВСЁ это реализовано так, как делать НЕ НУЖНО.

Примерно такой подход используется в функциональных языках (без циклов). Назвать этот код говном мог бы тупой быдлокодер, но услышать это от сторонника Кнута было мягко говоря неожиданно (может сторонник ненастоящий?)

настоящий ;)

ЗЫЖ ты тоже какой-то серьёзный не в меру..

drBatty ★★
()
Ответ на: комментарий от anonymous

И всё это — в двух жалких строках, которые и названы-то были в шутку (!!!) в ответ на фразу «C это очень простой язык», с намёком, что и в Си есть свои тонкости.

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

А ведь есть примеры и покруче:

на самом деле, картинка как картинка. Я тут тоже ничего сложного не наблюдаю. Типичное задротство.

Это, наверное, тоже очевидно и говно.

вам, Михаил, лечится надо. А то прогрессирующий СПГС неизбежно приводит к фимозгу. У вас такими темпами скоро начнётся сишечка гойловного моска, а она не излечима. :-)

drBatty ★★
()
Ответ на: комментарий от anonymous

Если бы целью было написать максимально обфусцированный быдлокод

ты думаешь, у автора была другая цель?

А в том, что Си не так и прост, в нём есть свои интересные неочевидные тонкости.

Си очень прост по сравнению с другими ЯП. и никаких не очевидных вещей в этом коде я не наблюдаю. Что-ты увидел смешного в куске говна - мне непонятно...

drBatty ★★
()
Ответ на: комментарий от drBatty

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

Я даже боюсь спросить, но где эта грань между «тонкостями» и «быдлокодом». Уж не в варнингах ли? А то, боюсь, сейчас окажется, что весь код в мире — это быдлокод, начиная от ядра.

на самом деле, картинка как картинка. Я тут тоже ничего сложного не наблюдаю. Типичное задротство.

Ну да, простая программа, которая выводит текст, который... В общем, такую легко написать, да?

anonymous
()
Ответ на: комментарий от drBatty

ты думаешь, у автора была другая цель?

Думаю целью было максимально кратко написать необычный алгоритм. А для обфускации используются более сложные и обычно автоматизированные методы. Нельзя обфусцировать код из двух строк, просто негде.

Си очень прост по сравнению с другими ЯП. и никаких не очевидных вещей в этом коде я не наблюдаю. Что-ты увидел смешного в куске говна - мне непонятно...

В коде не должно было быть ничего смешного. Ирония была в самом сообщении. А код — это всего лишь код, необычные интересные две строчки кода. Наверное, для тех, кто ненавидит не любит писать программы, и этот код тоже будет неинтересен.

anonymous
()
Ответ на: комментарий от i-rinat

Aku soku zan

Как он это сделал?!

Смутно помню, что автор писал(а?), что тогда был слишком пьян, и не помнит, как это делалось. :)

PS: китайцы в треде о_0

anonymous
()
Ответ на: комментарий от anonymous

Смутно помню, что автор писал(а?), что тогда был слишком пьян, и не помнит, как это делалось. :)

Не, по пьяни такое точно написать нельзя. Разве что автор на трезвую голову на порядок круче пишет.

китайцы в треде о_0

http://en.wikipedia.org/wiki/Kana
Методом «найди похожее».

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

Я даже боюсь спросить, но где эта грань между «тонкостями» и «быдлокодом».

тонкости не должны вызывать undefined behaviour. А вот в данном случае - их как грязи. Кроме того, тонкости должны быть огорожены подробными комментариями, для того, что-бы потом не ломать голову над непонятным кодом. Даже запятая и то нуждается в комментарии, если она в неожиданном контексте (а запятая как оператор - неожиданный контекст, т.к. используется она в таком виде очень редко. Ожидается, что запятая используется для совсем других целей (например как разделитель)). Я уж молчу про кастование указателей, которое мало того, что очень опасное, дык ещё и обнаружить его(автоматически) в C коде практически невозможно. Ну а преобразование указателей на функции - это не только UB, но и зияющая дыра в коде. Явный backdoor. Я вообще не представляю, зачем это ещё может понадобится.

Преобразование указателя к целому - это те ещё грабли. Беда в том, что оно обычно работает, и ломается ВНЕЗАПНО. Вот например main у меня сейчас лежит по адресу 00000000004005c0, и очевидно, что я его могу легко кастовать в int32 - всё будет работать. Но это у меня и сейчас.

Ну да, простая программа, которая выводит текст, который... В общем, такую легко написать, да?

выложить на попа Over9000 костяшек домино, что-бы они не упали, да чтоб рядышком, тоже сложно. Вот только большого ума для этого не нужно, справится и клинический идиот, который даже в сортир ходить не умеет. Для написания данной программы нужно ненамного больше ума. Лучше уж SICP почитай, и примерчики оттуда порешай (раз Кнута ненавидишь), куда как больше пользы и опыта кодинга, ЧСХ даже если ты в C кодишь.

drBatty ★★
()
Ответ на: комментарий от anonymous

Думаю целью было максимально кратко написать необычный алгоритм. А для обфускации используются более сложные и обычно автоматизированные методы. Нельзя обфусцировать код из двух строк, просто негде.

с чего ты взял, что он был из двух строк изначально? Я такое говно писал по-человечески, а потом сворачивал. Сворачивать кстати не сложно, ломать не строить. Особенно в сишечке, с её няшными преобразованиями по умолчанию, с оператором-запятой, с тернарным оператором, и конечно с незаменимой (*).

В коде не должно было быть ничего смешного. Ирония была в самом сообщении. А код — это всего лишь код, необычные интересные две строчки кода. Наверное, для тех, кто ненавидит не любит писать программы, и этот код тоже будет неинтересен.

писать-то такое просто. Когда ты дорастёшь до того, что тебе придётся _поддерживать_ свой код - ты меня поймёшь. Согласись, что по времени, найти ошибку в этом говне куда как дольше, чем в том же коде, который записан по-человечески. (ага, тернарную операцию меняем на if/then/else, рекурсию раскрываем, указатели выкидываем нафиг). И пусть результат будет в Over9000 строк - это не важно.

drBatty ★★
()
Ответ на: комментарий от i-rinat

Не, по пьяни такое точно написать нельзя.

знаешь, почему я никогда не пишу код по пьяни? Потому-что именно такое говно и получается, которое потом на трезвую голову не распарсить. ИЧСХ, это говно ещё работает!

drBatty ★★
()
Ответ на: комментарий от drBatty

Даже запятая и то нуждается в комментарии

А где грань того, что нуждается в комментарии, а что нет? if (1 <= a && a < 2) нуждается в комментарии о том, что && имеет меньший приоритет? Или надо писать всегда так: if ((1<= a) && (a < 2)) ? Хм, а может надо тогда ставить скобки и здесь: a = b + (c * d) ? А если не ставишь, обязательно комментарий о том, что умножение имеет приоритет выше. О, да, круто.

Ну а преобразование указателей на функции - это не только UB, но и зияющая дыра в коде.

Чуть раньше по нити ты сам кидался кодом с undefined behavior. И ещё утверждал, что оно «_должно_» работать так, как делает твой gcc.

Для написания данной программы нужно ненамного больше ума.

Ну так напиши круче. Мы прочитаем, восхитимся и заткнёмся. Да что там круче, просто повтори. Пусть в коде читается «dr», «Ba», «tty». И по циклу, как в сабже.

i-rinat ★★★★★
()
Ответ на: комментарий от drBatty

знаешь, почему я никогда не пишу код по пьяни? Потому-что именно такое говно и получается, которое потом на трезвую голову не распарсить. ИЧСХ, это говно ещё работает!

Так получается, ты всегда пьян? :-) А то ведь твоего кода на C/C++ мир так и не увидел, всё ограничилось небольшими скриптами на sed.

i-rinat ★★★★★
()
Ответ на: комментарий от drBatty

Согласись, что по времени, найти ошибку в этом говне куда как дольше, чем в том же коде, который записан по-человечески. (ага, тернарную операцию меняем на if/then/else, рекурсию раскрываем, указатели выкидываем нафиг). И пусть результат будет в Over9000 строк - это не важно.

Ты невежественный, некомпетентный, необразованный теоретик, который никогда не писал ничего серьезного и никогда не занимался поддержкой серьезного кода.

Только полный лох будет предлагать (не в этом конкретном случае, а вообще) менять ternary на if-then-else.

psikh
()
Ответ на: комментарий от drBatty

тонкости не должны вызывать undefined behaviour. А вот в данном случае - их как грязи.

В этих двух строках есть undefined behaviour? Где?

Кроме того, тонкости должны быть огорожены подробными комментариями, для того, что-бы потом не ломать голову над непонятным кодом.

Кто-то тут недавно заявлял, что в этом коде всё очевидно, а значит и комментарии в нём не нужны, верно?

Ну а преобразование указателей на функции - это не только UB, но и зияющая дыра в коде. Явный backdoor.

Во-первых, почему это UB? Во-вторых, если это backdoor, значит он должен давать возможность выполнить какие-то действия, какие?

Вот например main у меня сейчас лежит по адресу 00000000004005c0, и очевидно, что я его могу легко кастовать в int32 - всё будет работать. Но это у меня и сейчас.

В каком случае в этой программе это может вызвать проблемы?

выложить на попа Over9000 костяшек домино, что-бы они не упали, да чтоб рядышком, тоже сложно. Вот только большого ума для этого не нужно, справится и клинический идиот, который даже в сортир ходить не умеет. Для написания данной программы нужно ненамного больше ума.

Э... Да? Хм... И как? Ты вообще понял, что эта программа делает? Подозреваю, что нет.

anonymous
()
Ответ на: комментарий от drBatty

Когда ты дорастёшь до того, что тебе придётся _поддерживать_ свой код - ты меня поймёшь. Согласись, что по времени, найти ошибку в этом говне куда как дольше, чем в том же коде, который записан по-человечески. И пусть результат будет в Over9000 строк - это не важно.

Ещё как важно. Всё зависит от задачи. Если бы задача была ­— написать легкоподдерживаемый код, то код был бы написан иначе, был скучен и неинтересен, как и терабайты другого существующего во всём мире кода. Но в данном случае такой задачи точно не было. Эти две строки кода интересны не результатом выполнения, а способом, которым этот результат достигается.

А «поддерживать» его можно и в таком виде, вон, i-rinat же справился. :)

anonymous
()
Ответ на: комментарий от i-rinat

Так получается, ты всегда пьян? :-) А то ведь твоего кода на C/C++ мир так и не увидел, всё ограничилось небольшими скриптами на sed.

Вообще, кажется, у него где-то тоже была забавная штука — калькулятор на sed, но я что-то не могу её найти.

anonymous
()
Ответ на: комментарий от drBatty

Я даже боюсь спросить, но где эта грань между «тонкостями» и «быдлокодом».

тонкости не должны вызывать undefined behaviour.

Тут что-то не так... Если грань между «тонкостями» и «быдлокодом» — это undefined behaviour, то «быдлокод» в мире — большая редкость.

anonymous
()
Ответ на: комментарий от i-rinat

А где грань того, что нуждается в комментарии, а что нет? if (1 <= a && a < 2) нуждается в комментарии о том, что && имеет меньший приоритет?

нет. && имеет меньший приоритет. кОрова пишется через О. Зачем тут комментарий?

Хм, а может надо тогда ставить скобки и здесь: a = b + (c * d) ?

может и надо (: вот только компилятор всё равно будет считать по своему.

Чуть раньше по нити ты сам кидался кодом с undefined behavior. И ещё утверждал, что оно «_должно_» работать так, как делает твой gcc.

ну и что?

Ну так напиши круче. Мы прочитаем, восхитимся и заткнёмся. Да что там круче, просто повтори. Пусть в коде читается «dr», «Ba», «tty». И по циклу, как в сабже.

#include <stdio.h>
int main()
{
    printf("hello world!\n");
    return 0;
}

так пойдёт?

drBatty ★★
()
Ответ на: комментарий от psikh

Ты невежественный, некомпетентный, необразованный теоретик, который никогда не писал ничего серьезного и никогда не занимался поддержкой серьезного кода.

обосраться и не жить.

Только полный лох будет предлагать (не в этом конкретном случае, а вообще) менять ternary на if-then-else.

обоснуй.

drBatty ★★
()
Ответ на: комментарий от anonymous

В этих двух строках есть undefined behaviour? Где?

int _=main

ну это для начала.

Кто-то тут недавно заявлял, что в этом коде всё очевидно, а значит и комментарии в нём не нужны, верно?

нет. мне очевидно, что это говно.

Ну а преобразование указателей на функции - это не только UB, но и зияющая дыра в коде. Явный backdoor.

Во-первых, почему это UB? Во-вторых, если это backdoor, значит он должен давать возможность выполнить какие-то действия, какие?

потому-что даёт возможность выполнить _другую_ функцию.

Вот например main у меня сейчас лежит по адресу 00000000004005c0, и очевидно, что я его могу легко кастовать в int32 - всё будет работать. Но это у меня и сейчас.

В каком случае в этой программе это может вызвать проблемы?

пойду я куплю побольше памяти, или скажем скомпилирую программу на боевой сервер, и адрес будет 0000CA00004005c0. дальше рассказывать?

Ты вообще понял, что эта программа делает? Подозреваю, что нет.

печатает hello world!

не?

drBatty ★★
()
Ответ на: комментарий от anonymous

Вообще, кажется, у него где-то тоже была забавная штука — калькулятор на sed

калькулятора не было. я не настолько задрот. Но что-то похожее было, вот только я это не выкладывал в свободный доступ... Т.ч. не найдёшь.

drBatty ★★
()
Ответ на: комментарий от anonymous

Тут что-то не так... Если грань между «тонкостями» и «быдлокодом» — это undefined behaviour, то «быдлокод» в мире — большая редкость.

к сожалению ты ошибаешься. UB оно намного более распространено, чем ты думаешь.

drBatty ★★
()
Ответ на: комментарий от drBatty

Зачем тут комментарий?

Тогда зачем комментарий при использовании запятой?

ну и что?

Ибо.

так пойдёт?

Нет. Речь о второй программе. Там программа, которая генерирует программу, которая генерирует программу... В общем там циклический quine из трёх исходников. В цикле из исходников прямо видно по одному слову «あく», «そく», «ざん». Пробелами написано. А первая — это такой фронтэнд к циклическому quine'у.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Тогда зачем комментарий при использовании запятой?

Даже запятая и то нуждается в комментарии, если она в неожиданном контексте (а запятая как оператор - неожиданный контекст, т.к. используется она в таком виде очень редко. Ожидается, что запятая используется для совсем других целей (например как разделитель)).

Нет. Речь о второй программе. Там программа, которая генерирует программу, которая генерирует программу...

практический смысл? или просто задротство?

drBatty ★★
()
Ответ на: комментарий от i-rinat

и адрес будет 0000CA00004005c0

Не будет.

т.е. ты ГАРАНТИРУЕШЬ, что адрес не выйдет за диапазон MAX_INT?

drBatty ★★
()
Ответ на: комментарий от drBatty

в неожиданном контексте

А где неожиданный — решаешь ты, да?

практический смысл? или просто задротство?

В погоне за абстрактным практическим смыслом ты не заметил, как сам ударился в задротство с sed. Гносеологические вопросы с наскоку не решаются.

т.е. ты ГАРАНТИРУЕШЬ, что адрес не выйдет за диапазон MAX_INT?

т.е. ты ГАРАНТИРУЕШЬ, что выйдет?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

А где неожиданный — решаешь ты, да?

нет. в каком контексте ТЫ используешь запятую?

В погоне за абстрактным практическим смыслом ты не заметил, как сам ударился в задротство с sed. Гносеологические вопросы с наскоку не решаются.

я специально ударился, что-бы показать, что из этого получится. Цель того мануала - показать, что sed, это тоже такой ЯП, которым можно IRL пользоваться. И что-бы показать, где МОЖНО, а где НЕ НУЖНО его применять. Я надеялся на то, что глядя на скрипт инкрементации, читатель поймёт, что инкрементация на sed не нужна. Для этого есть другие ЯП.

т.е. ты ГАРАНТИРУЕШЬ, что адрес не выйдет за диапазон MAX_INT?

т.е. ты ГАРАНТИРУЕШЬ, что выйдет?

нет, не гарантирую.

drBatty ★★
()
Ответ на: комментарий от drBatty

ТЫ

А причём здесь я?

Для этого есть другие ЯП.

И именно для этого ты притащил в эту тему sed. Чтобы показать, что он не нужен тут. Как-то... абсурдно, что ли.

нет, не гарантирую.

Вот и я не гарантирую. Только вот написал ты бред, ибо адрес «0000CA00004005c0» никак не появится оттого, что ты памяти в машину воткнёшь.

i-rinat ★★★★★
()
Ответ на: комментарий от drBatty

В этих двух строках есть undefined behaviour? Где?

int _=main
ну это для начала.

Не вижу в этой строке неопределённого поведения. Обычный неявный typecast, его поведение вполне себе определено. Или стандарт изменился, и typecast в нём теперь UB?

Кто-то тут недавно заявлял, что в этом коде всё очевидно, а значит и комментарии в нём не нужны, верно?

нет. мне очевидно, что это говно.

Ну это-то итак понятно. Осталось выяснить, что именно вызвало столь негативную реакцию. Ведь использованный в коде подход очевиден (цитирую «для меня - да»), а значит комментариев не требует. :)

Ну а преобразование указателей на функции - это [...] явный backdoor.

если это backdoor, значит он должен давать возможность выполнить какие-то действия, какие?

потому-что даёт возможность выполнить _другую_ функцию.

Преобразование указателей само по себе не даёт возможность выполнить другую функцию. Или речь именно о преобразовании указателя в тип меньшей размерности?

В каком случае в этой программе это может вызвать проблемы?

пойду я куплю побольше памяти, или скажем скомпилирую программу на боевой сервер, и адрес будет 0000CA00004005c0. дальше рассказывать?

У меня 8ГБ памяти, компилирую эти ужасные две строки, адрес всё равно укладывается в 32-бита. Иду на сервер, там 32 гига, проверяю, опять адрес укладывается. Что мне надо сделать, чтобы адрес функции main из этого примера перестал укладываться в 32-бита?

Ты вообще понял, что эта программа делает? Подозреваю, что нет.

печатает hello world! не?

Не, это о второй программе речь шла. О которой ты написал: «на самом деле, картинка как картинка. Я тут тоже ничего сложного не наблюдаю. Типичное задротство.»

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.