123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #!/bin/bash -ex
- [ -n "$WORKSPACE" ]
- [ -n "$MOZ_OBJDIR" ]
- [ -n "$GECKO_DIR" ]
- HAZARD_SHELL_OBJDIR=$WORKSPACE/obj-haz-shell
- JS_SRCDIR=$GECKO_DIR/js/src
- ANALYSIS_SRCDIR=$JS_SRCDIR/devtools/rootAnalysis
- export CC="$TOOLTOOL_DIR/gcc/bin/gcc"
- export CXX="$TOOLTOOL_DIR/gcc/bin/g++"
- PYTHON=python2.7
- if ! which $PYTHON; then
- PYTHON=python
- fi
- function check_commit_msg () {
- ( set +e;
- if [[ -n "$AUTOMATION" ]]; then
- hg --cwd "$GECKO_DIR" log -r. --template '{desc}\n' | grep -F -q -- "$1"
- else
- echo -- "$SCRIPT_FLAGS" | grep -F -q -- "$1"
- fi
- )
- }
- if check_commit_msg "--dep"; then
- HAZ_DEP=1
- fi
- function build_js_shell () {
- # Must unset MOZ_OBJDIR and MOZCONFIG here to prevent the build system from
- # inferring that the analysis output directory is the current objdir. We
- # need a separate objdir here to build the opt JS shell to use to run the
- # analysis.
- (
- unset MOZ_OBJDIR
- unset MOZCONFIG
- ( cd $JS_SRCDIR; autoconf-2.13 )
- if [[ -z "$HAZ_DEP" ]]; then
- [ -d $HAZARD_SHELL_OBJDIR ] && rm -rf $HAZARD_SHELL_OBJDIR
- fi
- mkdir -p $HAZARD_SHELL_OBJDIR || true
- cd $HAZARD_SHELL_OBJDIR
- $JS_SRCDIR/configure --enable-optimize --disable-debug --enable-ctypes --enable-nspr-build --without-intl-api --with-ccache
- make -j4
- ) # Restore MOZ_OBJDIR and MOZCONFIG
- }
- function configure_analysis () {
- local analysis_dir
- analysis_dir="$1"
- if [[ -z "$HAZ_DEP" ]]; then
- [ -d "$analysis_dir" ] && rm -rf "$analysis_dir"
- fi
- mkdir -p "$analysis_dir" || true
- (
- cd "$analysis_dir"
- cat > defaults.py <<EOF
- js = "$HAZARD_SHELL_OBJDIR/dist/bin/js"
- analysis_scriptdir = "$ANALYSIS_SRCDIR"
- objdir = "$MOZ_OBJDIR"
- source = "$GECKO_DIR"
- sixgill = "$TOOLTOOL_DIR/sixgill/usr/libexec/sixgill"
- sixgill_bin = "$TOOLTOOL_DIR/sixgill/usr/bin"
- EOF
- cat > run-analysis.sh <<EOF
- #!/bin/sh
- if [ \$# -eq 0 ]; then
- set gcTypes
- fi
- export ANALYSIS_SCRIPTDIR="$ANALYSIS_SRCDIR"
- exec "$ANALYSIS_SRCDIR/analyze.py" "\$@"
- EOF
- chmod +x run-analysis.sh
- )
- }
- function run_analysis () {
- local analysis_dir
- analysis_dir="$1"
- local build_type
- build_type="$2"
- if [[ -z "$HAZ_DEP" ]]; then
- [ -d $MOZ_OBJDIR ] && rm -rf $MOZ_OBJDIR
- fi
- (
- cd "$analysis_dir"
- $PYTHON "$ANALYSIS_SRCDIR/analyze.py" --buildcommand="$GECKO_DIR/testing/mozharness/scripts/spidermonkey/build.${build_type}"
- )
- }
- function grab_artifacts () {
- local analysis_dir
- analysis_dir="$1"
- local artifacts
- artifacts="$2"
- (
- cd "$analysis_dir"
- ls -lah
- # Do not error out if no files found
- shopt -s nullglob
- set +e
- for f in *.txt *.lst; do
- gzip -9 -c "$f" > "${artifacts}/$f.gz"
- done
- # Check whether the user requested .xdb file upload in the top commit comment
- if check_commit_msg "--upload-xdbs"; then
- HAZ_UPLOAD_XDBS=1
- fi
- if [ -n "$HAZ_UPLOAD_XDBS" ]; then
- for f in *.xdb; do
- bzip2 -c "$f" > "${artifacts}/$f.bz2"
- done
- fi
- )
- }
- function check_hazards () {
- (
- set +e
- NUM_HAZARDS=$(grep -c 'Function.*has unrooted.*live across GC call' "$1"/rootingHazards.txt)
- NUM_UNSAFE=$(grep -c '^Function.*takes unsafe address of unrooted' "$1"/refs.txt)
- NUM_UNNECESSARY=$(grep -c '^Function.* has unnecessary root' "$1"/unnecessary.txt)
- set +x
- echo "TinderboxPrint: rooting hazards<br/>$NUM_HAZARDS"
- echo "TinderboxPrint: unsafe references to unrooted GC pointers<br/>$NUM_UNSAFE"
- echo "TinderboxPrint: unnecessary roots<br/>$NUM_UNNECESSARY"
- if [ $NUM_HAZARDS -gt 0 ]; then
- echo "TEST-UNEXPECTED-FAIL $NUM_HAZARDS hazards detected" >&2
- echo "TinderboxPrint: documentation<br/><a href='https://wiki.mozilla.org/Javascript:Hazard_Builds'>static rooting hazard analysis failures</a>, visit \"Inspect Task\" link for hazard details"
- exit 1
- fi
- )
- }
|