#!/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 < run-analysis.sh < "${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) NUM_DROPPED=$(grep -c '^Dropped CFG' "$1"/build_xgill.log) NUM_WRITE_HAZARDS=$(perl -lne 'print $1 if m!found (\d+)/\d+ allowed errors!' "$1"/heapWriteHazards.txt) set +x echo "TinderboxPrint: rooting hazards
$NUM_HAZARDS" echo "TinderboxPrint: (unsafe references to unrooted GC pointers)
$NUM_UNSAFE" echo "TinderboxPrint: (unnecessary roots)
$NUM_UNNECESSARY" echo "TinderboxPrint: heap write hazards
$NUM_WRITE_HAZARDS" exit_status=0 if [ $NUM_HAZARDS -gt 0 ]; then echo "TEST-UNEXPECTED-FAIL $NUM_HAZARDS rooting hazards detected" >&2 echo "TinderboxPrint: documentation
static rooting hazard analysis failures, visit \"Inspect Task\" link for hazard details" exit_status=1 fi NUM_ALLOWED_WRITE_HAZARDS=0 if [ $NUM_WRITE_HAZARDS -gt $NUM_ALLOWED_WRITE_HAZARDS ]; then echo "TEST-UNEXPECTED-FAIL $NUM_WRITE_HAZARDS heap write hazards detected out of $NUM_ALLOWED_WRITE_HAZARDS allowed" >&2 echo "TinderboxPrint: documentation
heap write hazard analysis failures, visit \"Inspect Task\" link for hazard details" exit_status = 1 fi if [ $NUM_DROPPED -gt 0 ]; then echo "TEST-UNEXPECTED-FAIL $NUM_DROPPED CFGs dropped" >&2 echo "TinderboxPrint: sixgill unable to handle constructs
$NUM_DROPPED" exit_status=1 fi if [ $exit_status -ne 0 ]; then exit $exit_status fi ) }