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). -
-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более одного раза. -
-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, чтобы отключить его.
Этот диагностический инструмент выдает предупреждение для путей в коде, в которых конфиденциальное значение записывается в выходной файл (например, запись пароля в файл журнала).
-
-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, чтобы отключить его.
Этот диагностический инструмент выдает предупреждение для путей в коде, в которых файловый дескриптор может быть закрыт более одного раза.
-
-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вызывается для указателя, не относящегося к куче (например, буфера в стеке или глобального). -
-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. -
-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))требующий ненулевое значение. -
-Wno-analyzer-null-dereference -
Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-null-dereference для его отключения.
Эта диагностика предупреждает о путях в коде, в которых обращается к значению, известному как NULL.
-
-Wno-analyzer-putenv-of-auto-var -
Это предупреждение требует -fanalyzer, который его включает; используйте -Wno-analyzer-putenv-of-auto-var для его отключения.
Эта диагностика предупреждает о путях в коде, в которых вызов
putenvполучает указатель на автоматическую переменную или на стековый буфер.См. POS34-C. 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 для его отключения.
Эта диагностика предупреждает о путях в коде, в которых значение, которое может быть под контролем злоумышленника, используется в качестве размера выделения без проверки, так что злоумышленник может ввести чрезмерно большой запрос на выделение и, возможно, вызвать атаку типа отказ в обслуживании.
-
-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 для его отключения.
Данный диагностический вывод предупреждает о путях в коде, в которых значение, которое может быть под контролем злоумышленника, используется в качестве индекса доступа к массиву без проверки, что может позволить злоумышленнику осуществить доступ за пределами границ массива.
-
-Wno-analyzer-tainted-divisor -
Это предупреждение требует как -fanalyzer, так и -fanalyzer-checker=taint для активации; используйте -Wno-analyzer-tainted-divisor для его отключения.
Данный диагностический вывод предупреждает о путях в коде, в которых значение, которое может быть под контролем злоумышленника, используется в качестве делителя в операциях деления или взятия остатка без проверки, что может позволить злоумышленнику вызвать деление на ноль.
-
-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без проверки, что может позволить злоумышленнику осуществить доступ за пределами границ. -
-Wno-analyzer-unsafe-call-within-signal-handler -
Это предупреждение требует -fanalyzer для активации; используйте -Wno-analyzer-unsafe-call-within-signal-handler для его отключения.
Данный диагностический вывод предупреждает о путях в коде, в которых функция, известная как небезопасная для обработки сигналов (например,
fprintf), вызывается из обработчика сигналов.См. CWE-479: Использование небезопасной функции в обработчике сигналов.
-
-Wno-analyzer-use-after-free -
Это предупреждение требует -fanalyzer для активации; используйте -Wno-analyzer-use-after-free для его отключения.
Данный диагностический вывод предупреждает о путях в коде, в которых указатель используется после вызова деаллокации на него: либо
free, либо деаллокатор, на который ссылается атрибутmalloc. -
-Wno-analyzer-use-of-pointer-in-stale-stack-frame -
Это предупреждение требует -fanalyzer для активации; используйте -Wno-analyzer-use-of-pointer-in-stale-stack-frame для его отключения.
Данный диагностический вывод предупреждает о путях в коде, в которых указатель разыменовывается, но он указывает на переменную в устаревшей области стека.
-
-Wno-analyzer-va-arg-type-mismatch -
Это предупреждение требует -fanalyzer для активации; используйте -Wno-analyzer-va-arg-type-mismatch для его отключения.
Данный диагностический вывод предупреждает о межпроцедурных путях в коде, в которых анализатор обнаруживает попытку использования
va_argдля извлечения значения, переданного в вариадический вызов, но используется тип, не соответствующий типу выражения, переданного в вызов. -
-Wno-analyzer-va-list-exhausted -
Это предупреждение требует -fanalyzer для активации; используйте -Wno-analyzer-va-list-exhausted для его отключения.
Данный диагностический вывод предупреждает о межпроцедурных путях в коде, в которых анализатор обнаруживает попытку использования
va_argдля доступа к следующему значению, переданному в вариадический вызов, но все значения вva_listуже были использованы.См. 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 для его отключения.
Данный диагностический вывод предупреждает о путях в коде, в которых используется неинициализированное значение.
Анализатор имеет жёстко запрограммированное знание о поведении следующих функций управления памятью:
-
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