Spec-Zone.ru › GCC 13

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-recursion
-Wanalyzer-jump-through-null
-Wanalyzer-malloc-leak
-Wanalyzer-mismatching-deallocation
-Wanalyzer-null-argument
-Wanalyzer-null-dereference
-Wanalyzer-out-of-bounds
-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-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-too-complex

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

По умолчанию анализ молча прекращается, если код слишком сложен для полного исследования анализатором и достигается внутренний предел. Параметр -Wanalyzer-too-complex выдает предупреждение, если это происходит.

-Wno-analyzer-allocation-size

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

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

См. CWE-131: Incorrect Calculation of Buffer Size.

-Wno-analyzer-deref-before-check

Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-deref-before-check, чтобы отключить его.

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

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

Это диагностическое сообщение маловероятно будет выдано при включении любого уровня оптимизации, поскольку логика оптимизации GCC обычно будет считать такие проверки на NULL избыточными и удалять их до того, как анализатор «увидит» их. Следовательно, оптимизацию следует отключить при попытке активировать это диагностическое сообщение.

-Wno-analyzer-double-fclose

Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-double-fclose, чтобы отключить его.

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

См. CWE-1341: Multiple Releases of Same Resource or Handle.

-Wno-analyzer-double-free

Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-double-free, чтобы отключить его.

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

См. CWE-415: Double Free.

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

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

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

См. CWE-532: Information Exposure Through Log Files.

-Wanalyzer-exposure-through-uninit-copy

Это предупреждение требует как -fanalyzer, так и использования плагина для указания функции, которая копирует через «границу доверия». Используйте -Wno-analyzer-exposure-through-uninit-copy, чтобы отключить его.

Этот диагностический инструмент выдает предупреждение о «утечках информации» — путях в коде, в которых неинициализированные значения копируются через границу безопасности (например, код в ядре ОС, который копирует частично инициализированную структуру в стеке в пользовательское пространство).

См. CWE-200: Exposure of Sensitive Information to an Unauthorized Actor.

-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: Multiple Releases of Same Resource or Handle.

-Wno-analyzer-fd-leak

Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-fd-leak, чтобы отключить его.

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

См. CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime.

-Wno-analyzer-fd-phase-mismatch

Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-fd-phase-mismatch, чтобы отключить его.

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

См. CWE-666: Operation on Resource in Wrong Phase of Lifetime.

-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: Missing Release of File Descriptor or Handle after Effective Lifetime.

-Wno-analyzer-free-of-non-heap

Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-free-of-non-heap, чтобы отключить его.

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

См. CWE-590: Free of Memory not on the Heap.

-Wno-analyzer-imprecise-fp-arithmetic

Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-imprecise-fp-arithmetic, чтобы отключить его.

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

-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: Missing Release of Memory after Effective Lifetime.

-Wno-analyzer-mismatching-deallocation

Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-mismatching-deallocation для его отключения.

Эта диагностика предупреждает о путях в коде, в которых вызывается неправильная функция освобождения памяти для значения указателя, в зависимости от функции, используемой для выделения значения указателя. Диагностика будет предупреждать о несоответствиях между free, скалярным типом delete и векторным типом delete[], а также о тех, которые помечены как пары «выделить/освободить» с помощью атрибута malloc.

См. CWE-762: Mismatched Memory Management Routines.

-Wno-analyzer-out-of-bounds

Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-out-of-bounds для его отключения.

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

См. CWE-119: Improper Restriction of Operations within the Bounds of a Memory Buffer.

-Wno-analyzer-possible-null-argument

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

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

См. CWE-690: Unchecked Return Value to NULL Pointer Dereference.

-Wno-analyzer-possible-null-dereference

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

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

См. CWE-690: Unchecked Return Value to NULL Pointer Dereference.

-Wno-analyzer-null-argument

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

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

См. CWE-476: NULL Pointer Dereference.

-Wno-analyzer-null-dereference

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

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

См. CWE-476: NULL Pointer Dereference.

-Wno-analyzer-putenv-of-auto-var

Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-putenv-of-auto-var для его отключения.

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

См. POS34-C. Do not call putenv() with a pointer to an automatic variable as the argument.

-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 и -fanalyzer-checker=taint; используйте -Wno-analyzer-tainted-allocation-size для его отключения.

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

См. CWE-789: Memory Allocation with Excessive Size Value.

-Wno-analyzer-tainted-assertion

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

Эта диагностика предупреждает о путях в коде, в которых значение, которое может быть под контролем злоумышленника, используется в качестве части условия без предварительной проверки, а это условие защищает вызов функции, помеченной атрибутом noreturn (такой как функция __builtin_unreachable). Такие функции обычно указывают на аномальное завершение программы, например, для обработчиков ошибок проверки утверждений. Например:

assert (some_tainted_value < SOME_LIMIT);

В таких случаях:

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

Обратите внимание, что при отключённой проверке утверждений утверждения обычно удаляются препроцессором до того, как анализатор их «увидит», поэтому эта диагностика может генерировать предупреждения только при сборке с включённой проверкой утверждений.

В целях этого предупреждения любая функция, помеченная атрибутом noreturn, считается возможным обработчиком ошибок проверки утверждений, включая __builtin_unreachable. Обратите внимание, что эти функции иногда удаляются оптимизатором до того, как анализатор их «увидит». Поэтому оптимизацию следует отключить при попытке вызвать эту диагностику.

См. CWE-617: Reachable Assertion.

Предупреждение также может сообщать о проблематичных конструкциях, таких как

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, так и -fanalyzer-checker=taint для активации; используйте -Wno-analyzer-tainted-array-index для его отключения.

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

См. CWE-129: Некорректная валидация индекса массива.

-Wno-analyzer-tainted-divisor

Это предупреждение требует как -fanalyzer, так и -fanalyzer-checker=taint для активации; используйте -Wno-analyzer-tainted-divisor для его отключения.

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

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

-Wno-analyzer-tainted-offset

Это предупреждение требует как -fanalyzer, так и -fanalyzer-checker=taint для активации; используйте -Wno-analyzer-tainted-offset для его отключения.

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

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

-Wno-analyzer-tainted-size

Это предупреждение требует как -fanalyzer, так и -fanalyzer-checker=taint для активации; используйте -Wno-analyzer-tainted-size для его отключения.

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

См. CWE-129: Некорректная валидация индекса массива.

-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. Однако анализатор не prioritizes обнаружение таких путей, поэтому ложные срабатывания более вероятны по сравнению с другими предупреждениями.

-Wno-analyzer-write-to-string-literal

Это предупреждение требует -fanalyzer для активации; используйте -Wno-analyzer-write-to-string-literal для его отключения.

Данный диагностический вывод предупреждает о путях в коде, в которых анализатор обнаруживает попытку записи через указатель на строковый литерал. Однако анализатор не prioritizes обнаружение таких путей, поэтому ложные срабатывания более вероятны по сравнению с другими предупреждениями.

-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
  • strchr
  • strlen

Кроме того, различные функции с префиксом __analyzer_ имеют особое значение для анализатора, описанное в руководстве GCC Internals.

Соответствующие параметры для управления исследованием:

  • --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), например, проверяющий модуль taint, который реализует -Wanalyzer-tainted-array-index, и для их включения требуется этот параметр.

Примечание: в настоящее время -fanalyzer-checker=taint отключает следующие предупреждения из -fanalyzer:

-Wanalyzer-deref-before-check
-Wanalyzer-double-fclose
-Wanalyzer-double-free
-Wanalyzer-exposure-through-output-file
-Wanalyzer-fd-access-mode-mismatch
-Wanalyzer-fd-double-close
-Wanalyzer-fd-leak
-Wanalyzer-fd-use-after-close
-Wanalyzer-fd-use-without-check
-Wanalyzer-file-leak
-Wanalyzer-free-of-non-heap
-Wanalyzer-malloc-leak
-Wanalyzer-mismatching-deallocation
-Wanalyzer-null-argument
-Wanalyzer-null-dereference
-Wanalyzer-possible-null-argument
-Wanalyzer-possible-null-dereference
-Wanalyzer-unsafe-call-within-signal-handler
-Wanalyzer-use-after-free
-Wanalyzer-va-list-leak
-Wanalyzer-va-list-use-after-va-end
-fno-analyzer-feasibility

Этот параметр предназначен для разработчиков анализатора.

По умолчанию анализатор проверяет, существует ли осуществимый путь управления для каждого диагностического сообщения, которое он выводит: что условия, которые выполняются, не являются взаимоисключающими. Диагностические сообщения, для которых нельзя найти осуществимый путь, отклоняются. Этот фильтр можно отключить с помощью -fno-analyzer-feasibility, для отладки проблем в этом коде.

-fanalyzer-fine-grained

Этот параметр предназначен для разработчиков анализатора.

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

По умолчанию ребро в этом графе может содержать эффекты выполнения нескольких инструкций в базовом блоке. С помощью -fanalyzer-fine-grained каждой инструкции соответствует свое ребро.

-fanalyzer-show-duplicate-count

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

-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-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-13.3.0/gcc/Static-Analyzer-Options.html

Spec-Zone.ru

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