I was recently testing Wine with the Clang static analyzer, which
found a few issues in wine's configure.ac:
http://source.winehq.org/git/wine.git/commitdiff/8521ebe79df39730ee62d518fde3751f45606061
there are a few more warnings, however, that come from autoconf itself:
austin@aw25 ~/wine-git $
~/src/llvm/tools/clang/tools/scan-build/scan-build clang foo.c
scan-build: 'clang' executable not found in
'/home/austin/src/llvm/tools/clang/tools/scan-build/bin'.
scan-build: Using 'clang' from path: /usr/local/bin/clang
foo.c:31:5: warning: Dereference of undefined pointer value
*t++ = 0;
^
foo.c:22:22: warning: Both operands to '-' always have the same value
pcpcc = &g + (g ? g-g : 0);
~^~
foo.c:22:14: warning: The right operand to '+' is always 0
pcpcc = &g + (g ? g-g : 0);
^ ~~~~~~~~~~~~~
foo.c:26:3: warning: Value stored to 'pcpcc' is never read
pcpcc = (char const *const *) ppc;
^ ~~~~~~~~~~~~~~~~~~~~~~~~~
4 warnings generated.
scan-build: 4 bugs found.
scan-build: Run 'scan-view /tmp/scan-build-2011-06-14-3' to examine bug reports.
foo.c is attached, which is just that configure test in a standalone c file.
--
-Austin
#include <stdio.h>
int
main ()
{
/* FIXME: Include the comments suggested by Paul. */
#ifndef __cplusplus
/* Ultrix mips cc rejects this. */
typedef int charset[2];
const charset cs;
/* SunOS 4.1.1 cc rejects this. */
char const *const *pcpcc;
char **ppc;
/* NEC SVR4.0.2 mips cc rejects this. */
struct point {int x, y;};
static struct point const zero = {0,0};
/* AIX XL C 1.02.0.0 rejects this.
It does not let you subtract one const X* pointer from another in
an arm of an if-expression whose if-part is not a constant
expression */
const char *g = "string";
pcpcc = &g + (g ? g-g : 0);
/* HPUX 7.0 cc rejects these. */
++pcpcc;
ppc = (char**) pcpcc;
pcpcc = (char const *const *) ppc;
{ /* SCO 3.2v4 cc rejects this. */
char *t;
char const *s = 0 ? (char *) 0 : (char const *) 0;
*t++ = 0;
if (s) return 0;
}
{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
int x[] = {25, 17};
const int *foo = &x[0];
++foo;
}
{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
typedef const int *iptr;
iptr p = 0;
++p;
}
{ /* AIX XL C 1.02.0.0 rejects this saying
"k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
struct s { int j; const int *ap[3]; };
struct s *b; b->j = 5;
}
{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
const int foo = 10;
if (!foo) return 0;
}
return !cs[0] && !zero.x;
#endif
;
return 0;
}