• * Remove dependency on `perl`, now only required for maintenance
      activities and running the test suite.
    * Exercise building qpdf and running executables from JetBrains CLion
      without any special additional tooling beyond pre-built external
      libraries.
    
    This replaces the `copy_dlls` with a powershell script, written mostly
    by ChatGPT, starting from the bash script below. The copy_dlls script
    had a lot of logic that was no longer needed.
    
    ```bash
    #!/bin/bash
    set -eo pipefail
    exe="$1"
    dest="$2"
    mingw_bin_dir="$3"
    if [[ $mingw_bin_dir == "" ]]; then
        echo >&2 "Usage: $(basename $0) exe dest mingw-bin-dir"
        exit 2
    fi
    
    get_dlls() {
        objdump -p "$1" | grep 'DLL Name:' | awk '{print $NF}'
    }
    declare -a dlls
    dlls=($(get_dlls "$exe"))
    declare -A seen
    while [[ ${#dlls[@]} -gt 0 ]]; do
        i="${dlls[0]}"
        dlls=("${dlls[@]:1}")
        if [[ ${seen[$i]} == 1 ]]; then
            continue
        fi
        seen[$i]=1
        full="$mingw_bin_dir/$i"
        if [[ -f "$full" ]]; then
            cp "$full" $dest/
            dlls+=($(get_dlls "$full"))
        fi
    done
    ```
    Jay Berkenbilt authored
     
    Browse File »






  • Figuring out which classes are part of the public API by using library
    symbols is fragile (dependent on specific compiler optimizations) and
    unreliable (misses some inline things). Instead, use castxml, a tool
    that parses C++ to an abstract syntax tree and generates XML, to get a
    reliable accounting of public classes and their sizes.
    Jay Berkenbilt authored
     
    Browse File »





  • Why did this ever work? Hard to say...perhaps a library we linked
    against was setting `int _dowildcard = -1;` somewhere and no longer
    is. Apparently linking with CRT_glob.o has been the way to do this for
    a very long time, and we've just been lucky that it worked all this
    time.
    Jay Berkenbilt authored
     
    Browse File »


  • As a rule, we should avoid conditional compilation is it always causes
    code paths that are sometimes not even seen lexically by the compiler.
    Also, we want the actual code being fuzzed to be as close as possible
    to the real code. Conditional compilation is suitable to handle
    underlying system differences.
    
    Instead, favor configuration using callbacks or other methods that can
    be triggered in the places where they need to be exercised.
    Jay Berkenbilt authored
     
    Browse File »