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: