getting a handle on build warnings
Jonathan Gibbons
Jonathan.Gibbons at Sun.COM
Thu Jul 10 16:14:44 UTC 2008
The JDK build generates a whole lot of warnings along the way. This is
bad because these warnings can sometimes mask real errors. For a
variety of reasons, it appears to be hard to try and get rid of all the
warnings, so this message is about a set of possible ideas to try and
get some control over the problem, by providing a relatively general
framework to use within the build, to minimize the introduction of new
warnings, and by providing a reporting framework for those developers
that *are* interested in reducing the warnings in their code.
1. Collecting warnings.
The simplest, easiest way to collect the warnings is to save the output from
a build, for subsequent processing by any new tools we provide.
David Herron has also suggested we could prefix the build macros for
selected commands like cc, javac, javadoc etc such that the output from
each invocation of the command is appended to a log, perhaps a directory
specific log. For example, the macro to invoke javac could instead invoke
savelog -a $(pwd)/javac.log javac ...
where savelog is a new command to run a subcommand and save its output.
Whichever way we go, the first step in getting a handle on warnings would
be to save the output from the commands generating the warnings.
2. Analyzing and normalizing warnings.
Warnings can be divided into two groups:
- those we know how to and want to deal with, and
- those we don't.
Ignore the latter group for now. Perhaps in time we'll figure out how to
deal
with them and become interested in dealing with them.
We can select the warnings in the first group with grep or regular
expressions.
Then we want to normalize the warnings.
Normalizing a warning consists of a number of steps:
- remove any information specific to that instance of the build.
Typically, this will mean the head of any user-specific paths, such
as absolute
paths on the build machine.
- remove any information that may not be inherent to the warning
Typically, this will mean line numbers in the build. Someone could
edit the
text in the source file ahead of the warning, and change the line number
used in the warning. This should not change the normalized form of the
warning
- adjust the location of the warning to be relative to one of the standard
"subroots" within the tree, such as "src/share/classes",
"src/PLATFORM/classes", etc. In addition, standardize file separators
in the location of the warning.
At the end of the normalization, warnings should all begin with a location,
such as the following made up examples,
java/lang/String.java: warning: unchecked type
com/sun/tools/javac/Main.java: warning: using deprecated method
Sorting the overall set of warnings would be good too.
3. Reporting and further analysis
If Release Engineering could produce a normalized list of warnings for
each promoted build, it would be possible for a developer to compare
the results of any new build against the "official" set of currently known
warnings, to see if any new warnings have been introduced.
PIT testing could verify that no new warnings have been introduced,
and possibly give waivers for any justifiable new warnings.
The "official" set of currently known warnings could be posted on OpenJDK,
so that OpenJDK developers outside of Sun could compare their results
to the published results.
Developers could put "assertions" into the build to assert that portions
of the code are warning-free. -Werror achieves that to a limited extent
but doesn't work on tools like javadoc, which processes large amounts
of code which may not all be warning-free.
From the normalized list of warnings, it would be possible a summary
table, grouped by package, and sorted either alphabetically or by
quantity. This way, we could see where are the worst offending source
files, and perhaps use that as motivation for fixing warnings.
Summary
Dealing with warnings has proven almost impossibly difficult over the
years. The ideas presented here make it simpler to deal with the
problems by identifying warnings that we know how to fix, in areas where
we are interested in fixing them. In addition, it provides a way we can
ensure that the situation doesn't get any worse, going forward.
-- Jon
More information about the build-dev
mailing list