Enable valgrind and dedicate a bot to it
authorEbrahim Byagowi <ebrahim@gnu.org>
Fri, 19 Oct 2018 05:54:21 +0000 (09:24 +0330)
committerEbrahim Byagowi <ebrahim@gnu.org>
Fri, 19 Oct 2018 06:09:36 +0000 (09:39 +0330)
.circleci/config.yml
test/fuzzing/run-shape-fuzzer-tests.py

index 1cf4bc8..b81564d 100644 (file)
@@ -90,6 +90,18 @@ jobs:
       - run: make -j32
       - run: LD_LIBRARY_PATH="$PWD/freetype-2.9/objs/.libs" make check || .ci/fail.sh
 
+  gcc-valgrind:
+    docker:
+      - image: ubuntu:18.10
+    steps:
+      - checkout
+      - run: apt update || true
+      - run: apt install -y gcc binutils libtool autoconf automake make pkg-config gtk-doc-tools ragel libfreetype6-dev libfontconfig1-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip valgrind
+      - run: pip install fonttools
+      - run: ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 --with-fontconfig
+      - run: make -j32
+      - run: make check || .ci/fail.sh
+
   clang-everything:
     docker:
       - image: ubuntu:18.10
@@ -293,6 +305,7 @@ workflows:
       # autotools based builds
       - alpine-O3-NOMMAP
       - archlinux-debug-O0-py3
+      - gcc-valgrind
       - clang-O3-O0
       - clang-everything
       - clang-asan
index 8fadd16..dcdab67 100755 (executable)
@@ -5,6 +5,24 @@ from __future__ import print_function, division, absolute_import
 import sys, os, subprocess, tempfile, threading
 
 
+def which(program):
+       # https://stackoverflow.com/a/377028
+       def is_exe(fpath):
+               return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
+
+       fpath, _ = os.path.split(program)
+       if fpath:
+               if is_exe(program):
+                       return program
+       else:
+               for path in os.environ["PATH"].split(os.pathsep):
+                       exe_file = os.path.join(path, program)
+                       if is_exe(exe_file):
+                               return exe_file
+
+       return None
+
+
 def cmd(command):
        # https://stackoverflow.com/a/4408409
        # https://stackoverflow.com/a/10012262
@@ -49,6 +67,8 @@ please provide it as the first argument to the tool""")
 print ('hb_shape_fuzzer:', hb_shape_fuzzer)
 fails = 0
 
+valgrind = which ('valgrind')
+
 parent_path = os.path.join (srcdir, "fonts")
 for file in os.listdir (parent_path):
        path = os.path.join(parent_path, file)
@@ -56,8 +76,19 @@ for file in os.listdir (parent_path):
        text, returncode = cmd ([hb_shape_fuzzer, path])
        print (text)
 
+       failed = False
        if returncode != 0 or 'error' in text:
                print ('failure on %s' % file)
+               failed = True
+
+       if valgrind:
+               text, returncode = cmd ([valgrind, '--error-exitcode=1', hb_shape_fuzzer, path])
+               if returncode:
+                       print (text)
+                       print ('failure on %s' % file)
+                       failed = True
+
+       if failed:
                fails = fails + 1
 
 if fails: