Provided by: flawfinder_2.0.10-0.1_all bug

NAME

       flawfinder - lexically find potential security flaws ("hits") in source code

SYNOPSIS

       flawfinder [--help|-h] [--version] [--listrules]
       [--allowlink] [--followdotdir] [--nolink]
       [--patch=filename|-P filename]
       [--inputs|-I] [ --minlevel=X | -m X ] [--falsepositive|-F]
       [--neverignore|-n]
       [--regex=PATTERN | -e PATTERN]
       [--context|-c]  [--columns|-C]  [--csv]  [--dataonly|-D]  [--html|-H]  [--immediate|-i] [--singleline|-S]
       [--omittime] [--quiet|-Q] [--error-level=LEVEL]
       [--loadhitlist=F] [--savehitlist=F] [--diffhitlist=F]
       [--] [ source code file or source root directory ]+

DESCRIPTION

       Flawfinder searches through C/C++ source code looking for potential security flaws.  To  run  flawfinder,
       simply  give  flawfinder  a  list of directories or files.  For each directory given, all files that have
       C/C++ filename extensions in that directory (and  its  subdirectories,  recursively)  will  be  examined.
       Thus,  for  most  projects,  simply  give flawfinder the name of the source code's topmost directory (use
       ``.'' for the current directory), and flawfinder will examine all of the  project's  C/C++  source  code.
       Flawfinder  does  not  require  that  you  be  able  to  build your software, so it can be used even with
       incomplete source code.  If you only want to have changes reviewed, save a unified diff of those  changes
       (created by GNU "diff -u" or "svn diff" or "git diff") in a patch file and use the --patch (-P) option.

       Flawfinder  will  produce  a list of ``hits'' (potential security flaws, also called findings), sorted by
       risk; the riskiest hits are shown first.  The risk level is shown inside square brackets and varies  from
       0,  very  little  risk,  to  5, great risk.  This risk level depends not only on the function, but on the
       values of the parameters of the function.  For example, constant strings are often less risky than  fully
       variable  strings  in  many  contexts,  and  in  those  contexts  the  hit  will have a lower risk level.
       Flawfinder knows about gettext (a common library for internationalized programs) and will treat  constant
       strings  passed  through  gettext  as though they were constant strings; this reduces the number of false
       hits in internationalized programs.  Flawfinder will do the same sort of thing  with  _T()  and  _TEXT(),
       common  Microsoft  macros  for  handling  internationalized  programs.  Flawfinder correctly ignores text
       inside comments and strings.  Normally flawfinder shows all hits with a risk level of at least 1, but you
       can  use  the  --minlevel option to show only hits with higher risk levels if you wish.  Hit descriptions
       also note the relevant Common Weakness Enumeration  (CWE)  identifier(s)  in  parentheses,  as  discussed
       below.   Flawfinder is officially CWE-Compatible.  Hit descriptions with "[MS-banned]" indicate functions
       that are in the banned  list  of  functions  released  by  Microsoft;  see  http://msdn.microsoft.com/en-
       us/library/bb288454.aspx for more information about banned functions.

       Not every hit (aka finding) is actually a security vulnerability, and not every security vulnerability is
       necessarily  found.   Nevertheless,  flawfinder  can  be  an  aid  in  finding  and   removing   security
       vulnerabilities.  A common way to use flawfinder is to first apply flawfinder to a set of source code and
       examine the highest-risk items.  Then, use --inputs to examine the input locations,  and  check  to  make
       sure that only legal and safe input values are accepted from untrusted users.

       Once  you've  audited a program, you can mark source code lines that are actually fine but cause spurious
       warnings so that flawfinder will stop complaining about them.  To mark a line so that these warnings  are
       suppressed,  put  a specially-formatted comment either on the same line (after the source code) or all by
       itself in the previous line.  The comment must have one of the two following formats:

       •      // Flawfinder: ignore

       •      /* Flawfinder: ignore */

       For compatibility's sake, you can replace "Flawfinder:" with  "ITS4:"  or  "RATS:"  in  these  specially-
       formatted comments.  Since it's possible that such lines are wrong, you can use the --neverignore option,
       which causes flawfinder to never ignore any  line  no  matter  what  the  comment  directives  say  (more
       confusingly, --neverignore ignores the ignores).

       Flawfinder  uses  an  internal database called the ``ruleset''; the ruleset identifies functions that are
       common causes of security flaws.  The standard ruleset includes a large  number  of  different  potential
       problems,  including  both  general  issues  that  can  impact  any C/C++ program, as well as a number of
       specific Unix-like and Windows functions that are especially problematic.  The --listrules option reports
       the  list  of current rules and their default risk levels.  As noted above, every potential security flaw
       found in a given source code file (matching an entry in the ruleset) is called a ``hit,'' and the set  of
       hits  found  during  any  particular run of the program is called the ``hitlist.''  Hitlists can be saved
       (using --savehitlist), reloaded back for redisplay (using --loadhitlist), and you can show only the  hits
       that are different from another run (using --diffhitlist).

       Flawfinder is a simple tool, leading to some fundamental pros and cons.  Flawfinder works by doing simple
       lexical tokenization (skipping comments and correctly tokenizing strings), looking for token  matches  to
       the  database  (particularly to find function calls).  Flawfinder is thus similar to RATS and ITS4, which
       also use simple lexical tokenization.  Flawfinder then examines the text of the  function  parameters  to
       estimate  risk.   Unlike tools such as splint, gcc's warning flags, and clang, flawfinder does not use or
       have access to information about control flow, data flow, or data  types  when  searching  for  potential
       vulnerabilities  or  estimating  the level of risk.  Thus, flawfinder will necessarily produce many false
       positives for vulnerabilities and fail to report many vulnerabilities.  On the other hand, flawfinder can
       find  vulnerabilities  in  programs  that  cannot  be  built or cannot be linked.  It can often work with
       programs that cannot even be compiled (at least by the reviewer's tools).  Flawfinder also doesn't get as
       confused  by  macro  definitions  and  other  oddities  that  more sophisticated tools have trouble with.
       Flawfinder can also be useful as a simple introduction to static analysis tools in general, since  it  is
       easy to start using and easy to understand.

       Any  filename  given on the command line will be examined (even if it doesn't have a usual C/C++ filename
       extension); thus you can force flawfinder to examine any specific  files  you  desire.   While  searching
       directories  recursively,  flawfinder  only  opens  and  examines  regular files that have C/C++ filename
       extensions.  Flawfinder presumes that files are C/C++ files if  they  have  the  extensions  ".c",  ".h",
       ".ec",  ".ecp", ".pgc", ".C", ".cpp", ".CPP", ".cxx", ".c++", ".cc", ".CC", ".pcc", ".hpp", or ".H".  The
       filename ``-'' means the standard input.  To prevent security problems, special  files  (such  as  device
       special  files  and  named  pipes)  are  always  skipped,  and by default symbolic links are skipped (the
       --allowlink option follows symbolic links).

       After the list of hits is a brief summary of the results (use -D to remove this  information).   It  will
       show  the  number  of  hits, lines analyzed (as reported by wc -l), and the physical source lines of code
       (SLOC) analyzed.  A physical SLOC is a non-blank, non-comment line.  It will then show the number of hits
       at  each level; note that there will never be a hit at a level lower than minlevel (1 by default).  Thus,
       "[0]   0 [1]   9" means that at level 0 there were 0 hits reported, and at level  1  there  were  9  hits
       reported.   It  will  next show the number of hits at a given level or larger (so level 3+ has the sum of
       the number of hits at level 3, 4, and 5).  Thus, an entry of "[0+]  37" shows that at level 0  or  higher
       there  were 37 hits (the 0+ entry will always be the same as the "hits" number above).  Hits per KSLOC is
       next shown; this is each of the "level or higher" values multiplied by 1000 and divided by  the  physical
       SLOC.   If  symlinks  were  skipped,  the count of those is reported.  If hits were suppressed (using the
       "ignore" directive in source code comments as described above), the number suppressed is  reported.   The
       minimum  risk  level  to  be included in the report is displayed; by default this is 1 (use --minlevel to
       change this).  The summary ends with important  reminders:  Not  every  hit  is  necessarily  a  security
       vulnerability, and there may be other security vulnerabilities not reported by the tool.

       Flawfinder  can  easily  integrate into a continuous integration system.  You might want to check out the
       --error-level option to help do that.

       Flawfinder is released under the GNU GPL license version 2 or later (GPLv2+).

       Flawfinder works similarly to another program, ITS4, which is not fully open source software (as  defined
       in  the  Open  Source  Definition)  nor  free software (as defined by the Free Software Foundation).  The
       author of Flawfinder has never seen ITS4's source code.  Flawfinder is similar in many ways to  RATS,  if
       you are familiar with RATS.

BRIEF TUTORIAL

       Here's  a brief example of how flawfinder might be used.  Imagine that you have the C/C++ source code for
       some program named xyzzy (which you may or may not have  written),  and  you're  searching  for  security
       vulnerabilities (so you can fix them before customers encounter the vulnerabilities).  For this tutorial,
       I'll assume that you're using a Unix-like system, such as Linux, OpenBSD, or MacOS X.

       If the source code is in a subdirectory named xyzzy, you would probably start by opening  a  text  window
       and  using  flawfinder's  default  settings,  to  analyze  the  program  and report a prioritized list of
       potential security vulnerabilities (the ``less'' just makes sure the results stay on the screen):
              flawfinder xyzzy | less

       At this point, you will see a large number of entries.  Each entry  has  a  filename,  a  colon,  a  line
       number, a risk level in brackets (where 5 is the most risky), a category, the name of the function, and a
       description of why flawfinder thinks the line is a vulnerability.   Flawfinder  normally  sorts  by  risk
       level, showing the riskiest items first; if you have limited time, it's probably best to start working on
       the riskiest items and continue until you run out of time.  If you want to limit  the  display  to  risks
       with  only a certain risk level or higher, use the --minlevel option.  If you're getting an extraordinary
       number of false positives because variable names look like dangerous function names, use the -F option to
       remove  reports  about them.  If you don't understand the error message, please see documents such as the
       Secure Programming HOWTO ⟨https://dwheeler.com/secure-programs⟩  at  https://dwheeler.com/secure-programs
       which provides more information on writing secure programs.

       Once  you identify the problem and understand it, you can fix it.  Occasionally you may want to re-do the
       analysis, both because the line numbers will change and to make sure that the new code doesn't  introduce
       yet a different vulnerability.

       If  you've  determined  that some line isn't really a problem, and you're sure of it, you can insert just
       before or on the offending line a comment like
               /* Flawfinder: ignore */
       to keep them from showing up in the output.

       Once you've done that, you should go back and search for the program's inputs,  to  make  sure  that  the
       program  strongly  filters  any  of its untrusted inputs.  Flawfinder can identify many program inputs by
       using the --inputs option, like this:
              flawfinder --inputs xyzzy

       Flawfinder can integrate well with text editors and integrated development environments; see the examples
       for more information.

       Flawfinder  includes many other options, including ones to create HTML versions of the output (useful for
       prettier displays).  The next section describes those options in more detail.

OPTIONS

       Flawfinder has a number of options, which can be grouped into options that control its own documentation,
       select  input  data,  select  which  hits  to  display,  select  the  output  format, and perform hitlist
       management.  The commonly-used flawfinder options support the standard option syntax defined in the POSIX
       (Issue  7,  2013 Edition) section ``Utility Conventions''.  Flawfinder also supports the GNU long options
       (double-dash options of form --option) as defined  in  the  GNU  C  Library  Reference  Manual  ``Program
       Argument  Syntax  Conventions'' and GNU Coding Standards ``Standards for Command Line Interfaces''.  Long
       option arguments can be provided as ``--name=value'' or ``-name value''.  All  options  can  be  accessed
       using the more readable GNU long option conventions; some less commonly used options can only be accessed
       using long option conventions.

   Documentation
       --help

       -h          Show usage (help) information.

       --version   Shows (just) the version number and exits.

       --listrules List the terms (tokens) that trigger further examination, their default risk level,  and  the
                   default  warning  (including  the  CWE identifier(s), if applicable), all tab-separated.  The
                   terms are primarily names of potentially-dangerous functions.  Note that  the  reported  risk
                   level  and warning for some specific code may be different than the default, depending on how
                   the term is used.  Combine with -D if you do not want the usual header.   Flawfinder  version
                   1.29 changed the separator from spaces to tabs, and added the default warning field.

   Selecting Input Data
       --allowlink Allow  the use of symbolic links; normally symbolic links are skipped.  Don't use this option
                   if you're analyzing code by others; attackers could do many things to cause problems  for  an
                   analysis  with  this option enabled.  For example, an attacker could insert symbolic links to
                   files such as /etc/passwd (leaking information about the file) or  create  a  circular  loop,
                   which  would  cause flawfinder to run ``forever''.  Another problem with enabling this option
                   is that if the same file is referenced multiple  times  using  symbolic  links,  it  will  be
                   analyzed  multiple  times  (and  thus reported multiple times).  Note that flawfinder already
                   includes some protection against symbolic links to special file types  such  as  device  file
                   types  (e.g.,  /dev/zero  or  C:\mystuff\com1).   Note  that  for flawfinder version 1.01 and
                   before, this was the default.

       --followdotdir
                   Enter directories whose names begin with ".".  Normally such directories are  ignored,  since
                   they  normally  include version control private data (such as .git/ or .svn/), build metadata
                   (such as .makepp), configuration information, and so on.

       --nolink    Ignored.  Historically this disabled following symbolic  links;  this  behavior  is  now  the
                   default.

       --patch=patchfile

       -P patchfile
                   Examine  the  selected  files or directories, but only report hits in lines that are added or
                   modified as described in the given patch file.  The  patch  file  must  be  in  a  recognized
                   unified  diff  format  (e.g.,  the  output of GNU "diff -u old new", "svn diff", or "git diff
                   [commit]").  Flawfinder assumes that the patch has already been applied to  the  files.   The
                   patch  file  can also include changes to irrelevant files (they will simply be ignored).  The
                   line numbers given in the patch file are used to determine which lines were  changed,  so  if
                   you  have  modified  the  files  since  the patch file was created, regenerate the patch file
                   first.  Beware that the file names of the new files  given  in  the  patch  file  must  match
                   exactly,  including  upper/lower  case, path prefix, and directory separator (\ vs. /).  Only
                   unified diff format is accepted (GNU diff, svn diff, and git diff output  is  okay);  if  you
                   have  a  different  format,  again  regenerate  it  first.  Only hits that occur on resultant
                   changed lines, or immediately above and  below  them,  are  reported.   This  option  implies
                   --neverignore.   Warning:  Do  not  pass a patch file without the -P, because flawfinder will
                   then try to treat the file as a source file.  This will often work, but the line numbers will
                   be  relative  to the beginning of the patch file, not the positions in the source code.  Note
                   that you must also provide the actual files to analyze, and not just  the  patch  file;  when
                   using  -P  files  are  only  reported  if  they  are both listed in the patch and also listed
                   (directly or indirectly) in the list of files to analyze.

   Selecting Hits to Display
       --inputs

       -I     Show only functions that obtain data from outside the program; this also sets minlevel to 0.

       --minlevel=X

       -m X   Set minimum risk level to X for inclusion in hitlist.  This can be  from  0  (``no  risk'')  to  5
              (``maximum risk''); the default is 1.

       --falsepositive

       -F     Do  not  include  hits that are likely to be false positives.  Currently, this means that function
              names are ignored if they're not followed by "(", and that declarations of character arrays aren't
              noted.  Thus, if you have use a variable named "access" everywhere, this will eliminate references
              to this ordinary variable.  This isn't the default, because this also increases the likelihood  of
              missing  important  hits;  in  particular,  function  names  in  #define clauses and calls through
              function pointers will be missed.

       --neverignore

       -n     Never ignore security issues, even if they have an ``ignore'' directive in a comment.

       --regexp=PATTERN

       -e PATTERN
              Only report hits with text that matches the regular expression pattern PATTERN.  For  example,  to
              only  report hits containing the text "CWE-120", use ``--regex CWE-120''.  These option flag names
              are the same as grep.

   Selecting Output Format
       --columns

       -C          Show the column number (as well as the file name and line number) of each hit; this is  shown
                   after  the  line  number  by  adding  a  colon  and  the column number in the line (the first
                   character in a line is column number 1).  This  is  useful  for  editors  that  can  jump  to
                   specific  columns,  or  for integrating with other tools (such as those to further filter out
                   false positives).

       --context

       -c          Show context, i.e., the line having the "hit"/potential flaw.  By default the line  is  shown
                   immediately after the warning.

       --csv       Generate  output  in  comma-separated-value (CSV) format.  This is the recommended format for
                   sending to other tools for processing.  It will always generate a header row, followed  by  0
                   or  more  data rows (one data row for each hit).  Selecting this option automatically enables
                   --quiet and --dataonly.  The headers are mostly self-explanatory.  "File"  is  the  filename,
                   "Line"  is  the  line  number,  "Column" is the column (starting from 1), "Level" is the risk
                   level (0-5, 5 is riskiest), "Category" is the general flawfinder category, "Name" is the name
                   of  the triggering rule, "Warning" is text explaining why it is a hit (finding), "Suggestion"
                   is text suggesting how it might be fixed, "Note" is other explanatory notes,  "CWEs"  is  the
                   list  of  one  or  more  CWEs,  "Context"  is  the  source  code line triggering the hit, and
                   "Fingerprint" is the SHA-256 hash of the context once its  leading  and  trailing  whitespace
                   have been removed (the fingerprint may help detect and eliminate later duplications).  If you
                   use Python3, the hash is of the context when encoded as UTF-8.

       --dataonly

       -D          Don't display the header and footer.  Use this along  with  --quiet  to  see  just  the  data
                   itself.

       --html

       -H          Format the output as HTML instead of as simple text.

       --immediate

       -i          Immediately display hits (don't just wait until the end).

       --singleline

       -S          Display  as single line of text output for each hit.  Useful for interacting with compilation
                   tools.

       --omittime  Omit timing information.  This is useful for regression tests of flawfinder itself,  so  that
                   the output doesn't vary depending on how long the analysis takes.

       --quiet

       -Q          Don't display status information (i.e., which files are being examined) while the analysis is
                   going on.

       --error-level=LEVEL
                   Return a nonzero (false) error code if there is at least one hit of LEVEL or  higher.   If  a
                   diffhitlist  is  provided,  hits noted in it are ignored.  This option can be useful within a
                   continuous integration script, especially  if  you  mark  known-okay  lines  as  "flawfinder:
                   ignore".   Usually  you want level to be fairly high, such as 4 or 5.  By default, flawfinder
                   returns 0 (true) on a successful run.

   Hitlist Management
       --savehitlist=F
                   Save all resulting hits (the "hitlist") to F.

       --loadhitlist=F
                   Load the hitlist from F instead of analyzing source programs.  Warning: Do not load  hitlists
                   from  untrusted  sources  (for  security  reasons).   These  are internally implemented using
                   Python's "pickle" facility, which trusts the input.  Note that stored hitlists  often  cannot
                   be  read  when  using  an older version of Python, in particular, if savehitlist was used but
                   flawfinder was run using Python 3, the hitlist can't be loaded  by  running  flawfinder  with
                   Python 2.

       --diffhitlist=F
                   Show  only  hits  (loaded  or  analyzed) not in F.  F was presumably created previously using
                   --savehitlist.  Warning: Do not diff hitlists from untrusted sources (for security  reasons).
                   If  the  --loadhitlist option is not provided, this will show the hits in the analyzed source
                   code files that were not previously stored in F.  If used along with --loadhitlist, this will
                   show the hits in the loaded hitlist not in F.  The difference algorithm is conservative; hits
                   are only considered the ``same''  if  they  have  the  same  filename,  line  number,  column
                   position, function name, and risk level.

   Character Encoding
       Flawfinder  presumes  that the character encoding your system uses is also the character encoding used by
       your source files.  Even if this  isn't  correct,  if  you  run  flawfinder  with  Python  2  these  non-
       conformities often do not impact processing in practice.

       However,  if you run flawfinder with Python 3, this can be a problem.  Python 3 wants the world to always
       use encodings perfectly correctly, everywhere, even though the world often doesn't  care  what  Python  3
       wants.   This  is  a  problem  even  if the non-conforming text is in comments or strings (where it often
       doesn't matter).  Python 3 fails to provide useful built-ins to deal  with  the  messiness  of  the  real
       world, so it's non-trivial to deal with this problem without depending on external libraries (which we're
       trying to avoid).

       A symptom of this problem is if you run flawfinder and you see an error message like this:

       UnicodeDecodeError: 'utf-8' codec can't decode byte ... in position ...: invalid continuation byte

       If this happens to you, there are several options.

       The first option is to convert the encoding of the files to be analyzed so that it's  a  single  encoding
       (usually  the system encoding).  For example, the program "iconv" can be used to convert encodings.  This
       works well if some files have one encoding, and some have another,  but  they  are  consistent  within  a
       single file.  If the files have encoding errors, you'll have to fix them.  I strongly recommend using the
       UTF-8 encoding for all source code and in the system itself; if you do that, many problems disappear.

       The second option is to tell flawfinder what the encoding of the files is.  E.G., you can  set  the  LANG
       environment  variable.   You  can  set PYTHONIOENCODING to the encoding you want your output to be in, if
       that's different.  This in theory would work, but I haven't had much success with this.

       The third option is to run flawfinder using Python 2 instead of  Python  3.   E.g.,  "python2  flawfinder
       ...".

EXAMPLES

       Here  are  various examples of how to invoke flawfinder.  The first examples show various simple command-
       line options.  Flawfinder is  designed  to  work  well  with  text  editors  and  integrated  development
       environments, so the next sections show how to integrate flawfinder into vim and emacs.

   Simple command-line options
       flawfinder /usr/src/linux-3.16
                   Examine  all  the C/C++ files in the directory /usr/src/linux-3.16 and all its subdirectories
                   (recursively), reporting on all hits found.  By default flawfinder will skip  symbolic  links
                   and directories with names that start with a period.

       flawfinder --minlevel=4 .
                   Examine  all  the  C/C++ files in the current directory and its subdirectories (recursively);
                   only report vulnerabilities level 4 and up (the two highest risk levels).

       flawfinder --inputs mydir
                   Examine all the C/C++ files  in  mydir  and  its  subdirectories  (recursively),  and  report
                   functions   that   take  inputs  (so  that  you  can  ensure  that  they  filter  the  inputs
                   appropriately).

       flawfinder --neverignore mydir
                   Examine all the C/C++ files in the directory mydir and its subdirectories, including even the
                   hits marked for ignoring in the code comments.

       flawfinder --csv .
                   Examine the current directory down (recursively), and report all hits in CSV format.  This is
                   the recommended form if you want to further process flawfinder output using other tools (such
                   as data correlation tools).

       flawfinder -QD mydir
                   Examine  mydir  and  report  only  the  actual results (removing the header and footer of the
                   output).  This form may be useful if the output will be piped into other  tools  for  further
                   analysis,  though  CSV format is probably the better choice in that case.  The -C (--columns)
                   and -S (--singleline) options can also be useful if you're piping the data into other tools.

       flawfinder -QDSC mydir
                   Examine mydir, reporting only the actual results (no header or footer).  Each hit is reported
                   on  one  line,  and  column  numbers  are  reported.  This can be a useful command if you are
                   feeding flawfinder output to other tools.

       flawfinder --quiet --html --context mydir > results.html
                   Examine all the C/C++ files in the directory mydir and its  subdirectories,  and  produce  an
                   HTML  formatted  version of the results.  Source code management systems (such as SourceForge
                   and Savannah) might use a command like this.

       flawfinder --quiet --savehitlist saved.hits *.[ch]
                   Examine all .c and .h files in  the  current  directory.   Don't  report  on  the  status  of
                   processing, and save the resulting hitlist (the set of all hits) in the file saved.hits.

       flawfinder --diffhitlist saved.hits *.[ch]
                   Examine  all .c and .h files in the current directory, and show any hits that weren't already
                   in the file saved.hits.  This can be used to show  only  the  ``new''  vulnerabilities  in  a
                   modified  program,  if  saved.hits  was  created  from the older version of the program being
                   analyzed.

       flawfinder --patch recent.patch .
                   Examine the current directory recursively, but only report lines that were changed  or  added
                   in the already-applied patchfile named recent.patch.

       flawfinder --regex "CWE-120|CWE-126" src/
                   Examine directory src recursively, but only report hits where CWE-120 or CWE-126 apply.

   Invoking from vim
       The  text  editor  vim  includes  a "quickfix" mechanism that works well with flawfinder, so that you can
       easily view the warning messages and jump to the relevant source code.

       First, you need to invoke flawfinder to create a list of hits, and there are two ways to  do  this.   The
       first  way  is  to  start flawfinder first, and then (using its output) invoke vim.  The second way is to
       start (or continue to run) vim, and then invoke flawfinder (typically from inside vim).

       For the first way, run flawfinder and store its output in some FLAWFILE (say "flawfile"), then invoke vim
       using  its  -q  option, like this: "vim -q flawfile".  The second way (starting flawfinder after starting
       vim) can be done a legion of ways.  One is to invoke flawfinder using  a  shell  command,  ":!flawfinder-
       command  >  FLAWFILE",  then  follow  that  with the command ":cf FLAWFILE".  Another way is to store the
       flawfinder command in your makefile (as, say, a pseudocommand like "flaw"), and then run ":make flaw".

       In all these cases you need a command for flawfinder to run.  A plausible command, which places each  hit
       in its own line (-S) and removes headers and footers that would confuse it, is:

       flawfinder -SQD .

       You  can  now use various editing commands to view the results.  The command ":cn" displays the next hit;
       ":cN" displays the previous hit, and ":cr" rewinds back to the first hit.  ":copen" will open a window to
       show  the  current  list of hits, called the "quickfix window"; ":cclose" will close the quickfix window.
       If the buffer in the used window has changed, and the error is in another file, jumping to the error will
       fail.  You have to make sure the window contains a buffer which can be abandoned before trying to jump to
       a new file, say by saving the file; this prevents accidental data loss.

   Invoking from emacs
       The text editor / operating system emacs includes "grep mode" and "compile  mode"  mechanisms  that  work
       well  with flawfinder, making it easy to view warning messages, jump to the relevant source code, and fix
       any problems you find.

       First, you need to invoke flawfinder to create a list of warning messages.  You can use  "grep  mode"  or
       "compile  mode"  to  create  this  list.   Often  "grep  mode" is more convenient; it leaves compile mode
       untouched so you can easily recompile once you've changed something.  However, if you want to jump to the
       exact  column  position  of  a  hit, compile mode may be more convenient because emacs can use the column
       output of flawfinder to directly jump to the right location without any special configuration.

       To use grep mode, enter the command "M-x grep" and then enter the  needed  flawfinder  command.   To  use
       compile  mode,  enter the command "M-x compile" and enter the needed flawfinder command.  This is a meta-
       key command, so you'll need to use the meta key for your keyboard (this is usually the ESC key).  As with
       all  emacs  commands,  you'll need to press RETURN after typing "grep" or "compile".  So on many systems,
       the grep mode is invoked by typing ESC x g r e p RETURN.

       You then need to enter a command, removing whatever was there before if necessary.  A  plausible  command
       is:

       flawfinder -SQDC .

       This  command  makes every hit report a single line, which is much easier for tools to handle.  The quiet
       and dataonly options remove the other status information not needed for use inside emacs.   The  trailing
       period means that the current directory and all descendents are searched for C/C++ code, and analyzed for
       flaws.

       Once you've invoked flawfinder, you can use emacs to jump around in  its  results.   The  command  C-x  `
       (Control-x  backtick) visits the source code location for the next warning message.  C-u C-x ` (control-u
       control-x backtick) restarts from the beginning.  You can visit  the  source  for  any  particular  error
       message  by moving to that hit message in the *compilation* buffer or *grep* buffer and typing the return
       key.  (Technical note: in the compilation buffer, this invokes compile-goto-error.)  You can  also  click
       the Mouse-2 button on the error message (you don't need to switch to the *compilation* buffer first).

       If  you  want  to  use grep mode to jump to specific columns of a hit, you'll need to specially configure
       emacs to do this.  To do this, modify the emacs variable "grep-regexp-alist".  This variable tells  Emacs
       how  to  parse output of a "grep" command, similar to the variable "compilation-error-regexp-alist" which
       lists various formats of compilation error messages.

   Invoking from Integrated Development Environments (IDEs)
       For (other) IDEs, consult your IDE's set of plug-ins.

COMMON WEAKNESS ENUMERATION (CWE)

       The Common Weakness Enumeration (CWE) is ``a formal list or dictionary of common software weaknesses that
       can  occur  in  software's  architecture,  design,  code  or  implementation that can lead to exploitable
       security vulnerabilities...  created to serve as a  common  language  for  describing  software  security
       weaknesses''    (https://cwe.mitre.org/about/faq.html).     For    more    information   on   CWEs,   see
       https://cwe.mitre.org.

       Flawfinder supports the CWE and is officially  CWE-Compatible.   Hit  descriptions  typically  include  a
       relevant  Common  Weakness  Enumeration  (CWE)  identifier  in  parentheses  where there is known to be a
       relevant CWE.  For example, many of the buffer-related hits  mention  CWE-120,  the  CWE  identifier  for
       ``buffer  copy  without  checking size of input'' (aka ``Classic Buffer Overflow'').  In a few cases more
       than one CWE identifier may be listed.  The  HTML  report  also  includes  hypertext  links  to  the  CWE
       definitions hosted at MITRE.  In this way, flawfinder is designed to meet the CWE-Output requirement.

       In  some  cases  there are CWE mapping and usage challenges; here is how flawfinder handles them.  If the
       same entry maps to multiple CWEs simultaneously, all the CWE mappings are listed as separated by  commas.
       This  often occurs with CWE-20, Improper Input Validation; thus the report "CWE-676, CWE-120" maps to two
       CWEs.  In addition, flawfinder provides additional information for those who are are  interested  in  the
       CWE/SANS  top  25  list 2011 (https://cwe.mitre.org/top25/) when mappings are not directly to them.  Many
       people will want to search for specific CWEs in this  top  25  list,  such  as  CWE-120  (classic  buffer
       overflow).  The challenge is that some flawfinder hits map to a more general CWE that would include a top
       25 item, while in some other cases hits map to a more specific vulnerability that is only a subset  of  a
       top 25 item.  To resolve this, in some cases flawfinder will list a sequence of CWEs in the format "more-
       general/more-specific", where the CWE actually being mapped is followed by a "!".  This  is  always  done
       whenever  a  flaw  is  not mapped directly to a top 25 CWE, but the mapping is related to such a CWE.  So
       "CWE-119!/CWE-120" means that the vulnerability is mapped to CWE-119 and that  CWE-120  is  a  subset  of
       CWE-119.   In  contrast, "CWE-362/CWE-367!" means that the hit is mapped to CWE-367, a subset of CWE-362.
       Note that this is a subtle syntax change from flawfinder version 1.31; in flawfinder  version  1.31,  the
       form "more-general:more-specific" meant what is now listed as "more-general!/more-specific", while "more-
       general/more-specific" meant "more-general/more-specific!".  Tools can handle both the version  1.31  and
       the  current  format, if they wish, by noting that the older format did not use "!" at all (and thus this
       is easy to distinguish).  These mapping mechanisms simplify searching for certain CWEs.

       CWE version 2.7 (released June 23, 2014) was used for the mapping.  The current CWE mappings  select  the
       most  specific  CWE  the  tool can determine.  In theory, most CWE security elements (signatures/patterns
       that the tool searches for) could theoretically be  mapped  to  CWE-676  (Use  of  Potentially  Dangerous
       Function), but such a mapping would not be useful.  Thus, more specific mappings were preferred where one
       could be found.  Flawfinder is a lexical analysis tool; as a result, it is impractical for it to be  more
       specific  than  the  mappings  currently  implemented.   This also means that it is unlikely to need much
       updating for map currency; it simply doesn't have enough information to refine to a  detailed  CWE  level
       that  CWE  changes would typically affect.  The list of CWE identifiers was generated automatically using
       "make show-cwes", so there is confidence that this list is correct.  Please report CWE  mapping  problems
       as bugs if you find any.

       Flawfinder may fail to find a vulnerability, even if flawfinder covers one of these CWE weaknesses.  That
       said, flawfinder does find vulnerabilities listed by the CWEs it covers, and it  will  not  report  lines
       without  those  vulnerabilities  in  many  cases.   Thus,  as  required  for any tool intending to be CWE
       compatible, flawfinder has a rate of false positives less than 100% and a rate of  false  negatives  less
       than  100%.   Flawfinder  almost  always  reports  whenever it finds a match to a CWE security element (a
       signature/pattern as defined in its database), though certain obscure constructs can  cause  it  to  fail
       (see BUGS below).

       Flawfinder can report on the following CWEs (these are the CWEs that flawfinder covers; ``*'' marks those
       in the CWE/SANS top 25 list):

       • CWE-20: Improper Input Validation

       • CWE-22: Improper Limitation of a Pathname to a Restricted Directory (``Path Traversal'')

       • CWE-78: Improper Neutralization of Special Elements used in an OS Command (``OS Command Injection'')*

       • CWE-119: Improper Restriction of Operations within the Bounds of a Memory Buffer (a parent of CWE-120*,
         so this is shown as CWE-119!/CWE-120)

       • CWE-120: Buffer Copy without Checking Size of Input (``Classic Buffer Overflow'')*

       • CWE-126: Buffer Over-read

       • CWE-134: Uncontrolled Format String*

       • CWE-190: Integer Overflow or Wraparound*

       • CWE-250: Execution with Unnecessary Privileges

       • CWE-327: Use of a Broken or Risky Cryptographic Algorithm*

       • CWE-362: Concurrent Execution using Shared Resource with Improper Synchronization (``Race Condition'')

       • CWE-377: Insecure Temporary File

       • CWE-676: Use of Potentially Dangerous Function*

       • CWE-732: Incorrect Permission Assignment for Critical Resource*

       • CWE-785:  Use of Path Manipulation Function without Maximum-sized Buffer (child of CWE-120*, so this is
         shown as CWE-120/CWE-785)

       • CWE-807: Reliance on Untrusted Inputs in a Security Decision*

       • CWE-829: Inclusion of Functionality from Untrusted Control Sphere*

       You can select a specific subset of CWEs to report by using the ``--regex''  (-e)  option.   This  option
       accepts  a  regular expression, so you can select multiple CWEs, e.g., ``--regex "CWE-120|CWE-126"''.  If
       you select multiple CWEs with ``|'' on a command line you will typically need  to  quote  the  parameters
       (since  an  unquoted  ``|''  is  the  pipe  symbol).   Flawfinder  is designed to meet the CWE-Searchable
       requirement.

       If your goal is to report a subset of CWEs that are listed in a file, that can be achieved on a Unix-like
       system  using  the  ``--regex''  aka  ``-e'' option.  The file must be in regular expression format.  For
       example, ``flawfinder -e $(cat file1)'' would report only hits that matched the pattern in ``file1''.  If
       file1 contained ``CWE-120|CWE-126'' it would only report hits matching those CWEs.

       A  list  of all CWE security elements (the signatures/patterns that flawfinder looks for) can be found by
       using the ``--listrules'' option.  Each line lists the signature token (typically a function  name)  that
       may  lead  to  a  hit,  the  default  risk level, and the default warning (which includes the default CWE
       identifier).  For most purposes this is also enough if you want to see what CWE security elements map  to
       which  CWEs, or the reverse.  For example, to see the most of the signatures (function names) that map to
       CWE-327, without seeing the default risk level or detailed warning text, run ``flawfinder  --listrules  |
       grep  CWE-327  |  cut  -f1''.   You  can  also  see  the tokens without a CWE mapping this way by running
       ``flawfinder -D --listrules | grep  -v  CWE-''.   However,  while  --listrules  lists  all  CWE  security
       elements,  it only lists the default mappings from CWE security elements to CWE identifiers.  It does not
       include the refinements that flawfinder applies (e.g., by examining function parameters).

       If you want a detailed and exact mapping between the CWE  security  elements  and  CWE  identifiers,  the
       flawfinder  source  code  (included  in  the  distribution) is the best place for that information.  This
       detailed information is primarily of interest to those few people  who  are  trying  to  refine  the  CWE
       mappings  of  flawfinder  or  refine  CWE  in general.  The source code documents the mapping between the
       security elements to the respective CWE identifiers, and  is  a  single  Python  file.   The  ``c_rules''
       dataset  defines  most  rules,  with  reference to a function that may make further refinements.  You can
       search the dataset for function names to see what CWE it generates by default; if first parameter is  not
       ``normal'' then that is the name of a refining Python method that may select different CWEs (depending on
       additional information).  Conversely, you can search for ``CWE-number'' and find what  security  elements
       (signatures  or  patterns)  refer  to  that CWE identifier.  For most people, this is much more than they
       need; most people just want to scan their source code to quickly find problems.

SECURITY

       The whole point of this tool is to help find vulnerabilities so they can be fixed.   However,  developers
       and reviewers must know how to develop secure software to use this tool, because otherwise, a fool with a
       tool is still a fool.  My book at https://dwheeler.com/secure-programs may help.

       This tool should be, at most, a small part of a larger software development process designed to eliminate
       or  reduce  the  impact  of  vulnerabilities.   Developers  and reviewers need know how to develop secure
       software, and they need to apply this knowledge to reduce the  risks  of  vulnerabilities  in  the  first
       place.

       Different  vulnerability-finding  tools  tend  to find different vulnerabilities.  Thus, you are best off
       using human review and a variety of tools.  This tool can help find some vulnerabilities, but by no means
       all.

       You  should  always  analyze  a  copy  of  the source program being analyzed, not a directory that can be
       modified by a developer while flawfinder is performing the analysis.  This  is  especially  true  if  you
       don't  necessily  trust  a  developer of the program being analyzed.  If an attacker has control over the
       files while you're analyzing them, the attacker could move files  around  or  change  their  contents  to
       prevent  the  exposure of a security problem (or create the impression of a problem where there is none).
       If you're worried about malicious programmers you should do this anyway, because  after  analysis  you'll
       need  to  verify that the code eventually run is the code you analyzed.  Also, do not use the --allowlink
       option in such cases; attackers could create malicious symbolic links to files outside  of  their  source
       code area (such as /etc/passwd).

       Source  code  management  systems  (like  GitHub,  SourceForge,  and  Savannah) definitely fall into this
       category; if you're maintaining one of those systems, first copy or extract the  files  into  a  separate
       directory  (that  can't  be controlled by attackers) before running flawfinder or any other code analysis
       tool.

       Note that flawfinder only opens regular files, directories, and (if requested) symbolic  links;  it  will
       never  open  other  kinds of files, even if a symbolic link is made to them.  This counters attackers who
       insert unusual file types into the source code.   However,  this  only  works  if  the  filesystem  being
       analyzed  can't  be  modified  by an attacker during the analysis, as recommended above.  This protection
       also doesn't work on Cygwin platforms, unfortunately.

       Cygwin systems (Unix emulation on top of Windows) have an additional problem if  flawfinder  is  used  to
       analyze  programs that the analyst cannot trust.  The problem is due to a design flaw in Windows (that it
       inherits from MS-DOS).  On Windows and MS-DOS,  certain  filenames  (e.g.,  ``com1'')  are  automatically
       treated  by  the operating system as the names of peripherals, and this is true even when a full pathname
       is given.  Yes, Windows and MS-DOS really are  designed  this  badly.   Flawfinder  deals  with  this  by
       checking  what  a filesystem object is, and then only opening directories and regular files (and symlinks
       if enabled).  Unfortunately, this doesn't work on Cygwin; on at least some versions  of  Cygwin  on  some
       versions of Windows, merely trying to determine if a file is a device type can cause the program to hang.
       A workaround is to delete or rename any filenames that are interpreted as device names before  performing
       the  analysis.   These  so-called  ``reserved  names''  are  CON,  PRN,  AUX, CLOCK$, NUL, COM1-COM9, and
       LPT1-LPT9, optionally followed by an extension (e.g., ``com1.txt''), in any directory, and  in  any  case
       (Windows is case-insensitive).

       Do  not  load  or  diff  hitlists  from  untrusted sources.  They are implemented using the Python pickle
       module, and the pickle module is not intended to be secure against erroneous or  maliciously  constructed
       data.   Stored  hitlists  are  intended  for  later use by the same user who created the hitlist; in that
       context this restriction is not a problem.

BUGS

       Flawfinder is based on simple text pattern matching, which is part of  its  fundamental  design  and  not
       easily  changed.  This design approach leads to a number of fundamental limitations, e.g., a higher false
       positive rate, and is the underlying cause of most of the  bugs  listed  here.   On  the  positive  side,
       flawfinder  doesn't  get  confused  by many complicated preprocessor sequences that other tools sometimes
       choke on; flawfinder can often handle code that cannot link, and sometimes cannot even compile or build.

       Flawfinder is currently limited to C/C++.  In addition, when analyzing C++ it focuses primarily on the  C
       subset of C++.  For example, flawfinder does not report on expressions like cin >> charbuf, where charbuf
       is a char array.  That is because flawfinder doesn't have type information, and ">>" is  safe  with  many
       other  types;  reporting on all ">>" would lead to too many false positives.  That said, it's designed so
       that adding support for other languages should be easy where its text-based approach can usefully apply.

       Flawfinder can be fooled by user-defined functions or method names that happen to be the  same  as  those
       defined as ``hits'' in its database, and will often trigger on definitions (as well as uses) of functions
       with the same name.  This is typically not a problem for C code.  In C code, a  function  with  the  same
       name  as  a  common  library routine name often indicates that the developer is simply rewriting a common
       library routine with the same interface, say for portability's sake.  C programs tend  to  avoid  reusing
       the  same  name  for  a  different  purpose (since in C function names are global by default).  There are
       reasonable odds that these rewritten routines will be vulnerable to the same kinds of misuse,  and  thus,
       reusing  these  rules  is a reasonable approach.  However, this can be a much more serious problem in C++
       code which heavily uses classes and namespaces, since the  same  method  name  may  have  many  different
       meanings.  The --falsepositive option can help somewhat in this case.  If this is a serious problem, feel
       free to modify the program, or process the flawfinder output through other  tools  to  remove  the  false
       positives.

       Preprocessor commands embedded in the middle of a parameter list of a call can cause problems in parsing,
       in particular, if a string is opened and then closed multiple times using an #ifdef ..  #else  construct,
       flawfinder  gets confused.  Such constructs are bad style, and will confuse many other tools too.  If you
       must analyze such files, rewrite those lines.  Thankfully, these are quite rare.

       Flawfinder reports vulnerabilities regardless of the parameters of "#if" or "#ifdef".  A  construct  "#if
       VALUE"  will often have VALUE of 0 in some cases, and non-zero in others.  Similarly, "#ifdef VALUE" will
       have VALUE defined in some cases, and not defined in others.  Flawfinder  reports  in  all  cases,  which
       means  that flawfinder has a chance of reporting vulnerabilities in all alternatives.  This is not a bug,
       this is intended behavior.

       Flawfinder will report hits even if they are between a  literal  "#if  0"  and  "#endif".   It  would  be
       possible  to change this particular situation, but directly using "#if 0" to comment-out code (other than
       during debugging) is itself that the removal is very temporary (in which case we should report it) or  an
       indicator of a problem with poor code practices.  If you want to permanently get rid of code, then delete
       it instead of using "#if 0", since you can always see what it was using your  version  control  software.
       If you don't use version control software, then that's the bug you need to fix right now.

       Some  complex  or  unusual  constructs can mislead flawfinder.  In particular, if a parameter begins with
       gettext(" and ends with ), flawfinder will presume that the parameter of gettext  is  a  constant.   This
       means  it  will get confused by patterns like gettext("hi") + function("bye").  In practice, this doesn't
       seem to be a problem; gettext() is usually wrapped around the entire parameter.

       The routine to detect statically defined character arrays uses simple  text  matching;  some  complicated
       expressions can cause it to trigger or not trigger unexpectedly.

       Flawfinder  looks for specific patterns known to be common mistakes.  Flawfinder (or any tool like it) is
       not a good tool for finding intentionally malicious code (e.g., Trojan horses); malicious programmers can
       easily insert code that would not be detected by this kind of tool.

       Flawfinder  looks  for  specific  patterns  known to be common mistakes in application code.  Thus, it is
       likely to be less effective analyzing programs that aren't application-layer code (e.g., kernel  code  or
       self-hosting  code).   The  techniques  may  still  be  useful; feel free to replace the database if your
       situation is significantly different from normal.

       Flawfinder's default output format (filename:linenumber, followed optionally by a :columnnumber)  can  be
       misunderstood  if  any  source  files  have very weird filenames.  Filenames embedding a newline/linefeed
       character will cause odd breaks, and filenames including colon (:) are likely to be misunderstood.   This
       is  especially  important  if  flawfinder's  output is being used by other tools, such as filters or text
       editors.  If you are using flawfinder's output in other tools, consider  using  its  CSV  format  instead
       (which  can  handle  this).   If you're looking at new code, examine the files for such characters.  It's
       incredibly unwise to have such filenames anyway; many tools can't handle such filenames at all.   Newline
       and  linefeed  are often used as internal data delimeters.  The colon is often used as special characters
       in filesystems: MacOS uses it as a directory separator, Windows/MS-DOS uses it to identify drive letters,
       Windows/MS-DOS  inconsistently  uses  it  to identify special devices like CON:, and applications on many
       platforms use the colon to identify URIs/URLs.   Filenames  including  spaces  and/or  tabs  don't  cause
       problems for flawfinder, though note that other tools might have problems with them.

       Flawfinder is not internationalized, so it currently does not support localization.

       In  general, flawfinder attempts to err on the side of caution; it tends to report hits, so that they can
       be examined further, instead of silently ignoring them.  Thus, flawfinder prefers to have false positives
       (reports  that  turn  out  to  not  be problems) rather than false negatives (failures to report security
       vulnerabilities).  But this is a generality; flawfinder uses simplistic heuristics and simply  can't  get
       everything "right".

       Security  vulnerabilities might not be identified as such by flawfinder, and conversely, some hits aren't
       really security vulnerabilities.  This is true for all static security scanners, and is  especially  true
       for  tools  like flawfinder that use a simple lexical analysis and pattern analysis to identify potential
       vulnerabilities.  Still, it can serve as a useful aid for humans, helping to identify  useful  places  to
       examine further, and that's the point of this simple tool.

SEE ALSO

       See  the  flawfinder  website  at  https://dwheeler.com/flawfinder.   You  should  also  see  the  Secure
       Programming HOWTO at https://dwheeler.com/secure-programs.

AUTHOR

       David A. Wheeler (dwheeler@dwheeler.com).