Spec-Zone.ru › GCC 14

3.9 Параметры, управляющие статическим анализом

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

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

Эта диагностика также предупреждает о путях кода, в которых функция с атрибутом 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-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-14.2.0/gcc/Static-Analyzer-Options.html

Spec-Zone.ru

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