| # /bin/bash |
| |
| #---------------------------------------------------------------------------- |
| # We must avoid using the vanilla new/new[] operators (and consequently, the |
| # vanilla delete/delete[] operators) in SpiderMonkey, see bug 624878 for why. |
| # |
| # This script: |
| # - Detects if any of the vanilla new/new[] operators are used in a file. |
| # Its exit code is 1 if it found some, and 0 if it didn't. |
| # - Doesn't detect delete/delete[] because it appears they can be present |
| # somehow due to virtual destructors, but this is ok because vanilla |
| # delete/delete[] calls don't make sense without corresponding new/new[] |
| # calls, and any explicit calls will be caught by Valgrind's mismatched |
| # alloc/free checking. |
| # - Doesn't detect the 'nothrow' variants, which are ok but probably still |
| # best avoided. |
| # - Is designed to only run on Linux (though it may also work on Mac); one |
| # platform will be enough to catch any violations. |
| # |
| # If this script fails: |
| # - You need to find the uses of vanilla new/delete and replace them with |
| # {js::OffTheBooks,JSContext,JSRuntime}::{new_,/array_new}. |
| # - Run this script on each of the .o files, that should narrow it down. |
| # - After that, one way to find them is to run 'objdump -r -C' on the |
| # relevant .o files. For example, you might search for 'operator new' and |
| # find a record like this: |
| # |
| # RELOCATION RECORDS FOR [.text._ZN3JSC14ExecutablePool6createEj]: |
| # OFFSET TYPE VALUE |
| # 00000009 R_386_PC32 __i686.get_pc_thunk.bx |
| # 0000000f R_386_GOTPC _GLOBAL_OFFSET_TABLE_ |
| # 0000001b R_386_PLT32 operator new(unsigned int) |
| # 0000002e R_386_PC32 JSC::ExecutablePool::ExecutablePool(unsigned int) |
| # 0000004a R_386_PC32 JSC::ExecutablePool::~ExecutablePool() |
| # 00000052 R_386_PLT32 operator delete(void*) |
| # |
| # This says that vanilla 'new' and 'delete' are both used in |
| # JSC::ExecutablePool::create(unsigned int). This doesn't always work, |
| # though. (Nb: use 'c++filt' to demangle names like |
| # _ZN3JSC14ExecutablePool6createEj.) |
| # |
| # If that doesn't work, use grep. |
| #---------------------------------------------------------------------------- |
| |
| if [ -z $1 ] ; then |
| echo "usage: find_vanilla_new_calls <file>" |
| exit 1 |
| fi |
| |
| file=$1 |
| |
| if [ ! -f $file ] ; then |
| echo "TEST-UNEXPECTED-FAIL | find_vanilla_new_calls | file '$file' not found" |
| exit 1 |
| fi |
| |
| tmpfile1=`mktemp` |
| tmpfile2=`mktemp` |
| nm -C $file > $tmpfile1 |
| |
| # Need to double-escape '[' and ']' to stop grep from interpreting them |
| # specially. |
| grep '^operator new(unsigned int)' $tmpfile1 >> $tmpfile2 |
| grep '^operator new(unsigned long)' $tmpfile1 >> $tmpfile2 |
| grep '^operator new\\[\\](unsigned int)' $tmpfile1 >> $tmpfile2 |
| grep '^operator new\\[\\](unsigned long)' $tmpfile1 >> $tmpfile2 |
| rm -f $tmpfile1 |
| |
| if [ -s $tmpfile2 ] ; then |
| echo "TEST-UNEXPECTED-FAIL | find_vanilla_new_calls | found calls are listed below" |
| cat $tmpfile2 |
| echo |
| rm -f $tmpfile2 |
| exit 1 |
| fi |
| |
| echo "TEST-PASS | find_vanilla_new_calls | ok" |
| echo |
| |
| exit 0 |