LINUX.ORG.RU

В чём смысл этого?

 , ,


0

3

Привет, ЛОР!

Столкнулся тут с интересной фигнёй. Clang выдаёт предупреждение по поводу неиспользуемых аргументов командной строки. И это, естественно, гробит сборку при использовании -Werror.

Вопрос: нахрена это? Чтобы что? Как это делает хоть чью-то жизнь лучше?

UPD: чтобы развеять завесу непонимания, пример того, что вылезло у меня:

clang: error: argument unused during compilation: ‘-pie’ [-Werror,-Wunused-command-line-argument]

Выдается если отдельно собирать объектники без линковки. Т.е. что-то типа clang -o file.o -c -pie -fpie null.c.

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 1)

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

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

чо?

В данном случае, шланг выдаёт предупреждение на валидные аргументы, которые ни на что не влияют. К всякой ереси это отношения не имеет.

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

Ну, ты написал что-то, на что компилятору полностью наплевать, и при этом ты уверен, что как-то рулишь процессом, но по факту нет. Об этом и сообщает.

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

Но это не проблема исходного кода, это проблема флагов компилятора. При этом это подаётся как ошибка в случае с -Werror.

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

В любом случае, я пока не представляю ошибки, которую этим можно предотвратить.

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

Хи-хи. Компилятор - это такой суровый мужик, а ты в роли девочки, которая что-то там щебечет совершенно неважное.

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

Не-а. Компилятор – это такая животная (своенравная, да), которую надо укротить и объездить. А программист (если он действительно программист) – укротитель.

В итоге процесса все эти clang, gcc и icc должны сидеть на табуретах и прыгать по команде дрессировщика на глазах у изумлённой публики. «А иначе зачем…»

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

-Wno-unused-command-line-argument gcc игнорит, на -Wno-error выдаёт ошибку.

annulen ★★★★★
()

Вопрос: нахрена это? Чтобы что? Как это делает хоть чью-то жизнь лучше?

У меня есть версия: чтобы писать configure-time тесты на поддержку тех или иных аргументов компилятором.

annulen ★★★★★
()

Всё правильно делает. Мусор в аргументах это или опечатка или ошибка. Чем раньше заметишь, тем лучше.

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

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

Это, конечно, очень классно. Особенно когда тебе совершенно делать нечего помимо этого.

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

Не-а. Компилятор – это такая животная (своенравная, да), которую надо укротить и объездить. А программист (если он действительно программист) – укротитель.

Компилятор, особенно сишный, это продукт больных фантазий сборища шизофреников.

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

В чём смысл этого?

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

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

Но это не проблема исходного кода, это проблема флагов компилятора.

Это проблема вызова с недефолтными ключами компилятора и следовательно исходного кода в совокупности с кодом системы сборки проекта. Хотите завершаться по ошибке при предупреждении — ну так вычищайте все предупреждения, благо ручки есть: (void)&unused;

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

когда решил вместо gcc вставить шланг

Плохая идея. Лучше напиши в ридми что шланг не поддерживается, а в build-deps пакета вставь gcc.

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

Конкретно варнинг, который сломал мне сборку:

clang: error: argument unused during compilation: ‘-pie’ [-Werror,-Wunused-command-line-argument]

Выдается если отдельно собирать объектники без линковки. Т.е. что-то типа clang -o file.o -c -pie -fpie null.c.

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

Ээээ… а это тут причём? лол

В смысле? Это и есть правильный способ закрыть это предупреждение и самому себе и другим в коде указать, что это именно unused.

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

В смысле? Это и есть правильный способ закрыть это предупреждение и самому себе и другим в коде указать, что это именно unused.

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

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

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

А, и правда, надо больше спать :) Извини.

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

Плохая идея. Лучше напиши в ридми что шланг не поддерживается, а в build-deps пакета вставь gcc.

Угадал автора даже до конца не дочитав коммент лол :DDDDD

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

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

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

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

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

Можно примерный сценарий, в котором это спасает от ошибок?

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

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

Можно примерный сценарий, в котором это спасает от ошибок?

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

Окей, к какой именно ошибке приведёт передача -L при компиляции или передача -I при компоновке? Какой неправильный результат я получу?

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

Какой неправильный результат я получу?

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

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

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

Чо? При вызове gcc -L/some/path -c -o file.o file.c я получаю вполне конкретный результат. Путь к библиотекам, ясен хер, игнорируется.

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

Это не моя логика. Крайне тупой аргумент, не делай так.

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

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

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

Как оказалось, этот вариант хуже тем, что его не принимает gcc, то есть перед использованием нужен иф по компилятору или тест на прверку поддержки флага.

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

При вызове gcc

gcc-проблемы.

Это не моя логика.

Твоя, твоя. Путь к файлу такой же аргумент командной строки, как и любой другой аргумент. Если тебе не важна валидность аргумента в одном случае, то нет никаких причин желать её в другой.

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

gcc-проблемы.

Ну или шланг делали известные тут программисты-анальники. Я склоняюсь к этому сценарию.

Твоя, твоя. Путь к файлу такой же аргумент командной строки, как и любой другой аргумент. Если тебе не важна валидность аргумента в одном случае, то нет никаких причин желать её в другой.

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

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

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

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

Так аргумент-то валиден.

Нет, не валиден. На операцию «налить кипятка в чашку» была дана опция «арабика». Это не валидная опция для кипятка, это валидная опция для операции «насыпать пару ложек кофе».

Алсо, про gcc -L/some/path - по уму должен был бы ругнуться, если пути нет или если нет компоновки. Но gcc та ещё поделка.

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

Нет, не валиден. На операцию «налить кипятка в чашку» была дана опция «арабика». Это не валидная опция для кипятка, это валидная опция для операции «насыпать пару ложек кофе».

Если ты из арабики попытается сделать чай, получится не чай. А вот gcc мне выдаёт вполне рабочий объектный файл, который я могу слинковать.

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

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

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

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

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

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

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

Чо?

Хорошая программа должна уведомить тебя о совершённой тобой ошибке.

Но тут нет ошибки.

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

Да нет, это не ответ. Ты херню какую-то написал.

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

Думаешь, они чай из арабики заваривают там? Я всё ещё думаю, что это пример типичной сишной шизофрении, заключающейся в том, что если где-то можно поднасрать, то обязательно нужно поднасрать.

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

Я всё ещё думаю, что это пример типичной сишной шизофрении

Ну так и зачем вы себя насилуете и пишете на Си? Видно же, что вы ниосилили, бросьте.

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

Ну так и зачем вы себя насилуете и пишете на Си?

Приходится.

Видно же, что вы ниосилили

К моему вящему сожалению, осилил. В отличие от тех, кто тут клоунами разбрасывается.

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

Но тут нет ошибки.

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

LamerOk ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.