LINUX.ORG.RU

Как компилировать код на C, чтобы компилятор меня бил по рукам за плохие вещи?

 , ,


1

2

Добрый день! На данный момент я собираю свой код на C с помощью алиаса build:

build() {
    cc -g -O2 -Wall -Werror -Wformat-security -Wignored-qualifiers -Winit-self \
    -Wswitch-default -Wfloat-equal -Wpointer-arith -Wtype-limits \
    -Wempty-body -Wstrict-prototypes -Wold-style-declaration \
    -Wold-style-definition -Wmissing-parameter-type -Wmissing-field-initializers \
    -Wnested-externs -Wno-pointer-sign -std=gnu99 "$@"
}
Подскажите, пожалуйста, что ещё можно навесить туда, чтобы компилятор меня бил по рукам за то, что делать нельзя или не стоит? Я слышал про sanitizers, но, прочитав краткий ман, плохо понял, как они работают. Заранее спасибо.

★★

Стандарт лучше не gnu99, а c89 (если код позволяет, так он хоть будет переносим за пределы gcc); из ворнингов обычно использую -Wall -Wextra -Wpedantic.

Bfgeshka ★★★★★
()

-Wextra -pedantic

anonymous
()

меня бил по рукам за плохие вещи?

ТС нравится, когда ему делают больно? )

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

Harald ★★★★★
()

Как компилировать код на C, чтобы компилятор меня бил по рукам за плохие вещи?

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

Вот кусок, про который я говорю:

int f (int *p, int *q) {
    static int a = 3;

    if (--a)
        return *p-- += *q--;
    return *q++ -= *p++;
}
i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)

sanitizers будут бить по рукам не во время компиляции, а во время работы программы. Что-то неправильное происходит - крэш!

Если хочется жести на стадии компиляции, добавь статический анализ

annulen ★★★★★
()

Люто плюсую статический анализ

XMs ★★★★★
()

У clang есть -Weverything. Хороший способ изучать какие предупреждения вообще присутствуют. Особо назойливые ворнинги можно отключать -Wno-...

Например -Weverything -Wno-c++11-long-long -Wno-c++11-extensions -Wno-weak-vtables.

В gcc выковырять все известные предупреждения можно через gcc --help=warnings

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

а в чём проблема с данным куском кода?

Эта функция делает сначала одно, потом на третий вызов внезапно другое, затем снова возвращается к «обычной» работе.

И да, попробуй описать словами, что именно делает функция, и для чего.

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

Эта функция делает сначала одно, потом на третий вызов внезапно другое, затем снова возвращается к «обычной» работе.

И что? Может быть, так и было задумано? Компилятор не может и не должно волновать, что у функции долбанутый control flow и есть скрытое состояние. Это забота человека.

И да, попробуй описать словами, что именно делает функция, и для чего.

Первые два вызова — прибавляет *q к *p. На третий вызов вычитает *p из *q. Потом labs(INT_MIN) вызовов снова прибавляет *q к *p, потом происходит знаковое переполнение и UB.

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

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

Я и говорю, что никак нельзя компилятор заставить бить ТС по рукам за плохие вещи. Код явно плохой, но компилятор ругаться не будет.

ТС хочет автоматизированную метрику хорошести кода. Но подразумеваемая им метрика — число предупреждений компилятора — для такого не годится.

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

Что значит «плохой»? Может быть, я намеренно хотел функцию, которая меняет своё поведение в зависимости от количества запусков, а больше 1000 раз я её запускать не собираюсь?

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

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

Тогда нам с тобой не по пути. :-D

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

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

Похвально, конечно, но непрактично.

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

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

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

Смотря что считать. Бесплатным можно считать Code Composer Studio от Texas Instruments, но там реализация MISRA очень-очень бажная.

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

Ждал, пока кто-нибудь упомянет PVS :D С нетерпением жду бесплатный вариант/лицензии для физ лиц. Уж очень не терпиться проверить качественность своего кода.

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

нетерпением жду бесплатный вариант/лицензии для физ лиц. Уж очень не терпиться

Пока ждёшь PVS-Studio, можешь бесплатно проверить правописание http://tsya.ru/

anonymous
()

Рекомендую собирать проект и gcc и llvm, т.к. они имеют непересекающееся подмножество warning'ов. Можно попробовать clang static analyzer. Далее - да, санитайзеры рулят. В кратце:

  1. Собираем проект с нужным санитайзером
  2. Запускаем бинарь на каких-либо данных, собираем предупреждения
  3. Исправляем ошибки, идём в 1

Можно ещё valgrind'ом поработать.

Ещё есть ошибки, которые видны только с опцией -flto (причём не факт что они будут проявляться без сборки с данной опцией вообще, но проверить стоит).

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

Что значит «плохой»? Может быть, я намеренно хотел функцию, которая меняет своё поведение в зависимости от количества запусков, а больше 1000 раз я её запускать не собираюсь?

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

ya-betmen ★★★★★
()

Мой любимый набор:

CFLAGS := -pedantic -Werror -Wall -Wextra -Wswitch-default -Wswitch-enum      \
          -Wshadow -Wundef -Wpointer-arith -Wcast-align -Winit-self           \
          -Wstrict-overflow=3 -Wlogical-op -Wwrite-strings -Wnested-externs   \
          -Wbad-function-cast -Wold-style-definition -Wunreachable-code       \
          -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations

А вообще, чтобы тебя били по рукам надо писать не на си, а на расте

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