Hi Richard, Thanks for your feedback. Let's take each issue one at a time.
0) Bison version You're right, grammar was modified to use some features that aren't present in older versions of Bison. This helps avoid ugly hacks that were previously present in code in order to use multiple Bison generated parsers in the same application. As I see it, now that make dist works (and that means that the tarball includes all generated files, including autotools ones or flex/bison ones), once the issue of distributing tarballs is solved, a regular user should have no problem (they wouldn't even need to have autotools, flex or bison installed); the only ones constrained to have those tools (and use newer versions) would be those that would want to hack the templates for those generated files. Of course, this is theoretical, until there is a tarball release - I'm still trying to figure out a way to host this somewhere where I could also release tarballs (and maybe have some decent bug-tracker). 1) Compiler warnings I know of those warnings , I've inspected them and they're not troublesome, though you're correct, it would be better if they were addressed. I've tried to reduce compiler (and as a matter of fact even linters, such as clang static analyzer, clang tidy, cppcheck, sun/oracle lint) warnings (comparison with the upstream version shows a decrease in the number of compiler warnings). 2) test failure for system header sys/types.h At a glance, I don't understand what that test checks for, and repository history doesn't help much. I might have a hunch about what goes wrong there. But I want to tell you I don't have access to any OSX machine, so I can't help, only give you some tips on how to investigate what goes wrong. First, something I did (my changes). You might know that C grammar has an ambiguity problem, where A * B; might be interpreted as an multiplication expression or a declaration of variable B of type A. This makes the grammar non LALR(1), requiring special handling by LALR(1) generated parser (as is the Bison parser). Basically, to do this, parser keeps a storage of all types and identifiers it has seen, and on each identifier from scanner, interrogates that storage to detect usage of previously declared type, of a previously know identifier or it is a new identifier. Splint's C grammar is no different, did this correctly. Yet, sometimes during development, it was decided that in order to support some undeclared system reserved symbols (those starting with __) that might be either types or identifiers, the mechanism for discriminating between types and identifiers should be crippled. This crippling exploded the number of reduce/reduce conflicts. I've decided this has to stop, removing the crippling that allowed unknown (system reserved) identifiers to be parsed -- the correct solution seem to have such symbols properly defined (either at compile or run time). So this might be the reason why you might see failures where previously there weren't -- Splint previously used to treat those specially, and sometimes not in the correct way, but allowed parsing of unknown identifiers of a special form. What I can say to support my decision is that previously Splint's C grammar had 123 reduce/reduce conflicts, while now it has 17 (mainly due to macro & error handling) while also supporting more syntax (as variable declaration inside for initialization) and hopefully with less bugs. This might explain why you're seeing a parse error. The problem might be surprising for you because you assume some definition is already read from a previously included header. I suspect the problem is caused by the fact that header isn't actually included. Splint has a somewhat surprisingly behaviour, meaning that by default, unless is a blocker (as in a parsing error), all errors in system headers are ignored and not reported, thus you might not see any complaint about failing to find/include a system header. This is what I suspect happens. To test that indeed this is the problem, run $(SPLINT) -nof -hints -booltype "bool" utype.c (the equivalent of the test) and look for the parsing error. Assuming that it still exists, now run $(SPLINT) -nof -hints -booltype "bool" utype.c -keep which does the same thing, but additionally instructs Splint to keep temporary preprocessed files (the name of the file will be printed). Now look into the temporary (preprocessed) file, and look for the missing definition ("__int64_t" in this case). If it's not there, either the file it declared it wasn't included (preprocessor line comments should help you find if that file was indeed included), or you've found (yet another) bug. Now, if the file wasn't included, most likely it is in a folder that Splint doesn't know of (and thus doesn't look into). Using -sysdirs flag to change the default include path should be a temporary fix, once you know your system's correct list of include paths, should reconfigure/recompile Splint to make the solution permanent. Alternatively, if the header containing the definition is included, I'll need your assistance in tracking such a bug (as I said, no OSX). 3) the *_unlocked I/O functions. This behaviour didn't change in comparison with the previous version. The problem is that those missing functions are declared, but in the UNIX library, not the POSIX one. Thus doing your check with +unixlib should be a temporary fix. You're correct, this should be fixed. As I said in the announcement, my next important target for these patches would be to correct and expand standard (C99) and POSIX library support. So this is work in progress -- but I logged your bug, it will be fixed soon. In relation to you making clean and then rebuilding the libraries but still failing to see the changed behaviour, Splint doesn't read the library from the build directory (unless instructed to do so using LARCH_PATH), by default it reads from its installation directory. Thus, if you make further changes to the library that you want to test, either change LARCH_PATH environment variable to the path used for building, or actually install the new libraries (make -C lib/ install) 4) (void)0 & -noeffect I don't understand what doesn't work. Please provide a small sample for me. Regards, Mihail. _______________________________________________ splint-discuss mailing list splint-discuss@mail.cs.virginia.edu http://www.cs.virginia.edu/mailman/listinfo/splint-discuss