[cfe-dev] Is valid optimization: dropping new[]

Dmitri Shubin sbn at tbricks.com
Tue Feb 5 22:58:14 PST 2013


Hello!

While trying to build ACE framework [1]  using clang 3.2 with -O2 
optimization I got configure script hang while checking if operator new 
[] throws std::bad_alloc exception (or just returns NULL).

$ cat a.cpp
#include <stdexcept>

int main()
{
     for (;;) {
         try {
             char *p = new char[1024];
             if (p == NULL) {
                 return 1; // bad
             }
         }
         catch (std::bad_alloc&) {
             return 0; // good
         }
     }
     return 0;
}

$ /opt/clang-clang/bin/clang++ -v -O2 a.cpp
clang version 3.2 (branches/release_32 174320) (llvm/branches/release_32 
174317)
Target: x86_64-unknown-linux-gnu
Thread model: posix
  "/opt/clang-clang/bin/clang" -cc1 -triple x86_64-unknown-linux-gnu 
-emit-obj -disable-free -disable-llvm-verifier -main-file-name a.cpp 
-mrelocation-model static -fmath-errno -masm-verbose 
-mconstructor-aliases -munwind-tables -target-cpu x86-64 
-target-linker-version 2.17.50.0.6 -momit-leaf-frame-pointer -v 
-resource-dir /opt/clang-clang/bin/../lib/clang/3.2 -fmodule-cache-path 
/var/tmp/clang-module-cache -internal-isystem 
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../../../include/c++/4.4.6 
-internal-isystem 
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux6E 
-internal-isystem 
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../../../include/c++/4.4.6/backward 
-internal-isystem /usr/local/include -internal-isystem 
/opt/clang-clang/bin/../lib/clang/3.2/include -internal-externc-isystem 
/include -internal-externc-isystem /usr/include -O2 -fdeprecated-macro 
-fdebug-compilation-dir /tb/builds/thd/sbn/2.6/src/share/package 
-ferror-limit 19 -fmessage-length 237 -mstackrealign -fobjc-runtime=gcc 
-fcxx-exceptions -fexceptions -fdiagnostics-show-option 
-fcolor-diagnostics -o /tmp/a-K2ND4b.o -x c++ a.cpp
clang -cc1 version 3.2 based upon LLVM 3.2svn default target 
x86_64-unknown-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
  /usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../../../include/c++/4.4.6
  /usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux6E
  /usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../../../include/c++/4.4.6/backward
  /usr/local/include
  /opt/clang-clang/bin/../lib/clang/3.2/include
  /usr/include
End of search list.
  "/usr/bin/ld" --hash-style=gnu --no-add-needed --eh-frame-hdr -m 
elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out 
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../../../lib64/crt1.o 
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../../../lib64/crti.o 
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/crtbegin.o 
-L/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6 
-L/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../../../lib64 
-L/lib/../lib64 -L/usr/lib/../lib64 
-L/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../.. -L/lib -L/usr/lib 
/tmp/a-K2ND4b.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc 
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/crtend.o 
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.6/../../../../lib64/crtn.o

$ objdump -d a.out | c++filt | grep -A 3 '<main>'
00000000004004c0 <main>:
   4004c0:       eb fe                   jmp    4004c0 <main>
   4004c2:       90                      nop
   4004c3:       90                      nop
   4004c4:       90                      nop

So it optimized it to infinite loop.
 From my point of view this is not valid since it removed function call 
(operator new()) that have side effects.
Or I'm missing something?

Thanks!

[1] http://www.cs.wustl.edu/~schmidt/ACE.html



More information about the cfe-dev mailing list