README.md
Rendering markdown...
cmake_minimum_required(VERSION 3.16)
project(tar-bug-repro VERSION 1.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Check for required tools
find_program(CARGO_EXECUTABLE cargo REQUIRED)
find_program(TAR_EXECUTABLE tar REQUIRED)
# Output directories
set(OUTPUT_DIR ${CMAKE_BINARY_DIR}/output)
set(RUST_TARGET_DIR ${CMAKE_BINARY_DIR}/rust-target)
set(LOGS_DIR ${OUTPUT_DIR}/logs)
file(MAKE_DIRECTORY ${OUTPUT_DIR} ${LOGS_DIR})
# C++ executables
add_executable(repro_generator repro_generator/repro_generator.cpp)
add_executable(tarwalk tarwalk/tarwalk.cpp)
add_executable(tarwalk_bad tarwalk/tarwalk_bad.cpp)
# Custom target to build Rust tar-bug-detector
add_custom_target(rust_detector
ALL
COMMAND "${CARGO_EXECUTABLE}" build --release --target-dir "${RUST_TARGET_DIR}"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/tar-bug-detector"
COMMENT "Building Rust tar-bug-detector"
USES_TERMINAL
)
set_property(TARGET rust_detector APPEND PROPERTY ADDITIONAL_CLEAN_FILES "${RUST_TARGET_DIR}")
# Custom target to generate the reproducing tar file
add_custom_target(generate_repro
COMMAND repro_generator
DEPENDS repro_generator
WORKING_DIRECTORY "${OUTPUT_DIR}"
COMMENT "Generating reproduction tar file"
)
# Custom target to run tar command
add_custom_target(run_tar_tvf
COMMAND "${TAR_EXECUTABLE}" tvf pax_bug_compact.tar > "${LOGS_DIR}/tar_tvf_output.txt" 2>&1
DEPENDS generate_repro
WORKING_DIRECTORY "${OUTPUT_DIR}"
COMMENT "Running 'tar tvf' on reproduction file"
)
# Custom target to run correct tarwalk
add_custom_target(run_tarwalk
COMMAND tarwalk pax_bug_compact.tar > "${LOGS_DIR}/tarwalk_correct.txt" 2>&1
DEPENDS tarwalk generate_repro
WORKING_DIRECTORY "${OUTPUT_DIR}"
COMMENT "Running correct tarwalk implementation"
)
# Custom target to run buggy tarwalk
add_custom_target(run_tarwalk_bad
COMMAND tarwalk_bad pax_bug_compact.tar > "${LOGS_DIR}/tarwalk_buggy.txt" 2>&1
DEPENDS tarwalk_bad generate_repro
WORKING_DIRECTORY "${OUTPUT_DIR}"
COMMENT "Running buggy tarwalk implementation"
)
# Custom target to run Rust detector
add_custom_target(run_detector
COMMAND "${RUST_TARGET_DIR}/release/tar-bug-detector" pax_bug_compact.tar > "${LOGS_DIR}/rust_comparison.txt" 2>&1
DEPENDS rust_detector generate_repro
WORKING_DIRECTORY "${OUTPUT_DIR}"
COMMENT "Running Rust tar library comparison"
)
# Custom target to generate summary report
add_custom_target(generate_report
COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_SOURCE_DIR}/generate_report.cmake"
DEPENDS run_tar_tvf run_tarwalk run_tarwalk_bad run_detector
WORKING_DIRECTORY "${OUTPUT_DIR}"
COMMENT "Generating summary report"
)
# Main target that runs everything in sequence
add_custom_target(reproduce_bug
DEPENDS generate_report
COMMENT "Complete bug reproduction sequence"
)
# Add a clean target for the output directory
add_custom_target(clean_output
COMMAND "${CMAKE_COMMAND}" -E remove_directory "${OUTPUT_DIR}"
COMMAND "${CMAKE_COMMAND}" -E make_directory "${OUTPUT_DIR}"
COMMAND "${CMAKE_COMMAND}" -E make_directory "${LOGS_DIR}"
COMMENT "Cleaning output directory"
)
# Print instructions
add_custom_target(instructions
COMMAND "${CMAKE_COMMAND}" -E echo ""
COMMAND "${CMAKE_COMMAND}" -E echo "TAR Bug Reproduction Instructions:"
COMMAND "${CMAKE_COMMAND}" -E echo "=================================="
COMMAND "${CMAKE_COMMAND}" -E echo ""
COMMAND "${CMAKE_COMMAND}" -E echo "To reproduce the bug:"
COMMAND "${CMAKE_COMMAND}" -E echo " ${CMAKE_MAKE_PROGRAM} reproduce_bug"
COMMAND "${CMAKE_COMMAND}" -E echo ""
COMMAND "${CMAKE_COMMAND}" -E echo "To run individual steps:"
COMMAND "${CMAKE_COMMAND}" -E echo " ${CMAKE_MAKE_PROGRAM} generate_repro # Generate test tar file"
COMMAND "${CMAKE_COMMAND}" -E echo " ${CMAKE_MAKE_PROGRAM} run_tar_tvf # Show what GNU tar sees"
COMMAND "${CMAKE_COMMAND}" -E echo " ${CMAKE_MAKE_PROGRAM} run_tarwalk # Show correct parsing"
COMMAND "${CMAKE_COMMAND}" -E echo " ${CMAKE_MAKE_PROGRAM} run_tarwalk_bad # Show buggy parsing"
COMMAND "${CMAKE_COMMAND}" -E echo " ${CMAKE_MAKE_PROGRAM} run_detector # Compare tar vs tokio-tar"
COMMAND "${CMAKE_COMMAND}" -E echo ""
COMMAND "${CMAKE_COMMAND}" -E echo "Output files will be in: ${OUTPUT_DIR}"
COMMAND "${CMAKE_COMMAND}" -E echo "Log files will be in: ${LOGS_DIR}"
COMMENT "Displaying instructions"
)
# vim: set ts=4 sts=4 sw=4 et: