mirror of
https://github.com/kmc7468/cs220.git
synced 2025-12-14 22:18:46 +00:00
Initial commit
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/target
|
||||||
|
/Cargo.lock
|
||||||
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
name = "cs220"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
1
rust-toolchain
Normal file
1
rust-toolchain
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1.63.0
|
||||||
34
scripts/grade-01.sh
Executable file
34
scripts/grade-01.sh
Executable file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
set -uo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
# Imports library.
|
||||||
|
BASEDIR=$(dirname "$0")
|
||||||
|
source $BASEDIR/grade-utils.sh
|
||||||
|
|
||||||
|
RUNNERS=(
|
||||||
|
"cargo"
|
||||||
|
"cargo --release"
|
||||||
|
"cargo_asan"
|
||||||
|
"cargo_asan --release"
|
||||||
|
"cargo_tsan"
|
||||||
|
"cargo_tsan --release"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Lints.
|
||||||
|
cargo fmt --check
|
||||||
|
cargo clippy
|
||||||
|
|
||||||
|
# Executes test for each runner.
|
||||||
|
for RUNNER in "${RUNNERS[@]}"; do
|
||||||
|
echo "Running with $RUNNER..."
|
||||||
|
|
||||||
|
TESTS=("--lib assignment01_grade")
|
||||||
|
if [ $(run_tests) -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 0
|
||||||
78
scripts/grade-utils.sh
Executable file
78
scripts/grade-utils.sh
Executable file
@@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Global variables
|
||||||
|
# * TEMPLATE_REV: git revision of the latest homework template
|
||||||
|
# * TESTS: array of "[TARGET] [TEST_NAME] [-- <args>...]"
|
||||||
|
# e.g. "--test linked_list", "--lib cache", "--test list_set -- --test-thread 1"
|
||||||
|
# * RUNNERS: array of "cargo[_asan | _tsan] [--release]"
|
||||||
|
# * TIMEOUT: default 10s
|
||||||
|
|
||||||
|
rustup toolchain update stable nightly
|
||||||
|
|
||||||
|
echo_err() {
|
||||||
|
echo -e "\033[0;31m\033[1m$@\033[0m" 1>&2
|
||||||
|
}
|
||||||
|
export -f echo_err
|
||||||
|
|
||||||
|
# check_diff FILE TEST_LINES_FROM_TAIL
|
||||||
|
# Abort if tests are modified.
|
||||||
|
# Uses global variable TEMPLATE_REV.
|
||||||
|
check_diff() {
|
||||||
|
local FILE=$1
|
||||||
|
local TAIL_N=$2
|
||||||
|
diff <(tail -n $TAIL_N <(git show $TEMPLATE_REV:$FILE)) <(tail -n $TAIL_N $FILE) \
|
||||||
|
|| (echo_err "You modified tests for ${FILE}!"; exit 1)
|
||||||
|
}
|
||||||
|
export -f check_diff
|
||||||
|
|
||||||
|
# usage: cargo_asan [SUBCOMMAND] [OPTIONS] [-- <args>...]
|
||||||
|
# example: cargo_asan test --release TEST_NAME -- --skip SKIPPED
|
||||||
|
cargo_asan() {
|
||||||
|
local SUBCOMMAND=$1; shift
|
||||||
|
RUSTFLAGS="-Z sanitizer=address" \
|
||||||
|
RUSTDOCFLAGS="-Z sanitizer=address" \
|
||||||
|
cargo +nightly $SUBCOMMAND --target x86_64-unknown-linux-gnu $@
|
||||||
|
}
|
||||||
|
export -f cargo_asan
|
||||||
|
|
||||||
|
cargo_tsan() {
|
||||||
|
local SUBCOMMAND=$1; shift
|
||||||
|
RUSTFLAGS="-Z sanitizer=thread" \
|
||||||
|
TSAN_OPTIONS="suppressions=suppress_tsan.txt" \
|
||||||
|
RUSTDOCFLAGS="-Z sanitizer=thread" \
|
||||||
|
RUST_TEST_THREADS=1 \
|
||||||
|
cargo +nightly $SUBCOMMAND --target x86_64-unknown-linux-gnu $@
|
||||||
|
}
|
||||||
|
export -f cargo_tsan
|
||||||
|
|
||||||
|
# usage: _run_tests_with CARGO [OPTIONS]
|
||||||
|
# example: _run_tests_with cargo_tsan --release
|
||||||
|
# echos number of failed tests
|
||||||
|
# Uses global variable TESTS, TIMEOUT
|
||||||
|
# [OPTIONS] must not contain " -- " (cargo options only)
|
||||||
|
_run_tests_with() {
|
||||||
|
local CARGO=$1; shift
|
||||||
|
$CARGO test --no-run $@ &>/dev/null \
|
||||||
|
|| (echo_err "Build failed!"; exit 1)
|
||||||
|
|
||||||
|
local FAILED=0
|
||||||
|
for TEST in "${TESTS[@]}"; do
|
||||||
|
local TEST_CMD="$CARGO test $@ $TEST"
|
||||||
|
timeout ${TIMEOUT:-10s} bash -c "$TEST_CMD 2>/dev/null" 1>&2
|
||||||
|
case $? in
|
||||||
|
0) ;;
|
||||||
|
124) echo_err "Test timed out: $TEST_CMD"; FAILED=$((FAILED + 1));;
|
||||||
|
*) echo_err "Test failed: $TEST_CMD"; FAILED=$((FAILED + 1));;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
echo $FAILED
|
||||||
|
}
|
||||||
|
|
||||||
|
# example: run_tests
|
||||||
|
# Uses global variable RUNNER and TESTS
|
||||||
|
run_tests() {
|
||||||
|
# "cargo --relase" should be split into "cargo" and "--release"
|
||||||
|
local IFS=' '
|
||||||
|
echo $(_run_tests_with $RUNNER)
|
||||||
|
}
|
||||||
|
export -f run_tests
|
||||||
19
src/assignments/assignment01.rs
Normal file
19
src/assignments/assignment01.rs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//! Assignment 1: Preparing for Rust Development Environment.
|
||||||
|
//!
|
||||||
|
//! The primary goal of this assignment is bringing up SSH, VSCode, and all the other necessary tools to develop Rust programs.
|
||||||
|
//! Please make sure you're comfortable with developing Rust programs before moving on to the next assignments.
|
||||||
|
//!
|
||||||
|
//! You should fill out `add()` and `sub()` function bodies in such a way that `/scripts/grade-01.sh` works fine.
|
||||||
|
//! See `assignment01_grade.rs` and `/scripts/grade-01.sh` for the test script.
|
||||||
|
//!
|
||||||
|
//! Hint: https://doc.rust-lang.org/std/primitive.usize.html
|
||||||
|
|
||||||
|
/// Adds two unsigned words. If overflow happens, just wrap around.
|
||||||
|
pub(crate) fn add(lhs: usize, rhs: usize) -> usize {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Adds two unsigned words. If underflow happens, just wrap around.
|
||||||
|
pub(crate) fn sub(lhs: usize, rhs: usize) -> usize {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
24
src/assignments/assignment01_grade.rs
Normal file
24
src/assignments/assignment01_grade.rs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::super::assignment01::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn add_7_3() {
|
||||||
|
assert_eq!(add(7, 3), 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn add_overflow() {
|
||||||
|
assert_eq!(add(usize::MAX, 1), usize::MIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sub_7_3() {
|
||||||
|
assert_eq!(sub(7, 3), 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sub_underflow() {
|
||||||
|
assert_eq!(sub(usize::MIN, 1), usize::MAX);
|
||||||
|
}
|
||||||
|
}
|
||||||
5
src/assignments/mod.rs
Normal file
5
src/assignments/mod.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#![allow(dead_code)]
|
||||||
|
#![allow(unused_variables)]
|
||||||
|
|
||||||
|
mod assignment01;
|
||||||
|
mod assignment01_grade;
|
||||||
33
src/lib.rs
Normal file
33
src/lib.rs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
//! KAIST CS220: Programming Principles
|
||||||
|
|
||||||
|
// # Tries to deny all lints (`rustc -W help`).
|
||||||
|
#![deny(absolute_paths_not_starting_with_crate)]
|
||||||
|
#![deny(anonymous_parameters)]
|
||||||
|
#![deny(box_pointers)]
|
||||||
|
#![deny(deprecated_in_future)]
|
||||||
|
#![deny(explicit_outlives_requirements)]
|
||||||
|
#![deny(keyword_idents)]
|
||||||
|
#![deny(macro_use_extern_crate)]
|
||||||
|
#![deny(missing_debug_implementations)]
|
||||||
|
#![deny(non_ascii_idents)]
|
||||||
|
#![deny(pointer_structural_match)]
|
||||||
|
#![deny(rust_2018_idioms)]
|
||||||
|
#![deny(trivial_numeric_casts)]
|
||||||
|
#![deny(unaligned_references)]
|
||||||
|
// #![deny(unused_crate_dependencies)] // TODO: uncomment
|
||||||
|
#![deny(unused_extern_crates)]
|
||||||
|
#![deny(unused_import_braces)]
|
||||||
|
#![deny(unused_qualifications)]
|
||||||
|
#![deny(unused_results)]
|
||||||
|
#![deny(variant_size_differences)]
|
||||||
|
#![deny(warnings)]
|
||||||
|
#![deny(rustdoc::invalid_html_tags)]
|
||||||
|
#![deny(rustdoc::missing_doc_code_examples)]
|
||||||
|
#![deny(missing_docs)]
|
||||||
|
#![deny(rustdoc::all)]
|
||||||
|
#![deny(unreachable_pub)]
|
||||||
|
#![deny(single_use_lifetimes)]
|
||||||
|
#![deny(unused_lifetimes)]
|
||||||
|
#![deny(unstable_features)]
|
||||||
|
|
||||||
|
mod assignments;
|
||||||
0
suppress_tsan.txt
Normal file
0
suppress_tsan.txt
Normal file
Reference in New Issue
Block a user