Spec-Zone.ru › GCC 15

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).

См. CWE-131: неправильное вычисление размера буфера.

-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.

См. CWE-415: двойное освобождение.

-Wno-analyzer-exposure-through-output-file

Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-exposure-through-output-file.

Это диагностическое сообщение предупреждает о путях в коде, на которых значение, критичное с точки зрения безопасности, записывается в выходной файл (например, пароль записывается в файл журнала).

См. CWE-532: раскрытие информации через файлы журнала.

-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 вызывается для указателя не на кучу (например, для буфера в стеке или глобальной переменной).

См. CWE-590: освобождение памяти, не размещенной в куче.

-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, который выдает похожее диагностическое сообщение, но реализован иначе.

См. CWE-674: неконтролируемая рекурсия.

-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.

См. CWE-762: несоответствие функций управления памятью.

-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)) как требующий ненулевого значения.

См. CWE-476: разыменование NULL-указателя.

-Wno-analyzer-null-dereference

Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-null-dereference.

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

См. CWE-476: разыменование 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.

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

См. CWE-129: неправильная проверка индекса массива.

-Wno-analyzer-tainted-divisor

Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-tainted-divisor.

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

См. CWE-369: деление на ноль.

-Wno-analyzer-tainted-offset

Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-tainted-offset.

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

См. CWE-823: использование смещения указателя за пределами допустимого диапазона.

-Wno-analyzer-tainted-size

Для этого предупреждения требуется параметр -fanalyzer, который включает его; чтобы отключить предупреждение, используйте -Wno-analyzer-tainted-size.

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

См. CWE-129: неправильная проверка индекса массива.

-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.

См. CWE-416: использование после освобождения.

-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 для извлечения значения, переданного в вызов с переменным числом аргументов, но используется тип, не соответствующий типу выражения, переданного в вызов.

См. CWE-686: вызов функции с аргументом неверного типа.

-Wno-analyzer-va-list-exhausted

Для этого предупреждения требуется -fanalyzer, который включает его; используйте -Wno-analyzer-va-list-exhausted, чтобы отключить его.

Это диагностическое сообщение предупреждает о межпроцедурных путях в коде, на которых анализатор обнаруживает попытку использовать va_arg для доступа к следующему значению, переданному в вызов с переменным числом аргументов, но все значения в va_list уже были использованы.

См. CWE-685: вызов функции с неверным числом аргументов.

-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, чтобы отключить его.

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

См. CWE-457: использование неинициализированной переменной.

Анализатор обладает встроенными знаниями о поведении следующих функций управления памятью:

  • 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API