Re: multiple source files [was four sparse patches]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> > I've attached four patches that I've written for sparse to use it
> > for a userland project.
>
>  Regarding incomplete structs, your patch seems reasonable as far as
>  I know, and it doesn't break the test suite, so I've applied and
>  pushed it.  Per your concerns, if this patch doesn't represent the
>  correct fix, the code can change later when we have a test case
>  that breaks with this patch.  Please do consider writing a patch
>  for a new test case based on your example.

OK - I sat down to write a test case and had trouble reproducing
because it turns out that the problem has a different cause.
Take three files:

/* test.h */
typedef struct foo *Foo;

void a (Foo foo);
void b (Foo foo);


/* test1.c */
#include "test.h"
void a (Foo foo) { }


/* test2.c */
#include "test.h"
void b (Foo foo) { }


With sparse 0.4.1:

$ sparse test1.c
$ sparse test2.c
$ sparse test[12].c
test2.c:3:6: error: symbol 'b' redeclared with different type
(originally declared at test.h:4) - incompatible argument 1 (different
base types)

...i.e. the problem only occurs with multiple source files on the
sparse command line. (The userland project mentioned above has a build
system that invokes the compiler once, passing all necessary source
files, because it also builds on Windows, where process creation is
remarkably slow so invoking cl.exe once per source file is prohibitive).

I think that the problem may be rooted in main():
  // Expand, linearize and show it.
  check_symbols(sparse_initialize(argc, argv, &filelist));
  FOR_EACH_PTR_NOTAG(filelist, file) {
    check_symbols(sparse(file));
  } END_FOR_EACH_PTR_NOTAG(file);

i.e. sparse doesn't reinitialize for each source file.

My patch a few weeks ago silences the error, but in the light of this
I think that it's working around rather than fixing the problem. The
"correct" fix would seem to be to re-initialise sparse for each source
file. However, sparse's data structures weren't written with this in
mind, so a patch would be rather invasive. It might be simpler to say
that sparse must only be invoked on one source file and to modify cgcc
instead?
--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux