Saturday, August 6, 2011

Clang now builds Postgres without additional warnings

I'm happy to report that as of this evening, Clang builds PostgreSQL without any warnings, apart from a single remaining warning that also occurs when building with GCC, which is actually a bug in GNU Flex that the Flex developers don't seem to want to fix. On GCC 4.6, the warning looks like this:

In file included from gram.y:12962:0:
scan.c: In function ‘yy_try_NUL_trans’:
scan.c:16246:23: warning: unused variable ‘yyg’ [-Wunused-variable]

With Clang, however, it looks like this:

scan.c:16246:23: warning: unused variable 'yyg' [-Wunused-variable]
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
                      ^
Note that the "^" is directly underneath the offending variable "yyg" on the terminal emulator that generated this warning.


Note also that Clang usefully gives the context of the warning, and as a result a comment is displayed that suggests that the warning is spurious.

The Clang developers finally committed a fix to remove spurious warnings that occured when building Postgres as a result of it being statically detected that there are assignments past what appears to be the end of a single element array at the end of a struct. That doesn't happen now, although only under circumstances exactly consistent with the use of a popular idiom that is seen quite a bit in the Postgres code.

In working towards removing all Clang warnings, we detected a bug; we were assigning an enum constant from one enum to a variable that was actually another type of enum, which represented a potentially dangerous misuse of an abstraction that the Postgres code uses to represent nodes. This all occurred within a nested macro. Without Clang, it probably would have taken a long time for the problem to be noticed.

5 comments:

  1. Can clang build GCC by the way? And glibc?

    ReplyDelete
  2. @shevy: It can build gcc.

    It cannot build glibc just yet, e.g. because of http://llvm.org/bugs/show_bug.cgi?id=8703

    ReplyDelete
  3. Is by any chance the GCC built with CLANG any faster? or output binary is smaller?

    ReplyDelete
  4. From your link, it appears that a fix for that has been proposed. Does anybody know if glibc compiles after that fix is applied?

    ReplyDelete
  5. @Babak Farrokhi: No. GCC bootstraps itself, using an intermediary compiler, so there would be no speed difference, except possibly in building that intermediary compiler.

    ReplyDelete