Print this page
    
11972 resync smatch
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/tools/smatch/src/sparse.1
          +++ new/usr/src/tools/smatch/src/sparse.1
   1    1  .\" Sparse manpage by Josh Triplett
   2    2  .TH sparse "1"
   3    3  .
   4    4  .SH NAME
   5    5  sparse \- Semantic Parser for C
   6    6  .
   7    7  .SH SYNOPSIS
   8    8  .B sparse
   9    9  [\fIWARNING OPTIONS\fR]... \fIfile.c\fR
  10   10  .
  11   11  .SH DESCRIPTION
  12   12  Sparse parses C source and looks for errors, producing warnings on standard
  
    | 
      ↓ open down ↓ | 
    12 lines elided | 
    
      ↑ open up ↑ | 
  
  13   13  error.
  14   14  .P
  15   15  Sparse accepts options controlling the set of warnings to generate.  To turn
  16   16  on warnings Sparse does not issue by default, use the corresponding warning
  17   17  option \fB\-Wsomething\fR.  Sparse issues some warnings by default; to turn
  18   18  off those warnings, pass the negation of the associated warning option,
  19   19  \fB\-Wno\-something\fR.
  20   20  .
  21   21  .SH WARNING OPTIONS
  22   22  .TP
       23 +.B \-fmax-warnings=COUNT
       24 +Set the maximum number of displayed warnings to COUNT, which should be
       25 +a numerical value or 'unlimited'.
       26 +The default limit is 100.
       27 +.
       28 +.TP
  23   29  .B \-Wsparse\-all
  24   30  Turn on all sparse warnings, except for those explicitly disabled via
  25   31  \fB\-Wno\-something\fR.
  26   32  .TP
  27   33  .B \-Wsparse\-error
  28   34  Turn all sparse warnings into errors.
  29   35  .TP
  30   36  .B \-Waddress\-space
  31   37  Warn about code which mixes pointers to different address spaces.
  32   38  
  33   39  Sparse allows an extended attribute
  34      -.BI __attribute__((address_space( num )))
  35      -on pointers, which designates a pointer target in address space \fInum\fR (a
  36      -constant integer).  With \fB\-Waddress\-space\fR, Sparse treats pointers with
  37      -identical target types but different address spaces as distinct types.  To
  38      -override this warning, such as for functions which convert pointers between
  39      -address spaces, use a type that includes \fB__attribute__((force))\fR.
       40 +.BI __attribute__((address_space( id )))
       41 +on pointers, which designates a pointer target in address space \fIid\fR (an
       42 +identifier or a constant integer).
       43 +With \fB\-Waddress\-space\fR, Sparse treats pointers with
       44 +identical target types but different address spaces as distinct types and
       45 +will warn accordingly.
  40   46  
       47 +Sparse will also warn on casts which remove the address space (casts to an
       48 +integer type or to a plain pointer type). An exception to this is when the
       49 +destination type is \fBuintptr_t\fR (or \fBunsigned long\fR) since such casts
       50 +are often used to "get a pointer value representation in an integer type" and
       51 +such values are independent of the address space.
       52 +
       53 +To override these warnings, use a type that includes \fB__attribute__((force))\fR.
       54 +
  41   55  Sparse issues these warnings by default.  To turn them off, use
  42   56  \fB\-Wno\-address\-space\fR.
  43   57  .
  44   58  .TP
  45   59  .B \-Wbitwise
  46   60  Warn about unsupported operations or type mismatches with restricted integer
  47   61  types.
  48   62  
  49   63  Sparse supports an extended attribute, \fB__attribute__((bitwise))\fR, which
  50   64  creates a new restricted integer type from a base integer type, distinct from
  51   65  the base integer type and from any other restricted integer type not declared
  52   66  in the same declaration or \fBtypedef\fR.  For example, this allows programs
  53   67  to create \fBtypedef\fRs for integer types with specific endianness.  With
  54   68  \fB-Wbitwise\fR, Sparse will warn on any use of a restricted type in
  55   69  arithmetic operations other than bitwise operations, and on any conversion of
  56   70  one restricted type into another, except via a cast that includes
  57   71  \fB__attribute__((force))\fR.
  58   72  
  59   73  __bitwise ends up being a "stronger integer separation", one that
  60   74  doesn't allow you to mix with non-bitwise integers, so now it's much
  61   75  harder to lose the type by mistake.
  62   76  
  63   77  __bitwise is for *unique types* that cannot be mixed with other
  
    | 
      ↓ open down ↓ | 
    13 lines elided | 
    
      ↑ open up ↑ | 
  
  64   78  types, and that you'd never want to just use as a random integer (the
  65   79  integer 0 is special, though, and gets silently accepted iirc - it's
  66   80  kind of like "NULL" for pointers). So "gfp_t" or the "safe endianness"
  67   81  types would be __bitwise: you can only operate on them by doing
  68   82  specific operations that know about *that* particular type.
  69   83  
  70   84  Sparse issues these warnings by default.  To turn them off, use
  71   85  \fB\-Wno\-bitwise\fR.
  72   86  .
  73   87  .TP
       88 +.B \-Wbitwise\-pointer
       89 +Same as \fB\-Wbitwise\fR but for casts to or from pointers to bitwise types.
       90 +
       91 +Sparse does not issue these warnings by default.
       92 +.
       93 +.TP
       94 +.B \-Wcast\-from\-as
       95 +Warn about casts which remove an address space from a pointer type.
       96 +
       97 +This is similar to \fB\-Waddress\-space\fR but will also warn
       98 +on casts to \fBunsigned long\fR.
       99 +
      100 +Sparse does not issues these warnings by default.
      101 +.
      102 +.TP
  74  103  .B \-Wcast\-to\-as
  75  104  Warn about casts which add an address space to a pointer type.
  76  105  
  77  106  A cast that includes \fB__attribute__((force))\fR will suppress this warning.
      107 +No warning is generated if the original type is \fBuintptr_t\fR
      108 +(or \fBunsigned long\fR).
  78  109  
  79  110  Sparse does not issue these warnings by default.
  80  111  .
  81  112  .TP
  82  113  .B \-Wcast\-truncate
  83  114  Warn about casts that truncate constant values.
  84  115  
  85  116  Sparse issues these warnings by default.  To turn them off, use
  86  117  \fB\-Wno\-cast\-truncate\fR.
  87  118  .
  88  119  .TP
  89  120  .B \-Wconstant\-suffix
  90  121  Warn if an integer constant is larger than the maximum representable value
  91  122  of the type indicated by its type suffix (if any). For example, on a
  92  123  system where ints are 32-bit and longs 64-bit, the constant \fB0x100000000U\fR
  93  124  is larger than can be represented by an \fBunsigned int\fR but fits in an
  94  125  \fBunsigned long\fR. So its type is \fBunsigned long\fR but this is not
  95  126  indicated by its suffix. In this case, the warning could be suppressed by
  96  127  using the suffix \fBUL\fR: \fB0x100000000UL\fR.
  97  128  
  98  129  Sparse does not issue these warnings by default.
  99  130  .
 100  131  .TP
 101  132  .B \-Wconstexpr-not-const
 102  133  Warn if a non-constant expression is encountered when really expecting a
 103  134  constant expression instead.
 104  135  Currently, this warns when initializing an object of static storage duration
 105  136  with an initializer which is not a constant expression.
 106  137  
 107  138  Sparse does not issue these warnings by default.
 108  139  .
 109  140  .TP
 110  141  .B \-Wcontext
 111  142  Warn about potential errors in synchronization or other delimited contexts.
 112  143  
 113  144  Sparse supports several means of designating functions or statements that
 114  145  delimit contexts, such as synchronization.  Functions with the extended
 115  146  attribute
 116  147  .BI __attribute__((context( expression , in_context , out_context ))
 117  148  require the context \fIexpression\fR (for instance, a lock) to have the value
 118  149  \fIin_context\fR (a constant nonnegative integer) when called, and return with
 119  150  the value \fIout_context\fR (a constant nonnegative integer).  For APIs
 120  151  defined via macros, use the statement form
 121  152  .BI __context__( expression , in_value , out_value )
 122  153  in the body of the macro.
 123  154  
 124  155  With \fB-Wcontext\fR Sparse will warn when it sees a function change the
 125  156  context without indicating this with a \fBcontext\fR attribute, either by
 126  157  decreasing a context below zero (such as by releasing a lock without acquiring
 127  158  it), or returning with a changed context (such as by acquiring a lock without
 128  159  releasing it).  Sparse will also warn about blocks of code which may
 129  160  potentially execute with different contexts.
 130  161  
 131  162  Sparse issues these warnings by default.  To turn them off, use
 132  163  \fB\-Wno\-context\fR.
 133  164  .
 134  165  .TP
 135  166  .B \-Wdecl
 136  167  Warn about any non-\fBstatic\fR variable or function definition that has no
 137  168  previous declaration.
 138  169  
 139  170  Private symbols (functions and variables) internal to a given source file
 140  171  should use \fBstatic\fR, to allow additional compiler optimizations, allow
 141  172  detection of unused symbols, and prevent other code from relying on these
 142  173  internal symbols.  Public symbols used by other source files will need
 143  174  declarations visible to those other source files, such as in a header file.
 144  175  All declarations should fall into one of these two categories.  Thus, with
 145  176  \fB-Wdecl\fR, Sparse warns about any symbol definition with neither
 146  177  \fBstatic\fR nor a declaration.  To fix this warning, declare private symbols
 147  178  \fBstatic\fR, and ensure that the files defining public symbols have the
 148  179  symbol declarations available first (such as by including the appropriate
 149  180  header file).
 150  181  
 151  182  Sparse issues these warnings by default.  To turn them off, use
 152  183  \fB\-Wno\-decl\fR.
 153  184  .
 154  185  .TP
 155  186  .B \-Wdeclaration-after-statement
 156  187  Warn about declarations that are not at the start of a block.
 157  188  
 158  189  These declarations are permitted in C99 but not in C89.
 159  190  
 160  191  Sparse issues these warnings by default only when the C dialect is
 161  192  C89 (i.e. -ansi or -std=c89).  To turn them off, use
 162  193  \fB\-Wno\-declaration\-after\-statement\fR.
 163  194  .
 164  195  .TP
 165  196  .B \-Wdefault\-bitfield\-sign
 166  197  Warn about any bitfield with no explicit signedness.
 167  198  
 168  199  Bitfields have no standard-specified default signedness. (C99 6.7.2) A
 169  200  bitfield without an explicit \fBsigned\fR or \fBunsigned\fR creates a
 170  201  portability problem for software that relies on the available range of values.
 171  202  To fix this, specify the bitfield type as \fBsigned\fR or \fBunsigned\fR
 172  203  explicitly.
 173  204  
 174  205  Sparse does not issue these warnings by default.
 175  206  .
 176  207  .TP
 177  208  .B \-Wdesignated\-init
 178  209  Warn about positional initialization of structs marked as requiring designated
 179  210  initializers.
 180  211  
 181  212  Sparse allows an attribute
 182  213  .BI __attribute__((designated_init))
 183  214  which marks a struct as requiring designated initializers.  Sparse will warn
 184  215  about positional initialization of a struct variable or struct literal of a
 185  216  type that has this attribute.
 186  217  
 187  218  Requiring designated initializers for a particular struct type will insulate
 188  219  code using that struct type from changes to the layout of the type, avoiding
 189  220  the need to change initializers for that type unless they initialize a removed
 190  221  or incompatibly changed field.
 191  222  
 192  223  Common examples of this type of struct include collections of function pointers
 193  224  for the implementations of a class of related operations, for which the default
 194  225  NULL for an unmentioned field in a designated initializer will correctly
 195  226  indicate the absence of that operation.
 196  227  
 197  228  Sparse issues these warnings by default.  To turn them off, use
 198  229  \fB\-Wno\-designated\-init\fR.
 199  230  .
 200  231  .TP
 201  232  .B \-Wdo\-while
 202  233  Warn about do-while loops that do not delimit the loop body with braces.
 203  234  
 204  235  Sparse does not issue these warnings by default.
 205  236  .
  
    | 
      ↓ open down ↓ | 
    118 lines elided | 
    
      ↑ open up ↑ | 
  
 206  237  .TP
 207  238  .B \-Wenum\-mismatch
 208  239  Warn about the use of an expression of an incorrect \fBenum\fR type when
 209  240  initializing another \fBenum\fR type, assigning to another \fBenum\fR type, or
 210  241  passing an argument to a function which expects another \fBenum\fR type.
 211  242  
 212  243  Sparse issues these warnings by default.  To turn them off, use
 213  244  \fB\-Wno\-enum\-mismatch\fR.
 214  245  .
 215  246  .TP
 216      -.B \-Wempty\-character\-constant
 217      -Warn about a constant such as ''.
 218      -
 219      -Sparse issues these warnings by default.  To turn them off, use
 220      -\fB\-Wno\-empty\-character\-constant\fR.
 221      -.
 222      -.TP
 223  247  .B \-Wexternal\-function\-has\-definition
 224  248  Warn about function definitions that are declared with external linkage.
 225  249  
 226  250  Sparse issues these warnings by default.  To turn them off, use
 227  251  \fB\-Wno\-external\-function\-has\-definition\fR.
 228  252  .
 229  253  .TP
 230  254  .B \-Winit\-cstring
 231  255  Warn about initialization of a char array with a too long constant C string.
 232  256  
 233  257  If the size of the char array and the length of the string are the same,
 234  258  there is no space for the last nul char of the string in the array:
 235  259  
 236  260  .nf
 237  261  char s[3] = "abc";
 238  262  .fi
 239  263  
 240  264  If the array is used as a byte array, not as C string, this
 241  265  warning is just noise. However, if the array is passed to functions
 242  266  dealing with C string like printf(%s) and strcmp, it may cause a
 243  267  trouble.
 244  268  
 245  269  Sparse does not issue these warnings by default.
 246  270  .
 247  271  .TP
 248  272  .B \-Wmemcpy\-max\-count
  
    | 
      ↓ open down ↓ | 
    16 lines elided | 
    
      ↑ open up ↑ | 
  
 249  273  Warn about call of \fBmemcpy()\fR, \fBmemset()\fR, \fBcopy_from_user()\fR, or
 250  274  \fBcopy_to_user()\fR with a large compile-time byte count.
 251  275  
 252  276  Sparse issues these warnings by default. To turn them off, use
 253  277  \fB\-Wno\-memcpy\-max\-count\fR.
 254  278  
 255  279  The limit can be changed with \fB\-fmemcpy\-max\-count=COUNT\fR,
 256  280  the default being \fB100000\fR.
 257  281  .
 258  282  .TP
 259      -.B \-Wnon\-ansi\-function\-declaration
 260      -Warn about non-ANSI function declarations.
 261      -
 262      -Sparse issues these warnings by default.  To turn them off, use
 263      -\fB\-Wno\-non\-ansi\-function\-declaration\fR.
 264      -.
 265      -.TP
 266  283  .B \-Wnon\-pointer\-null
 267  284  Warn about the use of 0 as a NULL pointer.
 268  285  
 269  286  0 has integer type.  NULL has pointer type.
 270  287  
 271  288  Sparse issues these warnings by default.  To turn them off, use
 272  289  \fB\-Wno\-non\-pointer\-null\fR.
 273  290  .
 274  291  .TP
 275  292  .B \-Wold\-initializer
 276  293  Warn about the use of the pre-C99 GCC syntax for designated initializers.
 277  294  
 278  295  C99 provides a standard syntax for designated fields in \fBstruct\fR or
 279  296  \fBunion\fR initializers:
 280  297  
 281  298  .nf
 282  299  struct structname var = { .field = value };
 283  300  .fi
 284  301  
 285  302  GCC also has an old, non-standard syntax for designated initializers which
 286  303  predates C99:
 287  304  
 288  305  .nf
 289  306  struct structname var = { field: value };
 290  307  .fi
 291  308  
 292  309  Sparse will warn about the use of GCC's non-standard syntax for designated
 293  310  initializers.  To fix this warning, convert designated initializers to use the
 294  311  standard C99 syntax.
 295  312  
 296  313  Sparse issues these warnings by default.  To turn them off, use
 297  314  \fB\-Wno\-old\-initializer\fR.
 298  315  .
 299  316  .TP
 300  317  .B \-Wone\-bit\-signed\-bitfield
 301  318  Warn about any one-bit \fBsigned\fR bitfields.
 302  319  
 303  320  A one-bit \fBsigned\fR bitfield can only have the values 0 and -1, or with
 304  321  some compilers only 0; this results in unexpected behavior for programs which
 305  322  expected the ability to store 0 and 1.
 306  323  
 307  324  Sparse issues these warnings by default.  To turn them off, use
 308  325  \fB\-Wno\-one\-bit\-signed\-bitfield\fR.
 309  326  .
 310  327  .TP
 311  328  .B \-Wparen\-string
 312  329  Warn about the use of a parenthesized string to initialize an array.
 313  330  
 314  331  Standard C syntax does not permit a parenthesized string as an array
 315  332  initializer.  GCC allows this syntax as an extension.  With
 316  333  \fB\-Wparen\-string\fR, Sparse will warn about this syntax.
 317  334  
 318  335  Sparse does not issue these warnings by default.
 319  336  .
 320  337  .TP
 321  338  .B \-Wpointer\-arith
 322  339  Warn about anything that depends on the \fBsizeof\fR a void or function type.
 323  340  
 324  341  C99 does not allow the \fBsizeof\fR operator to be applied to function types
 325  342  or to incomplete types such as void. GCC allows \fBsizeof\fR to be applied to
 326  343  these types as an extension and assigns these types a size of \fI1\fR. With
 327  344  \fB\-pointer\-arith\fR, Sparse will warn about pointer arithmetic on void
 328  345  or function pointers, as well as expressions which directly apply the
 329  346  \fBsizeof\fR operator to void or function types.
 330  347  
 331  348  Sparse does not issue these warnings by default.
 332  349  .
 333  350  .TP
 334  351  .B \-Wptr\-subtraction\-blows
 335  352  Warn when subtracting two pointers to a type with a non-power-of-two size.
 336  353  
 337  354  Subtracting two pointers to a given type gives a difference in terms of the
 338  355  number of items of that type.  To generate this value, compilers will usually
 339  356  need to divide the difference by the size of the type, an potentially
 340  357  expensive operation for sizes other than powers of two.
 341  358  
 342  359  Code written using pointer subtraction can often use another approach instead,
 343  360  such as array indexing with an explicit array index variable, which may allow
 344  361  compilers to generate more efficient code.
 345  362  
 346  363  Sparse does not issue these warnings by default.
 347  364  .
 348  365  .TP
 349  366  .B \-Wreturn\-void
 350  367  Warn if a function with return type void returns a void expression.
 351  368  
 352  369  C99 permits this, and in some cases this allows for more generic code in
 353  370  macros that use typeof or take a type as a macro argument.  However, some
 354  371  programs consider this poor style, and those programs can use
 355  372  \fB\-Wreturn\-void\fR to get warnings about it.
 356  373  
 357  374  Sparse does not issue these warnings by default.
 358  375  .
  
    | 
      ↓ open down ↓ | 
    83 lines elided | 
    
      ↑ open up ↑ | 
  
 359  376  .TP
 360  377  .B \-Wshadow
 361  378  Warn when declaring a symbol which shadows a declaration with the same name in
 362  379  an outer scope.
 363  380  
 364  381  Such declarations can lead to error-prone code.
 365  382  
 366  383  Sparse does not issue these warnings by default.
 367  384  .
 368  385  .TP
      386 +.B \-Wshift-count-negative
      387 +Warn if a shift count is negative.
      388 +
      389 +Sparse issues these warnings by default.
      390 +.
      391 +.TP
      392 +.B \-Wshift-count-overflow
      393 +Warn if a shift count is bigger than the operand's width.
      394 +
      395 +Sparse issues these warnings by default.
      396 +.
      397 +.TP
 369  398  .B \-Wsizeof-bool
 370  399  Warn when checking the sizeof a _Bool.
 371  400  
 372      -C99 does not specify the sizeof a _Bool.  gcc uses 1.
      401 +C99 does not specify the size of a _Bool. GCC, by default, uses \fI1\fR.
 373  402  
 374  403  Sparse does not issue these warnings by default.
 375  404  .
 376  405  .TP
 377  406  .B \-Wtransparent\-union
 378  407  Warn about any declaration using the GCC extension
 379  408  \fB__attribute__((transparent_union))\fR.
 380  409  
 381  410  Sparse issues these warnings by default.  To turn them off, use
 382  411  \fB\-Wno\-transparent\-union\fR.
 383  412  .
 384  413  .TP
 385  414  .B \-Wtypesign
 386  415  Warn when converting a pointer to an integer type into a pointer to an integer
 387  416  type with different signedness.
 388  417  
 389  418  Sparse does not issue these warnings by default.
 390  419  .
 391  420  .TP
 392  421  .B \-Wundef
 393  422  Warn about preprocessor conditionals that use the value of an undefined
 394  423  preprocessor symbol.
 395  424  
 396  425  Standard C (C99 6.10.1) permits using the value of an undefined preprocessor
 397  426  symbol in preprocessor conditionals, and specifies it has a value of 0.
 398  427  However, this behavior can lead to subtle errors.
 399  428  
 400  429  Sparse does not issue these warnings by default.
 401  430  .
 402  431  .SH MISC OPTIONS
 403  432  .TP
 404  433  .B \-gcc-base-dir \fIdir\fR
  
    | 
      ↓ open down ↓ | 
    22 lines elided | 
    
      ↑ open up ↑ | 
  
 405  434  Look for compiler-provided system headers in \fIdir\fR/include/ and \fIdir\fR/include-fixed/.
 406  435  .
 407  436  .TP
 408  437  .B \-multiarch-dir \fIdir\fR
 409  438  Look for system headers in the multiarch subdirectory \fIdir\fR.
 410  439  The \fIdir\fR name would normally take the form of the target's
 411  440  normalized GNU triplet. (e.g. i386-linux-gnu).
 412  441  .
 413  442  .SH DEBUG OPTIONS
 414  443  .TP
 415      -.B \-fdump-linearize[=only]
 416      -Dump the IR code of a function directly after its linearization,
 417      -before any simplifications are made. If the argument \fB=only\fR is
 418      -also given no further processing is done on the function.
 419      -.
 420  444  .B \-fmem-report
 421  445  Report some statistics about memory allocation used by the tool.
 422  446  .
 423  447  .SH OTHER OPTIONS
 424  448  .TP
      449 +.B \-fdiagnostic-prefix[=PREFIX]
      450 +Prefix all diagnostics by the given PREFIX, followed by ": ".
      451 +If no one is given "sparse" is used.
      452 +The default is to not use a prefix at all.
      453 +.
      454 +.TP
 425  455  .B \-fmemcpy-max-count=COUNT
 426  456  Set the limit for the warnings given by \fB-Wmemcpy-max-count\fR.
 427      -A COUNT of 0, useless in itself, will effectively disable the warning.
      457 +A COUNT of 'unlimited' or '0' will effectively disable the warning.
 428  458  The default limit is 100000.
 429  459  .
 430  460  .TP
 431  461  .B \-ftabstop=WIDTH
 432  462  Set the distance between tab stops.  This helps sparse report correct
 433  463  column numbers in warnings or errors.  If the value is less than 1 or
 434  464  greater than 100, the option is ignored.  The default is 8.
 435  465  .
      466 +.TP
      467 +.B \-f[no-]unsigned-char, \-f[no-]signed-char
      468 +Let plain 'char' be unsigned or signed.
      469 +By default chars are signed.
      470 +.
 436  471  .SH SEE ALSO
 437  472  .BR cgcc (1)
 438  473  .
 439  474  .SH HOMEPAGE
 440  475  http://www.kernel.org/pub/software/devel/sparse/
 441  476  .
 442  477  .SH MAILING LIST
 443  478  linux-sparse@vger.kernel.org
 444  479  .
 445      -.SH MAINTAINER
 446      -Christopher Li <sparse@chrisli.org>
      480 +.SH CONTRIBUTINGS AND REPORTING BUGS
      481 +Submission of patches and reporting of bugs, as well as discussions
      482 +related to Sparse, should be done via the mailing list (linux-sparse@vger.kernel.org)
      483 +where the development and maintenance is primarily done.
      484 +You do not have to be subscribed to the list to send a message there.
      485 +
      486 +Bugs can also be reported and tracked via the Linux kernel's bugzilla:
      487 +http://bugzilla.kernel.org/enter_bug.cgi?component=Sparse&product=Tools .
      488 +.
      489 +.SH AUTHORS
      490 +Sparse was started by Linus Torvalds.
      491 +The complete list of contributors can be find at
      492 +https://www.openhub.net/p/sparse/contributors .
      493 +
      494 +Luc Van Oostenryck is Sparse's current maintainer.
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX