Package: clang-3.4 Hello,
We had an odd problem in our CI servers, where some builds would mysteriously make a bunch of files read-only. After some wrangling, I managed to track this down to the create mode being set to 0 when it shouldn't be. We have a function which wraps the system's open(2) for portability and convenience, which needs to check if the flags include O_CREAT which means that it should grab a third argument, to pass the file create mode along. We found that on release mode (which passes -O3 to clang, though it seems that any optimisation mode triggers this bug), the check for the 'if' is skipped. Looking at the disassembly, it looks like the code for inside the if-block is there, but the actual check for the flag is skipped. There is an issue on [1] with a description of what I found in the context of trying to debug this in the project, but I have managed to reduce it to a much simpler example, at the end of this message. If you compile with `clang -O3 main.c` and run the code, you'll see that it prints a mode of 0. Compiling without any optimisation options returns the correct result. This does not happen with clang-3.5 installed. I've also been unable to reproduce this with a clang 3.4 built from svn (from the release tag). [1] https://github.com/libgit2/libgit2/pull/2321#issuecomment-42039673 ----8<----8<---- #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdarg.h> int p_open(const char *path, int flags, ...) { mode_t mode = 0; if (flags & O_CREAT) { va_list arg_list; va_start(arg_list, flags); mode = (mode_t)va_arg(arg_list, int); va_end(arg_list); } return mode; } int main(int argc, char **argv) { int mode; mode = p_open("foo", O_CREAT, 0666); printf("mode %4o\n", mode); return 0; } -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected]

