LINUX.ORG.RU

Насильное ограничение подмножества C++ в проекте

 ,


0

6

Привет, ЛОР!

Скажи, а какие есть рецепты для сабжа? Допустим, я не хочу, чтобы в проекте использовались сырые указатели, new/delete, вызовы из cstdlib и прочие штуки, которым в современном C++ есть более кошерная замена. Есть ли возможность завалить сборку, если в коде такое встретилось? В идеале, я представляю себе некую утилиту, которая анализирует исходники и выдаёт предупреждение, если встретилось что-то из заданного ей списка.

Спасибо, ЛОР.

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

«Страуструп понимает проблемы безопасных плюсов не лучше юзера hateyoufeel» ты тут же заявишь, что ничего подобного не говорил.

И да - конечно я такого не говорил. Но я вам могу подкинуть другую идею - как вы думаете кто диктует правила игры? Вы считаете что в данный момент от Страуструпа что-то зависит? Так же как и у поп звёзд не было бы ничего, так же и разрабы конечных продуктов напрямую диктуют что попадёт в стандарт, а что нет. И там где то сверху про VLA (в контексте C vs C++) говорили? По моей информации всё идёт к тому что их нафиг выкинут из стандарта. Хозяйке на заметку.

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

Я помолчу.

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

Ты как, топикстартеру утилиту-то подскажешь, или это цеховой секрет? Я волнуюсь.

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

Ты как, топикстартеру утилиту-то подскажешь, или это цеховой секрет?

Я - злостный пропраетарщик, сорьки. Конкретно в этом вопросе я ему ничем помочь не могу.

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

И да - конечно я такого не говорил. Но я вам могу подкинуть другую идею - как вы думаете кто диктует правила игры? Вы считаете что в данный момент от Страуструпа что-то зависит?

Ё-моё, это всё что ты родил? Да, от Страуструпа по крайней мере зависит то, что он публично будет рекламировать. Строго говоря, никто эти гайдлайны не просил, и есть подозрение, что они так и пролежат в виде мало кем используемой опции. Так что да, я думаю, что он считает их хорошим решением. Впрочем, если не веришь, то замени фамилию Страуструпа на того агента ZOG, чьё авторство ты подозреваешь. Ничего не изменится, всё равно этот человек будет более компетентен в теме, чем ты или ТС.

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

всё равно этот человек будет более компетентен в теме, чем ты или ТС.

Я бы сделал ставку на то что любой из нас более компетентен в вопросе чем конкретно вы, с вашим устаревшим на 20ть лет опытом (точнее его полным отсутствием) - так точно.

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Я бы сделал ставку на то что любой из нас более компетентен в вопросе чем конкретно вы

Отличный аргумент. Одна проблема: я не выпускал своей версии спецификации безопасных плюсов, так что вопрос моей компетентности нерелевантен. Я просто внаглую спрятался за спину Страуструпа и перевожу стрелки на него.

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

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

а откуда вообще желание указать нонейму из интернета

Не поверите - тупо бывает скучно. И, спешу заметить - о своей анонимности я печусь гораздо больше чем о вашей.

на его место?

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

Может потому что ты понимаешь, что в реале ты полный ноль

Хех, действительно, ага…

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

Не поверите - тупо бывает скучно.

Не поверю. Для тебя это было так важно, что ты несколько раз повторил.

И, спешу заметить - о своей анонимности я печусь гораздо больше чем о вашей.

А что случилось? Ведь вчера только ты сотрясал своим опытом и не боялся что попросят пруфов, а сейчас вдруг как-то сник… Неужели от того что я угадал? Но ты не расстраивайся, популярность плюсов в последнее десятилетие несколько снизилась, всё больше всякую хипстоту берут. Поэтому видя живого плюсовика можешь смело предполагать, что работает над старым проектом. Ну а если он начинает самоутверждаться хвастаясь такой ерундой, то наверняка есть какие-то сомнения на свой счёт.

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

Иначе никак не объяснить, как ты умудрился Haskell в родители расту записать. После этого ты, может, и поймёшь, что «натянуть полуручное управление памятью» - это важнее чем то, с какой стороны от переменной стоит её тип.

Ты кажется напрочь не понимаешь разницу между трейтом и классом, лол.

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

Ну а я тебе написал, что есть вроде какой-то чекер на этот предмет от майкрософта. Мне за тебя погуглить предлагаешь?

«Есть» и «вроде» – это очень круто, но только это не делает того, что я хочу.

Тебе явно следует выяснить, что такое семантика. Иначе никак не объяснить, как ты умудрился Haskell в родители расту записать. После этого ты, может, и поймёшь, что «натянуть полуручное управление памятью» - это важнее чем то, с какой стороны от переменной стоит её тип.

Блин, если уж тянуть сову на глобус, это плюсы семантически более похожи на хаслелем, точнее их шаблонный подъязык.

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

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 3)
Ответ на: комментарий от khrundel

Выросло поколение, не знающее анекдот про уехать в Урюпинск.

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

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

Ты кажется напрочь не понимаешь разницу между трейтом и классом, лол.

Ты написал столько глупостей в одном предложении. Во-первых при чём тут классы и трейты? Во-вторых, между классами и трейтами в общем-то и нет разницы. Ну на том уровне абстракции, на котором плюсы/раст и хаскел в принципе можно сравнивать, учитывая принципиальное различие между ними. В плюсах присутствуют именно классы, а не типы или структуры, именно потому, что когда это всё ещё принималось всерьёз, т.е. в книжках вышедших до середины 90, классы описывались как обобщения вероятно разнотиповых объектов, подразумевалось что почти всегда будет городиться дерево наследования. В-третьих, вот в то время, когда раст разрабатывался, существовал C# с его интерфейсами. Интерфейсы в шарпее использовались как срердство динамического полиморфизма и ещё как ограничитель в дженериках. Внезапно трейты в расте используются в основном по этому же назначению, разница минимальна, трейт может включать тип и трейт можно реализовать для чужого типа. Нельзя исключить вариант, что трейты передрали оттуда. Если бы в языке их назвали не коротким словом «трейт», а длинным «интерфейс», мне бы тут втирали про наследие не хаскелла, а шарпа.

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

«Есть» и «вроде» – это очень круто, но только это не делает того, что я хочу.

Ну извини что не подорвался и не принёс на блюдечке. Что до того что ты хочешь, я тебе с самого начала предлагаю поменять это самое «хочу» на вменяемые правила из кор гайдлайнов.

Я тебя обожаю, чувак. Ты потрясающий! Я нихрена не понимаю, что ты пишешь,

Тут ты прав, я должен был догадаться, что ты не поймёшь. Ты не стесняйся, спрашивай. Так вот, чтоб понять, тебе надо пойти в гугл и ввести в поиск 2 слова «декларативный» и «императивный». Потом узнать, к каким типам относятся обсуждаемые 3 языка. Ну и потом немного подумать, и найти декларативное подмножество в плюсах. И не найти в расте. Я вообще был немало удивлён, увидев ссылку на хаскелл. Видимо действительно он заслужил упоминания просто потому что и там и там есть нечто, называемое «трейт». Я, честно говоря, даже не рассматривал аналогию с этой стороны.

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

Ну извини что не подорвался и не принёс на блюдечке.

Ты бы и не смог принести. Тулза от MS – это часть Visual Studio и работает только под Windows.

я тебе с самого начала предлагаю поменять это самое «хочу» на вменяемые правила из кор гайдлайнов.

Зачем ты это делаешь?

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

К каким? Расскажи! Я просто на всех трёх писал, на двух из них даже за бабло (ocaml в проде не взлетел :( ). Haskell – мой любимый императивный язык!

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Зачем ты это делаешь?

Ну кто-то же должен тебе сказать что ты тупишь. Пусть лучше это будет незнакомец с лора, так тебе полегче будет. Вот смотри, чисто теоретически, появится у тебя коллега, чей код не станет собираться. Он пойдёт и отключит твой чекер, или правила перенастроит. А тебя с твоими хотелками нахер пошлёт. А на разборках скажет, что под твои тараканы подстраиваться не собирается, и перескажет всё то что я тебе до этого писал, про висящие ссылки и итераторы. А если бы ты был поумнее, и избрал вместо колхоза стандартное решение, оно бы и качественнее и функциональнее было бы, и безопаснее, и даже перспективнее: если даже сейчас выбранный тобой тул что-то из core guidelines не отлавливает, был бы шанс что в следующей версии научится. И в случае конфликта ты бы мог указать, что это не твой произвол зазнавшегося мудака, а осознанное ответственное решение. Но тебя, видимо, NIH-синдром ест, ну или твой код настолько говно, что привести его к требованиям Страуструпа нереально.

К каким? Расскажи! Я просто на всех трёх писал, на двух из них даже за бабло (ocaml в проде не взлетел :( ). Haskell – мой любимый императивный язык!

Знаешь, ты не первый, кто жидко обосравшись пытается сделать вид что он типа тролль. Обтекай, клован.

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

Он пойдёт и отключит твой чекер, или правила перенастроит. А тебя с твоими хотелками нахер пошлёт. А на разборках скажет, что под твои тараканы подстраиваться не собирается, и перескажет всё то что я тебе до этого писал, про висящие ссылки и итераторы.

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

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

Проблема в том, что обосрался тут ты. И, что гораздо хуже, продолжаешь срать себе в штаны.

Расскажи мне, в чём принципиальная разница между вот этими кусками кода и какой из них императивный, а какой – нет?

C++:

int main() {
  std::string name;
  std::cin >> name;
  std::cout << "Hello, " << name << "!" << std::endl;
  return 0;
}

Haskell:

main = do
  name <- getLine
  putStrLn ("Hello, " <> "name" <> "!")
hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от cumvillain

А зачем тебе коллега, который не может обсудить проблему и вместо этого устраивающий истерики?

Незачем, с пляжу, конечно. Дело за малым, выяснить, кто подходит под это описание, тот коллега или сам hateyoufeel.

В любой растосрач тут на лорчике непременно приходит плюсовик, утверждающий что:

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

Вот это же самое скажет и этот коллега. Только если растаман может возразить «зато безопасно», то hateyoufeel не сможет, так как без контроля заимствований у него всё равно всё посыпется, не из-за указателя так из-за итератора или спана.

Как в анекдоте «билет купил, но не поехал».

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

Незачем, с пляжу, конечно. Дело за малым, выяснить, кто подходит под это описание, тот коллега или сам hateyoufeel.

А что тут выяснять? Это технические вопросы, есть кто-то шлет тебя нахер из-за технических вопросов, этот человек отправляется на рынок труда. Нормальные люди так себя не ведут.

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

Расскажи мне, в чём принципиальная разница между вот этими кусками кода и какой из них императивный, а какой – нет?

Я знаю, правильный ответ: слово «do», верно?

Это замечательно, что ты знаешь про монаду io. Однако, уверяю тебя, когда люди начинают спорить о том, например, является ли язык C кроссплатформенным, если один из них приведёт пример ассемблерной вставки или там вызова winapi функции как доказательство завязанности на конкретный процессор или конкретную операционку, то он получит только очередную порцию «божьей росы» на лицо. Вот прямо как ты сейчас.

Ещё попытки будут?

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

Не, ну надо понимать, что посылу нахер будет предшествовать переписка в стиле «я тут исправил баг в сборке» - «верни как было» - «зачем» и т.п. И, судя по этой теме, скорее всего первый кто начнёт грубить будет как раз hateyoufeel. Так что нет, никакого преимущества у него не будет. Ну, если это не его домашний проект, тогда, конечно, никакого коллеги не будет изначально.

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

Не, ну надо понимать, что посылу нахер будет предшествовать переписка в стиле «я тут исправил баг в сборке» - «верни как было» - «зачем» и т.п.

Ты сейчас описываешь типичную примадонну, которая вместо того чтобы пройти code review как белый человек, что-то набыдлокодил и теперь обижается.

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

Ты сейчас описываешь типичную примадонну, которая вместо того чтобы пройти code review как белый человек, что-то набыдлокодил и теперь обижается.

Ты хочешь сказать, что идею hateyoufeel зарубят ещё на кодревью?

Короче, ты мне надоел. Тебе объясняют простую идею на пальцах, а ты фантазируешь какую-нибудь деталь и из неё пытаешься выгородить ТСа.

khrundel ★★★★
()
Последнее исправление: khrundel (всего исправлений: 1)
Ответ на: комментарий от khrundel

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

Завязки на платформу, компиляторы и архитектуры, лол. C ровно настолько кроссплатформенный, насколько его смогли портировать на нужную платформу.

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

Завязки на платформу, компиляторы и архитектуры, лол.

И?

Думаешь в JVM нет завязок на архитектуры?

Короче всё, ты идёшь в игнор. Есть уровень тупизны, который даже я не стану терпеть.

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

Думаешь в JVM нет завязок на архитектуры?

Я думаю что в JVM нет завязок на архитектуры подобного плана:

unsigned long long a, b, c;

a = b / c;

И этот код, в зависимости от фазы луны, может не компиляться для определенных архитектур, потому что gcc пытается оптимизировать не тем чем надо :D

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

Я знаю, правильный ответ: слово «do», верно?

Нет, не верно. Попробуй ещё раз. Почему-то ты утверждаешь, что хачкелл не является императивным языком, но зато им является C++. Я так и не понял почему, а ты так и не смог объяснить. Вместо этого что-то про stdlib и winapi несёшь.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от hateyoufeel

Нет, не верно.

Нет, верно. Ну или можешь толкнуть мне речь о том, что означает это слово в хаскеле.

А пока считаем что ты в очередной раз обосрался. Причём на выбранном тобой же примере.

Я так и не понял почему,

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

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

обосрался

А ты кроме этого слова другие знаешь?

императивном низкоуровневом расте.

С чего ты взял, что раст низкоуровневый? Что ты вообще имеешь ввиду под этим словом?

Тем не менее, я настаиваю на своём утверждении: трейты в расте фактически скопированы с классов в хаскелле.

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

А ты кроме этого слова другие знаешь?

Знаю. Но я не перечисляю известные мне слова, я описываю ситуацию. А она лучше всего описывается именно этим словом.

С чего ты взял, что раст низкоуровневый? Что ты вообще имеешь ввиду под этим словом?

Я уважаю твою тягу к знаниям, но лекции проводить не намерен. Просто прими как данность: Раст довольно низкоуровневый язык. Я бы даже сказал, что чуток ниже плюсов, но если не поверишь - спорить не буду.

Тем не менее, я настаиваю на своём утверждении: трейты в расте фактически скопированы с классов в хаскелле.

Лол, ну как скажешь. Можно подставить названия нескольких других языков и степень натяжки при этом не увеличится

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

я описываю ситуацию.

Да нет, ты описываешь свои шизоидные копрофантазии.

Просто прими как данность: Раст довольно низкоуровневый язык

В чём это измеряется?

Можно подставить названия нескольких других языков и степень натяжки при этом не увеличится

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

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

Подставь

Так уже подставлял выше. Тупо интерфейсы из C#, например.

Тупо – это то, что ты пишешь. Интерфейсы в C# и жабе могут наследоваться. С трейтами в Rust такое не работает. При этом классы из хачкелля трейты в ржавом копируют практически один в один. Вплоть до ассоциированных type families.

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

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Тупо – это то, что ты пишешь. Интерфейсы в C# и жабе могут наследоваться.

Даже если бы было так, разве это принципиально? Разве это бОльшая разница чем сравнение раста с хаскелем?

С трейтами в Rust такое не работает.

А давай проверим.

#![feature(trait_upcasting)]
trait Foo{
   fn foo(&self); 
}

trait Bar: Foo{ // типа наследование
    fn bar(&self);
}
struct S;

impl Foo for S {
    fn foo(&self){
        println!("foo for S")
    }
}
impl Bar for S {
    fn bar(&self){
        println!("bar for S")
    }
}
fn generic_for_foo(f: &impl Foo){
    f.foo()
}
fn generic_for_bar(b: &impl Bar){
    b.bar();
    b.foo(); // наследование работает!!! Дженерик знает что имеет право вызвать метод родителя из переменной потомка
}
fn dyn_for_foo(f: &dyn Foo){
    f.foo()
}
fn dyn_for_bar(b: &dyn Bar){
    b.bar();
    dyn_for_foo(b); // апкаст трейт обжекта, йопта!! Да, экспериментально, но стараются же
}
fn main() {
  let s = S;
  generic_for_bar(&s);
  dyn_for_bar(&s);
}

Как видишь, статический «апкаст» в дженерике работал примерно всегда, а динамический апкаст добавляют.

В общем… да, ты понял правильно, ты в очередной раз обосрался.

Видишь, как интересно получается, что не новый аргумент у тебя, то глупость какая-нибудь. А потому я советую тебе сделать шаг назад и обдумать вот такую мысль: если ты не можешь в сраче на лорчике придумать 1 сраный аргумент, такой, который не рассыпался бы при первой попытке критически на него взглянуть, способен ли ты самостоятельно (!) не убив на это года, придумать такое подмножество языка C++, которое действительно давало бы хоть какие-то элементарные гарантии безопасности и при этом оставалось полнофункциональным? Короче, спили мушку используй коре гайдлайнс.

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

типа наследование

Это не наследование, балда. Ты опять высосал бред из пальца и не знаешь Rust ни разу.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Это не наследование, балда. Ты опять высосал бред из пальца и не знаешь Rust ни разу.

А что? Код есть, апкаст к базовому трейту работает, в найтли даже для трейтобжектов. Что тебе ещё надо?

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

А что? Код есть, апкаст к базовому трейту работает, в найтли даже для трейтобжектов. Что тебе ещё надо?

То, что это не наследование? Наследование предполагает возможность переопределить методы родителя (статические, например, у которых нет Self в параметрах) в потомке. Можешь ли ты в Rust так сделать? Нет, не можешь.

Вывод: ты нихрена не разбираешься ни в C++, ни в Rust, ни в Haskell, ни в программировании вообще.

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

Наследование предполагает возможность переопределить методы родителя

наследование является механизмом повторного использования кода

«возможность переопределить методы родителя» это про полиморфизм подтипов

вообще-то эти понятия слиты воедино только в ЯП со статической типизацией, а другие разделяют вышеописанные концепции

всё, не отвлекаю

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

наследование является механизмом повторного использования кода

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

«возможность переопределить методы родителя» это про полиморфизм подтипов

Наследование и полиморфизм идут рука об руку.

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

Наследование предполагает возможность переопределить методы родителя (статические, например, у которых нет Self в параметрах) в потомке. Можешь ли ты в Rust так сделать? Нет, не можешь.

Мужчина, проснитесь, вы обосрались. Цитирую: Тупо – это то, что ты пишешь. Интерфейсы в C# и жабе могут наследоваться. С трейтами в Rust такое не работает.

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

Вывод: ты нихрена не разбираешься ни в C++, ни в Rust, ни в Haskell, ни в программировании вообще.

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

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

Цитирую: Тупо – это то, что ты пишешь. Интерфейсы в C# и жабе могут наследоваться. С трейтами в Rust такое не работает.

Ага. Всё так. Потому что это не наследование. Ты просто тупняк постишь. С другой стороны, я его не то чтобы читаю.

олько что каждый раз этому предшествовала легкоопровергаемая глупость.

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

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

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

Они противоречат друг другу только в твоём больном мозгу. Серьёзно, перестань уже шизоидный бред писать.

hateyoufeel ★★★★★
() автор топика