3.10 Параметры, управляющие статическим анализом
-
-fanalyzer -
Этот параметр включает статический анализ потока выполнения программы, который ищет «интересные» межпроцедурные пути в коде и выдает предупреждения о найденных на них проблемах.
Этот анализ требует гораздо больше ресурсов, чем другие предупреждения GCC.
С технической точки зрения он выполняет символическое исполнение компилируемого кода с управлением на основе покрытия. Он не является ни надежным, ни полным: возможны как ложноположительные, так и ложноотрицательные результаты. Это инструмент для поиска ошибок, а не для доказательства корректности программы.
В этом выпуске анализатор подходит только для использования с кодом на C.
Включение этого параметра фактически включает следующие предупреждения:
-Wanalyzer-allocation-size -Wanalyzer-deref-before-check -Wanalyzer-double-fclose -Wanalyzer-double-free -Wanalyzer-exposure-through-output-file -Wanalyzer-exposure-through-uninit-copy -Wanalyzer-fd-access-mode-mismatch -Wanalyzer-fd-double-close -Wanalyzer-fd-leak -Wanalyzer-fd-phase-mismatch -Wanalyzer-fd-type-mismatch -Wanalyzer-fd-use-after-close -Wanalyzer-fd-use-without-check -Wanalyzer-file-leak -Wanalyzer-free-of-non-heap -Wanalyzer-imprecise-fp-arithmetic -Wanalyzer-infinite-loop -Wanalyzer-infinite-recursion -Wanalyzer-jump-through-null -Wanalyzer-malloc-leak -Wanalyzer-mismatching-deallocation -Wanalyzer-null-argument -Wanalyzer-null-dereference -Wanalyzer-out-of-bounds -Wanalyzer-overlapping-buffers -Wanalyzer-possible-null-argument -Wanalyzer-possible-null-dereference -Wanalyzer-putenv-of-auto-var -Wanalyzer-shift-count-negative -Wanalyzer-shift-count-overflow -Wanalyzer-stale-setjmp-buffer -Wanalyzer-tainted-allocation-size -Wanalyzer-tainted-array-index -Wanalyzer-tainted-assertion -Wanalyzer-tainted-divisor -Wanalyzer-tainted-offset -Wanalyzer-tainted-size -Wanalyzer-undefined-behavior-ptrdiff -Wanalyzer-undefined-behavior-strtok -Wanalyzer-unsafe-call-within-signal-handler -Wanalyzer-use-after-free -Wanalyzer-use-of-pointer-in-stale-stack-frame -Wanalyzer-use-of-uninitialized-value -Wanalyzer-va-arg-type-mismatch -Wanalyzer-va-list-exhausted -Wanalyzer-va-list-leak -Wanalyzer-va-list-use-after-va-end -Wanalyzer-write-to-const -Wanalyzer-write-to-string-literal
Этот параметр доступен, только если GCC был настроен с включенной поддержкой анализатора.
-
-Wanalyzer-symbol-too-complex -
Если включен -fanalyzer, анализатор использует различные эвристики для отслеживания состояния памяти, но достаточно сложный код может помешать их работе.
По умолчанию анализатор без предупреждения прекращает отслеживание значений выражений, если они превышают порог, заданный параметром --param analyzer-max-svalue-depth=value, и вместо этого использует для таких выражений неточное представление. Параметр -Wanalyzer-symbol-too-complex выдает предупреждение в таких случаях.
-
-Wanalyzer-too-complex -
Если включен -fanalyzer, анализатор использует различные эвристики для исследования потока управления и потока данных в программе, но достаточно сложный код может помешать их работе.
По умолчанию анализатор без предупреждения прекращает работу, если код слишком сложен для полного исследования и достигнут внутренний предел. Параметр -Wanalyzer-too-complex выдает предупреждение в таких случаях.
-
-Wno-analyzer-allocation-size -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-allocation-size.
Это диагностическое сообщение предупреждает о путях в коде, на которых указатель на буфер присваивается так, чтобы указывать на буфер размером, не кратным
sizeof (*pointer). -
-Wno-analyzer-deref-before-check -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-deref-before-check.
Это диагностическое сообщение предупреждает о путях в коде, на которых указатель проверяется на
NULL*после* того, как он уже был разыменован, что указывает на возможность того, что указатель был NULL. Такие случаи говорят о том, что проверка на NULL либо избыточна, либо ее нужно перенести перед разыменованием указателя.Это диагностическое сообщение также учитывает значения, переданные в аргумент функции, помеченный
__attribute__((nonnull))как требующий ненулевого значения, и поэтому выдает предупреждение, если такие значения проверяются наNULLпосле возврата из вызова этой функции.Это диагностическое сообщение, скорее всего, не будет выдано при включенном любом уровне оптимизации, поскольку логика оптимизации GCC обычно считает такие проверки на NULL избыточными и удаляет их до того, как анализатор их «увидит». Поэтому при попытке вызвать это диагностическое сообщение оптимизацию следует отключить.
-
-Wno-analyzer-double-fclose -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-double-fclose.
Это диагностическое сообщение предупреждает о путях в коде, на которых к
FILE *может быть вызванfcloseболее одного раза.См. CWE-1341: многократное освобождение одного и того же ресурса или дескриптора.
-
-Wno-analyzer-double-free -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-double-free.
Это диагностическое сообщение предупреждает о путях в коде, на которых для указателя может более одного раза вызываться функция освобождения: либо
free, либо функция освобождения, указанная атрибутомmalloc. -
-Wno-analyzer-exposure-through-output-file -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-exposure-through-output-file.
Это диагностическое сообщение предупреждает о путях в коде, на которых значение, критичное с точки зрения безопасности, записывается в выходной файл (например, пароль записывается в файл журнала).
-
-Wanalyzer-exposure-through-uninit-copy -
Для этого предупреждения необходимы и параметр -fanalyzer, и плагин, задающий функцию, которая копирует данные через «границу доверия». Чтобы отключить предупреждение, используйте -Wno-analyzer-exposure-through-uninit-copy.
Это диагностическое сообщение предупреждает об «утечках информации» — путях в коде, на которых неинициализированные значения копируются через границу безопасности (например, код внутри ядра ОС копирует в пользовательское пространство частично инициализированную структуру из стека).
См. CWE-200: раскрытие конфиденциальной информации неавторизованному субъекту.
-
-Wno-analyzer-fd-access-mode-mismatch -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-fd-access-mode-mismatch.
Это диагностическое сообщение предупреждает о путях в коде, на которых выполняется
readдля дескриптора файла, доступного только для записи, или наоборот.Это диагностическое сообщение также предупреждает о путях в коде, на которых функция с атрибутом
fd_arg_read (N)вызывается с дескриптором файла, открытым с помощьюO_WRONLY, в указанном аргументеN, либо функция с атрибутомfd_arg_write (N)вызывается с дескриптором файла, открытым с помощьюO_RDONLY, в указанном аргументе N. -
-Wno-analyzer-fd-double-close -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-fd-double-close.
Это диагностическое сообщение предупреждает о путях в коде, на которых дескриптор файла может быть закрыт более одного раза.
См. CWE-1341: многократное освобождение одного и того же ресурса или дескриптора.
-
-Wno-analyzer-fd-leak -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-fd-leak.
Это диагностическое сообщение предупреждает о путях в коде, на которых открытый дескриптор файла остается неосвобожденным.
См. CWE-775: дескриптор файла или иной дескриптор не освобождается по окончании срока его использования.
-
-Wno-analyzer-fd-phase-mismatch -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-fd-phase-mismatch.
Это диагностическое сообщение предупреждает о путях в коде, на которых операция выполняется на неправильном этапе жизненного цикла дескриптора файла. Например, оно предупредит о попытке вызвать
acceptдля потокового сокета, для которого еще не был успешно вызванlisten.См. CWE-666: операция с ресурсом на неправильном этапе жизненного цикла.
-
-Wno-analyzer-fd-type-mismatch -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-fd-type-mismatch.
Это диагностическое сообщение предупреждает о путях в коде, на которых операция выполняется с дескриптором файла неподходящего типа. Например, оно предупредит о попытке использовать операции с сокетами для дескриптора файла, полученного с помощью
open, или о попытке использовать операцию с потоковым сокетом для дейтаграммного сокета. -
-Wno-analyzer-fd-use-after-close -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-fd-use-after-close.
Это диагностическое сообщение предупреждает о путях в коде, на которых выполняется чтение или запись с использованием закрытого дескриптора файла.
Это диагностическое сообщение также предупреждает о путях в коде, на которых функция с атрибутом
fd_arg (N),fd_arg_read (N)илиfd_arg_write (N)вызывается с закрытым дескриптором файла в указанном аргументеN. -
-Wno-analyzer-fd-use-without-check -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-fd-use-without-check.
Это диагностическое сообщение предупреждает о путях в коде, на которых дескриптор файла используется без проверки его допустимости.
Это диагностическое сообщение также предупреждает о путях в коде, на которых функция с атрибутом
fd_arg (N),fd_arg_read (N)илиfd_arg_write (N)вызывается с дескриптором файла в указанном аргументеNбез предварительной проверки его допустимости. -
-Wno-analyzer-file-leak -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-file-leak.
Это диагностическое сообщение предупреждает о путях в коде, на которых объект потока
<stdio.h>FILE *остается неосвобожденным.См. CWE-775: дескриптор файла или иной дескриптор не освобождается по окончании срока его использования.
-
-Wno-analyzer-free-of-non-heap -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-free-of-non-heap.
Это диагностическое сообщение предупреждает о путях в коде, на которых
freeвызывается для указателя не на кучу (например, для буфера в стеке или глобальной переменной). -
-Wno-analyzer-imprecise-fp-arithmetic -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-imprecise-fp-arithmetic.
Это диагностическое сообщение предупреждает о путях в коде, на которых арифметика с плавающей точкой используется там, где необходимы точные вычисления. На данный момент это диагностическое сообщение выдается только при использовании операндов с плавающей точкой при вычислении размера выделяемой памяти.
-
-Wno-analyzer-infinite-loop -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-infinite-loop.
Это диагностическое сообщение предупреждает о путях в коде, которые, по-видимому, ведут к бесконечному циклу.
В частности, анализатор выдает это предупреждение, когда «видит» цикл, в котором:
- внутри цикла не выполняется никакая работа, видимая извне
- из цикла невозможно выйти
- анализатор достаточно уверен в состоянии программы на протяжении всего цикла, чтобы знать, что верны оба указанных выше условия
Это предупреждение может быть выдано, если существует путь выполнения цикла, при котором выбор этого пути на одной итерации означает, что тот же путь будет выбран на всех последующих итерациях.
Например, рассмотрим следующий код:
while (1) { char opcode = *cpu_state.pc; switch (opcode) { case OPCODE_FOO: handle_opcode_foo (&cpu_state); break; case OPCODE_BAR: handle_opcode_bar (&cpu_state); break; } }Анализатор выдаст предупреждение для приведенного выше случая, поскольку, если
opcodeне совпадет ни с одним из вариантов, за ним последуетswitchс неявным вариантомdefault, в результате чего тело цикла станет «пустой операцией», аcpu_state.pcостанется без изменений. Таким образом, на всех последующих итерациях будет использоваться одно и то же значениеopcode, что приведет к бесконечному циклу.См. CWE-835: цикл с недостижимым условием выхода («бесконечный цикл»).
-
-Wno-analyzer-infinite-recursion -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-infinite-recursion.
Это диагностическое сообщение предупреждает о путях в коде, которые, по-видимому, ведут к бесконечной рекурсии.
В частности, когда анализатор «видит» рекурсивный вызов, он сравнивает состояние памяти при входе в новый фрейм с состоянием памяти при входе в предыдущий фрейм этой функции в стеке. Предупреждение выдается, если в памяти, по-видимому, ничего не меняется; любые изменения параметров или глобальных переменных считаются приводящими к завершению рекурсии и поэтому подавляют предупреждение.
Это диагностическое сообщение, скорее всего, не обнаружит случаи бесконечной рекурсии, преобразованные оптимизатором в итерацию до того, как анализатор их «увидит». Поэтому при попытке вызвать это диагностическое сообщение оптимизацию следует отключить.
Сравните с -Winfinite-recursion, который выдает похожее диагностическое сообщение, но реализован иначе.
-
-Wno-analyzer-jump-through-null -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-jump-through-null.
Это диагностическое сообщение предупреждает о путях в коде, на которых вызывается указатель на функцию
NULL. -
-Wno-analyzer-malloc-leak -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-malloc-leak.
Это диагностическое сообщение предупреждает о путях в коде, на которых происходит утечка указателя, выделенного функцией-распределителем: либо
malloc, либо функцией, помеченной атрибутомmalloc.См. CWE-401: память не освобождается по окончании срока ее использования.
-
-Wno-analyzer-mismatching-deallocation -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-mismatching-deallocation.
Это диагностическое сообщение предупреждает о путях в коде, на которых для значения указателя вызывается неправильная функция освобождения памяти с учетом того, какая функция использовалась для выделения памяти под это значение. Диагностическое сообщение предупреждает о несоответствиях между
free, скалярнымdeleteи векторнымdelete[], а также между функциями, помеченными как пары функций выделения и освобождения памяти с помощью атрибутаmalloc. -
-Wno-analyzer-out-of-bounds -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-out-of-bounds.
Это диагностическое сообщение предупреждает о путях в коде, на которых буфер определенно читается или записывается за пределами допустимых границ. Диагностическое сообщение относится к случаям, когда анализатор может определить постоянное смещение, а для обращений за концом буфера — также постоянную емкость. Кроме того, анализатор выполняет ограниченную проверку обращений за концом буфера, когда и смещение, и емкость являются символическими.
См. CWE-119: неправильное ограничение операций в пределах буфера памяти.
В случаях, когда это возможно, анализатор выдает текстовую диаграмму, показывающую пространственное отношение между областью памяти, к которой, по прогнозу анализатора, будет выполнено обращение, и диапазоном допустимой для доступа памяти: перекрываются ли эти области, соприкасаются ли они, находятся ли рядом или далеко друг от друга; какая из них расположена раньше или позже в памяти; их относительные размеры, направление доступа (чтение или запись) и, в некоторых случаях, значения участвующих данных. Эту диаграмму можно скрыть с помощью -fdiagnostics-text-art-charset=none.
-
-Wno-analyzer-overlapping-buffers -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-overlapping-buffers.
Это диагностическое сообщение предупреждает о путях в коде, на которых перекрывающиеся буферы передаются API, поведение которого при работе с такими буферами не определено.
В частности, диагностическое сообщение выдается при вызове следующих функций
-
memcpy -
strcat -
strcpy
в случаях, когда известно, что буферы перекрываются.
-
-
-Wno-analyzer-possible-null-argument -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-possible-null-argument.
Это диагностическое сообщение предупреждает о путях в коде, на которых потенциально NULL-значение передается в аргумент функции, помеченный
__attribute__((nonnull))как требующий ненулевого значения.См. CWE-690: разыменование NULL-указателя без проверки возвращаемого значения.
-
-Wno-analyzer-possible-null-dereference -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-possible-null-dereference.
Это диагностическое сообщение предупреждает о путях в коде, на которых разыменовывается потенциально NULL-значение.
См. CWE-690: разыменование NULL-указателя без проверки возвращаемого значения.
-
-Wno-analyzer-null-argument -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-null-argument.
Это диагностическое сообщение предупреждает о путях в коде, на которых заведомо NULL-значение передается в аргумент функции, помеченный
__attribute__((nonnull))как требующий ненулевого значения. -
-Wno-analyzer-null-dereference -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-null-dereference.
Это диагностическое сообщение предупреждает о путях в коде, на которых разыменовывается заведомо NULL-значение.
-
-Wno-analyzer-putenv-of-auto-var -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-putenv-of-auto-var.
Это диагностическое сообщение предупреждает о путях в коде, на которых в вызов
putenvпередается указатель на автоматическую переменную или буфер в стеке.См. POS34-C. Не вызывайте putenv() с указателем на автоматическую переменную в качестве аргумента.
-
-Wno-analyzer-shift-count-negative -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-shift-count-negative.
Это диагностическое сообщение предупреждает о путях в коде, на которых предпринимается попытка сдвига с отрицательным счетчиком. Оно аналогично диагностическому сообщению -Wshift-count-negative, реализованному во внешних интерфейсах C/C++, но основано на анализе межпроцедурных путей, а не только на синтаксическом разборе дерева. Однако анализатор не отдает обнаружению таких путей приоритет, поэтому вероятность ложноотрицательных результатов выше, чем для других предупреждений.
-
-Wno-analyzer-shift-count-overflow -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-shift-count-overflow.
Это диагностическое сообщение предупреждает о путях в коде, на которых предпринимается попытка сдвига со счетчиком, большим или равным точности типа операнда. Оно аналогично диагностическому сообщению -Wshift-count-overflow, реализованному во внешних интерфейсах C/C++, но основано на анализе межпроцедурных путей, а не только на синтаксическом разборе дерева. Однако анализатор не отдает обнаружению таких путей приоритет, поэтому вероятность ложноотрицательных результатов выше, чем для других предупреждений.
-
-Wno-analyzer-stale-setjmp-buffer -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-stale-setjmp-buffer.
Это диагностическое сообщение предупреждает о путях в коде, на которых
longjmpвызывается для возврата кjmp_buf, связанному с вызовомsetjmpв уже завершившей работу функции.При вызове
setjmpдляjmp_bufс целью сохранения точки возврата сохраняется фрейм стека. Фрейм стека становится недействительным после завершения функции, содержащей вызовsetjmp. Попытка возврата к нему с помощьюlongjmpприведет к обращению к уже несуществующему фрейму стека и, скорее всего, к сбою (или чему-то худшему). -
-Wno-analyzer-tainted-allocation-size -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-tainted-allocation-size.
Это диагностическое сообщение предупреждает о путях в коде, на которых значение, потенциально контролируемое злоумышленником, используется как размер выделяемой памяти без предварительной очистки. Это позволяет злоумышленнику запросить чрезмерно большой объем памяти и потенциально вызвать отказ в обслуживании.
См. CWE-789: выделение памяти с чрезмерно большим значением размера.
-
-Wno-analyzer-tainted-assertion -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-tainted-assertion.
Это диагностическое сообщение предупреждает о путях в коде, на которых значение, потенциально контролируемое злоумышленником, используется в условии без предварительной очистки, а это условие управляет вызовом функции, помеченной атрибутом
noreturn(например, функции__builtin_unreachable). Такие функции обычно приводят к аварийному завершению программы, например обработчики ошибок утверждений. Например:assert (some_tainted_value < SOME_LIMIT);
В таких случаях:
- если проверка утверждений включена, злоумышленник может вызвать отказ в обслуживании, спровоцировав сбой утверждения
- если проверка утверждений отключена, например путем определения
NDEBUG, злоумышленник может внедрить данные, которые нарушат работу процесса, поскольку, предположительно, эти данные нарушают предусловие, на которое полагается код.
Обратите внимание: если проверка утверждений отключена, препроцессор обычно удаляет утверждения до того, как анализатор успеет их «увидеть», поэтому это диагностическое сообщение может выдавать предупреждения только при сборках с включенной проверкой утверждений.
Для целей этого предупреждения любая функция, помеченная атрибутом
noreturn, считается возможным обработчиком сбоя утверждения, включая__builtin_unreachable. Обратите внимание, что оптимизатор иногда удаляет эти функции до того, как анализатор их «увидит». Поэтому при попытке вызвать это диагностическое сообщение оптимизацию следует отключить.См. CWE-617: достижимое утверждение.
Это предупреждение также может сообщать о проблемных конструкциях, таких как
switch (some_tainted_value) { case 0: /* [...etc; various valid cases omitted...] */ break; default: __builtin_unreachable (); /* BUG: attacker can trigger this */ }хотя, строго говоря, приведенный выше код не приводит к сбою утверждения.
-
-Wno-analyzer-tainted-array-index -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-tainted-array-index.
Это диагностическое сообщение предупреждает о путях в коде, на которых значение, потенциально контролируемое злоумышленником, используется как индекс при обращении к массиву без предварительной очистки, что позволяет злоумышленнику вызвать обращение за пределы массива.
-
-Wno-analyzer-tainted-divisor -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-tainted-divisor.
Это диагностическое сообщение предупреждает о путях в коде, на которых значение, потенциально контролируемое злоумышленником, используется в качестве делителя в операции деления или вычисления остатка без предварительной очистки, что позволяет злоумышленнику вызвать деление на ноль.
-
-Wno-analyzer-tainted-offset -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-tainted-offset.
Это диагностическое сообщение предупреждает о путях в коде, на которых значение, потенциально контролируемое злоумышленником, используется как смещение указателя без предварительной очистки, что позволяет злоумышленнику вызвать обращение за пределы допустимых границ.
См. CWE-823: использование смещения указателя за пределами допустимого диапазона.
-
-Wno-analyzer-tainted-size -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-tainted-size.
Это диагностическое сообщение предупреждает о путях в коде, на которых значение, потенциально контролируемое злоумышленником, используется как размер операции, например
memset, без предварительной очистки, что позволяет злоумышленнику вызвать обращение за пределы допустимых границ. -
-Wno-analyzer-undefined-behavior-ptrdiff -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-undefined-behavior-ptrdiff.
Это диагностическое сообщение предупреждает о путях в коде, на которых вычитание указателей выполняется для указателей, относящихся к разным областям памяти. Такой код опирается на неопределенное поведение, поскольку вычитание указателей определено только в случаях, когда оба указателя указывают внутрь одного и того же массива (или сразу за его пределы).
См. CWE-469: использование разности указателей для определения размера.
-
-Wno-analyzer-undefined-behavior-strtok -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-undefined-behavior-strtok.
Это диагностическое сообщение предупреждает о путях в коде, на которых вызов
strtokприводит к неопределенному поведению.В частности, передача NULL в качестве первого параметра при первоначальном вызове
strtokв рамках процесса приводит к неопределенному поведению. -
-Wno-analyzer-unsafe-call-within-signal-handler -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-unsafe-call-within-signal-handler.
Это диагностическое сообщение предупреждает о путях в коде, на которых функция, заведомо небезопасная при асинхронной обработке сигналов (например,
fprintf), вызывается из обработчика сигнала.См. CWE-479: использование нерекурсивной функции в обработчике сигнала.
-
-Wno-analyzer-use-after-free -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-use-after-free.
Это диагностическое сообщение предупреждает о путях в коде, на которых указатель используется после вызова для него функции освобождения памяти: либо
free, либо функции освобождения, указанной атрибутомmalloc. -
-Wno-analyzer-use-of-pointer-in-stale-stack-frame -
Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-use-of-pointer-in-stale-stack-frame.
Это диагностическое сообщение предупреждает о путях в коде, на которых разыменовывается указатель на переменную из недействительного фрейма стека.
-
-Wno-analyzer-va-arg-type-mismatch
-
Для этого предупреждения требуется -fanalyzer, который включает его; используйте -Wno-analyzer-va-arg-type-mismatch, чтобы отключить его.
Это диагностическое сообщение предупреждает о межпроцедурных путях в коде, на которых анализатор обнаруживает попытку использовать
va_argдля извлечения значения, переданного в вызов с переменным числом аргументов, но используется тип, не соответствующий типу выражения, переданного в вызов. -
-Wno-analyzer-va-list-exhausted -
Для этого предупреждения требуется -fanalyzer, который включает его; используйте -Wno-analyzer-va-list-exhausted, чтобы отключить его.
Это диагностическое сообщение предупреждает о межпроцедурных путях в коде, на которых анализатор обнаруживает попытку использовать
va_argдля доступа к следующему значению, переданному в вызов с переменным числом аргументов, но все значения вva_listуже были использованы. -
-Wno-analyzer-va-list-leak -
Для этого предупреждения требуется -fanalyzer, который включает его; используйте -Wno-analyzer-va-list-leak, чтобы отключить его.
Это диагностическое сообщение предупреждает о межпроцедурных путях в коде, на которых анализатор обнаруживает вызов
va_startилиva_copyдляva_listбез соответствующего вызоваva_end. -
-Wno-analyzer-va-list-use-after-va-end -
Для этого предупреждения требуется -fanalyzer, который включает его; используйте -Wno-analyzer-va-list-use-after-va-end, чтобы отключить его.
Это диагностическое сообщение предупреждает о межпроцедурных путях в коде, на которых анализатор обнаруживает попытку использовать
va_listпосле вызова для негоva_end.va_list. -
-Wno-analyzer-write-to-const -
Для этого предупреждения требуется -fanalyzer, который включает его; используйте -Wno-analyzer-write-to-const, чтобы отключить его.
Это диагностическое сообщение предупреждает о путях в коде, на которых анализатор обнаруживает попытку записи через указатель на объект
const. Однако анализатор не уделяет приоритетного внимания обнаружению таких путей, поэтому вероятность ложноотрицательных результатов выше, чем для других предупреждений. -
-Wno-analyzer-write-to-string-literal -
Для этого предупреждения требуется -fanalyzer, который включает его; используйте -Wno-analyzer-write-to-string-literal, чтобы отключить его.
Это диагностическое сообщение предупреждает о путях в коде, на которых анализатор обнаруживает попытку записи через указатель на строковый литерал. Однако анализатор не уделяет приоритетного внимания обнаружению таких путей, поэтому вероятность ложноотрицательных результатов выше, чем для других предупреждений.
-
-Wno-analyzer-use-of-uninitialized-value -
Для этого предупреждения требуется -fanalyzer, который включает его; используйте -Wno-analyzer-use-of-uninitialized-value, чтобы отключить его.
Это диагностическое сообщение предупреждает о путях в коде, на которых используется неинициализированное значение.
Анализатор обладает встроенными знаниями о поведении следующих функций управления памятью:
-
alloca - Встроенные функции
__builtin_alloc,__builtin_alloc_with_align, -
__builtin_calloc,__builtin_free,__builtin_malloc,__builtin_memcpy,__builtin_memcpy_chk,__builtin_memset,__builtin_memset_chk,__builtin_realloc,__builtin_stack_restoreи__builtin_stack_save -
calloc -
free -
malloc -
memset -
operator delete -
operator delete [] -
operator new -
operator new [] -
realloc -
strdup -
strndup
а также следующих функций для работы с файловыми дескрипторами:
-
open -
close -
creat -
dup,dup2иdup3 -
isatty -
pipeиpipe2 -
read -
write -
socket,bind,listen,acceptиconnect
а также следующих функций для работы с потоками <stdio.h>:
- Встроенные функции
__builtin_fprintf,__builtin_fprintf_unlocked,__builtin_fputc,__builtin_fputc_unlocked,__builtin_fputs,__builtin_fputs_unlocked,__builtin_fwrite,__builtin_fwrite_unlocked,__builtin_printf,__builtin_printf_unlocked,__builtin_putc,__builtin_putchar,__builtin_putchar_unlocked,__builtin_putc_unlocked,__builtin_puts,__builtin_puts_unlocked,__builtin_vfprintfи__builtin_vprintf -
fopen -
fclose -
ferror -
fgets -
fgets_unlocked -
fileno -
fread -
getc -
getchar -
fprintf -
printf -
fwrite
а также следующих функций:
- Встроенные функции
__builtin_expect,__builtin_expect_with_probability,__builtin_strchr,__builtin_strcpy,__builtin_strcpy_chk,__builtin_strlen,__builtin_va_copyи__builtin_va_start - Расширения GNU
errorиerror_at_line -
getpass -
longjmp -
putenv -
setjmp -
siglongjmp -
signal -
sigsetjmp -
strcat -
strchr -
strlen
Кроме того, различные функции с префиксом __analyzer_ имеют особое значение для анализатора; их описание приведено в руководстве по внутреннему устройству GCC.
Для управления исследованием имеют значение следующие параметры:
- --param analyzer-bb-explosion-factor=value
- --param analyzer-max-enodes-per-program-point=value
- --param analyzer-max-recursion-depth=value
- --param analyzer-min-snodes-for-call-summary=value
Следующие параметры управляют анализатором.
-
-fanalyzer-call-summaries -
Упростить межпроцедурный анализ, вычисляя эффект определённых вызовов вместо исследования всех путей через функцию от места вызова до каждого возможного возврата.
Если этот параметр включён, сводки вызовов используются только для функций, имеющих более одного места вызова и достаточно сложных (в соответствии с --param analyzer-min-snodes-for-call-summary=value).
-
-fanalyzer-checker=name -
Ограничить работу анализатора только указанным средством проверки и включить его.
-
-fanalyzer-debug-text-art-headings -
Этот параметр предназначен для разработчиков анализатора. Если он включён, анализатор добавляет дополнительные аннотации ко всем создаваемым диаграммам.
-
-fno-analyzer-feasibility -
Этот параметр предназначен для разработчиков анализатора.
По умолчанию анализатор проверяет, существует ли допустимый путь потока управления для каждого выдаваемого им диагностического сообщения: то есть не являются ли выполняющиеся условия взаимоисключающими. Диагностические сообщения, для которых не удаётся найти допустимый путь, отбрасываются. Эту фильтрацию можно отключить с помощью -fno-analyzer-feasibility для отладки проблем в этом коде.
-
-fanalyzer-fine-grained -
Этот параметр предназначен для разработчиков анализатора.
Внутри анализатор строит «расширенный граф», объединяющий графы потока управления с информацией о потоке данных.
По умолчанию ребро этого графа может содержать эффекты последовательности нескольких операторов внутри базового блока. При использовании -fanalyzer-fine-grained для каждого оператора создаётся отдельное ребро.
-
-fanalyzer-show-duplicate-count -
Этот параметр предназначен для разработчиков анализатора: если обнаружено, что несколько диагностических сообщений дублируют друг друга, при выдаче наилучшего диагностического сообщения выводится примечание с числом дополнительных сообщений, подавленных механизмом дедупликации.
-
-fanalyzer-show-events-in-system-headers -
По умолчанию анализатор упрощает пути диагностики, скрывая события, полностью расположенные внутри системного заголовочного файла. При использовании -fanalyzer-show-events-in-system-headers такие события больше не подавляются.
-
-fno-analyzer-state-merge -
Этот параметр предназначен для разработчиков анализатора.
По умолчанию анализатор пытается упростить анализ, объединяя достаточно похожие состояния в каждой точке программы при построении «расширенного графа». Объединение можно отключить с помощью -fno-analyzer-state-merge для отладки проблем обработки состояний.
-
-fno-analyzer-state-purge -
Этот параметр предназначен для разработчиков анализатора.
По умолчанию анализатор пытается упростить анализ, удаляя из состояния в точке программы те аспекты, которые, по-видимому, больше не важны, например значения локальных переменных, к которым далее не обращаются в функции и которые не имеют отношения к анализу утечек.
С помощью -fno-analyzer-state-purge это удаление состояния можно отключить для отладки проблем обработки состояний.
-
-fno-analyzer-suppress-followups -
Этот параметр предназначен для разработчиков анализатора.
По умолчанию анализатор прекращает исследование пути выполнения после обнаружения определённых диагностических сообщений, чтобы избежать возможного каскада последующих сообщений.
Диагностические сообщения, завершающие анализ пути:
- -Wanalyzer-null-argument
- -Wanalyzer-null-dereference
- -Wanalyzer-use-after-free
- -Wanalyzer-use-of-pointer-in-stale-stack-frame
- -Wanalyzer-use-of-uninitialized-value
При использовании -fno-analyzer-suppress-followups анализатор продолжит исследовать такие пути даже после появления подобных диагностических сообщений. Это может быть полезно для отладки проблем анализатора или для микротестов обнаружения неопределённого поведения.
-
-fanalyzer-transitivity -
Этот параметр включает транзитивность ограничений в анализаторе.
-
-fno-analyzer-undo-inlining -
Этот параметр предназначен для разработчиков анализатора.
-fanalyzer запускается относительно поздно по сравнению с другими средствами анализа кода, и к этому моменту к коду уже могут быть применены некоторые оптимизации. В частности, могло произойти встраивание функций, из-за чего межпроцедурные пути выполнения, выдаваемые анализатором, могут содержать кадры функций, не соответствующие кадрам в исходном коде.
По умолчанию анализатор пытается восстановить исходные кадры функций и выдать события, показывающие встроенные вызовы.
С помощью -fno-analyzer-undo-inlining эту попытку восстановить исходную информацию о кадрах можно отключить, что может помочь при отладке проблем анализатора.
-fanalyzer-verbose-edges-
Этот параметр предназначен для разработчиков анализатора. Он включает более подробные низкоуровневые сведения в описаниях потока управления внутри путей диагностики.
-fanalyzer-verbose-state-changes-
Этот параметр предназначен для разработчиков анализатора. Он включает более подробные низкоуровневые сведения в описаниях событий, связанных с конечными автоматами внутри путей диагностики.
-fanalyzer-verbosity=level-
Этот параметр управляет сложностью путей потока управления, выдаваемых для диагностических сообщений анализатора.
Значение level может быть одним из следующих:
- ‘0’
-
На этом уровне отображаются межпроцедурные события вызова и возврата, а также наиболее значимые события изменения состояния, связанные с диагностическим сообщением. Например, для диагностического сообщения о двойном
freeбудут показаны оба вызоваfree. - ‘1’
-
Как и на предыдущем уровне, но также отображаются события входа в каждую функцию.
- ‘2’
-
Как и на предыдущем уровне, но также отображаются события потока управления, значимые для возникновения проблемы (например, «выбран истинный путь» при условном переходе).
Это уровень по умолчанию.
- ‘3’
-
Как и на предыдущем уровне, но отображаются все события потока управления, а не только значимые.
- ‘4’
-
Этот уровень предназначен для разработчиков анализатора; он добавляет различные другие события для отладки анализатора.
-
-fdump-analyzer -
Записать внутренние сведения о работе анализатора в файл file.analyzer.txt. Параметр -fdump-analyzer-stderr имеет приоритет над этим параметром.
-
-fdump-analyzer-stderr -
Записать внутренние сведения о работе анализатора в stderr. Этот параметр имеет приоритет над -fdump-analyzer.
-
-fdump-analyzer-callgraph -
Записать представление графа вызовов, пригодное для просмотра в GraphViz, в файл file.callgraph.dot.
-
-fdump-analyzer-exploded-graph -
Записать представление «расширенного графа», пригодное для просмотра в GraphViz, в файл file.eg.dot. Узлы имеют цветовую маркировку в зависимости от состояний конечного автомата, чтобы подчеркнуть изменения состояний.
-
-fdump-analyzer-exploded-nodes -
Вывести диагностические сообщения, показывающие расположение узлов «расширенного графа» относительно исходного кода программы.
-
-fdump-analyzer-exploded-nodes-2 -
Записать текстовое представление «расширенного графа» в файл file.eg.txt.
-
-fdump-analyzer-exploded-nodes-3 -
Записать текстовое представление «расширенного графа» в отдельный файл дампа для каждого узла: file.eg-id.txt. Обычно создаётся большое количество файлов дампа.
-
-fdump-analyzer-exploded-paths -
Записать текстовое представление «расширенного пути» для каждого диагностического сообщения в файл file.idx.kind.epath.txt.
-
-fdump-analyzer-feasibility -
Записать внутренние сведения о поиске анализатором допустимых путей. Сведения записываются в формате, пригодном для просмотра в GraphViz, в файлы с именами вида file.*.fg.dot, file.*.tg.dot и file.*.fpath.txt.
-
-fdump-analyzer-infinite-loop -
Записать внутренние сведения о поиске анализатором бесконечных циклов. Сведения записываются в формате, пригодном для просмотра в GraphViz, в файлы с именами вида file.*.infinite-loop.dot.
-
-fdump-analyzer-json -
Записать сжатое представление внутренних данных анализатора в формате JSON в файл file.analyzer.json.gz. Точный формат может измениться.
-
-fdump-analyzer-state-purge -
Как и при использовании -fdump-analyzer-supergraph, записать представление «суперграфа», пригодное для просмотра в GraphViz, но снабдить граф аннотациями о том, какие данные состояния будут удалены в каждом узле. Граф записывается в файл file.state-purge.dot.
-
-fdump-analyzer-supergraph -
Записать представления «суперграфа», пригодные для просмотра в GraphViz, в файлы file.supergraph.dot и file.supergraph-eg.dot. Они показывают все графы потока управления в программе с межпроцедурными рёбрами вызовов и возвратов. Второй файл дампа содержит аннотации, показывающие узлы «расширенного графа» и связанные с ними диагностические сообщения.
-
-fdump-analyzer-untracked -
Выдавать пользовательские предупреждения с внутренними сведениями, предназначенными для разработчиков анализатора.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Static-Analyzer-Options.html