diff --git a/.github/workflows/c-coverage.yml b/.github/workflows/c-coverage.yml index 19bfe5d..ccc9a64 100644 --- a/.github/workflows/c-coverage.yml +++ b/.github/workflows/c-coverage.yml @@ -12,7 +12,7 @@ on: # yamllint disable-line rule:truthy jobs: coverage: name: C/C++ CMake CI Coverage - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - name: Checkout repository diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index 960ec55..1bf4fc8 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -12,7 +12,7 @@ on: # yamllint disable-line rule:truthy jobs: lint: name: clang-format style check - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - name: Checkout repository @@ -21,12 +21,15 @@ jobs: - name: Install dependencies # yamllint disable rule:line-length run: | - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - sudo apt-add-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy main" + sudo mkdir -p /etc/apt/keyrings + curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key \ + | sudo gpg --dearmor -o /etc/apt/keyrings/llvm-snapshot.gpg + echo "deb [signed-by=/etc/apt/keyrings/llvm-snapshot.gpg] http://apt.llvm.org/resolute/ llvm-toolchain-resolute-22 main" \ + | sudo tee /etc/apt/sources.list.d/llvm.list && \ sudo apt-get -y update - sudo apt-get -y install --no-install-recommends --no-install-suggests clang-format-19 - sudo update-alternatives --install /usr/bin/clang-format clang-format $(which clang-format-19) 100 - sudo update-alternatives --set clang-format $(update-alternatives --list clang-format | grep clang-format-19) + sudo apt-get -y install --no-install-recommends --no-install-suggests clang-format-22 + sudo update-alternatives --install /usr/bin/clang-format clang-format $(which clang-format-22) 100 + sudo update-alternatives --set clang-format $(update-alternatives --list clang-format | grep clang-format-22) # yamllint enable rule:line-length - name: Check Tools diff --git a/.github/workflows/cppcheck.yml b/.github/workflows/cppcheck.yml index 2085706..7179d05 100644 --- a/.github/workflows/cppcheck.yml +++ b/.github/workflows/cppcheck.yml @@ -13,7 +13,7 @@ on: # yamllint disable-line rule:truthy jobs: lint: name: CppCheck Lint - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - name: Checkout repository diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index add32e8..f56d36c 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -18,7 +18,7 @@ jobs: build: name: "Build Docker images" - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 @@ -73,7 +73,7 @@ jobs: lint: name: "Run in docker: LINT" - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: build steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 @@ -98,7 +98,7 @@ jobs: test: name: "Run in docker: TEST" - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: build steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 @@ -124,7 +124,7 @@ jobs: # yamllint disable rule:line-length # security: # name: "Snyk Container" - # runs-on: ubuntu-24.04 + # runs-on: ubuntu-26.04 # needs: build # permissions: # actions: read @@ -173,7 +173,7 @@ jobs: scan: name: "Trivy" - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: build permissions: actions: read diff --git a/.github/workflows/gitleaks.yml b/.github/workflows/gitleaks.yml index fe87491..48a3da5 100644 --- a/.github/workflows/gitleaks.yml +++ b/.github/workflows/gitleaks.yml @@ -19,7 +19,7 @@ on: # yamllint disable-line rule:truthy jobs: scan: name: gitleaks - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 with: diff --git a/.github/workflows/make-coverage-html.yml b/.github/workflows/make-coverage-html.yml index 319da88..12bf923 100644 --- a/.github/workflows/make-coverage-html.yml +++ b/.github/workflows/make-coverage-html.yml @@ -15,7 +15,7 @@ on: # yamllint disable-line rule:truthy jobs: make-coverage-html: name: "Run make coverage/html and verify coverage HTML" - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - name: Checkout repository uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 diff --git a/.github/workflows/markdown-lint.yml b/.github/workflows/markdown-lint.yml index a80dc93..4cc5157 100644 --- a/.github/workflows/markdown-lint.yml +++ b/.github/workflows/markdown-lint.yml @@ -15,7 +15,7 @@ permissions: jobs: markdownlint: name: Markdown Lint - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 strategy: matrix: diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 203e947..852a2f4 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -11,7 +11,7 @@ on: # yamllint disable-line rule:truthy jobs: build: name: SonarCloud build and run sonar-scanner - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 env: # Directory where build-wrapper output will be placed BUILD_WRAPPER_OUT_DIR: build diff --git a/.github/workflows/yamllint.yml b/.github/workflows/yamllint.yml index bad6388..ff60197 100644 --- a/.github/workflows/yamllint.yml +++ b/.github/workflows/yamllint.yml @@ -13,7 +13,7 @@ on: # yamllint disable-line rule:truthy jobs: lint: name: YAML lint - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - name: Checkout repository uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 diff --git a/Dockerfile b/Dockerfile index 9398284..d01fdf1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG BASE_IMAGE_VERSION=ubuntu:noble-20260509.1 +ARG BASE_IMAGE_VERSION=ubuntu:26.04 FROM ${BASE_IMAGE_VERSION} AS init ENV WORKDIR=/app @@ -34,7 +34,7 @@ RUN apt-get -y update && \ ca-certificates curl git ninja-build unzip zip && \ rm -rf /var/lib/apt/lists/* && \ mkdir /opt/vcpkg && \ - git clone --branch ${VCPKG_VERSION} https://github.com/microsoft/vcpkg "${VCPKG_ROOT}" && \ + git clone --branch "${VCPKG_VERSION}" https://github.com/microsoft/vcpkg "${VCPKG_ROOT}" && \ /opt/vcpkg/bootstrap-vcpkg.sh && \ ln -s /opt/vcpkg/vcpkg /usr/local/bin/vcpkg && \ rm -rf /var/lib/apt/lists/* && \ @@ -69,12 +69,15 @@ FROM builder AS lint RUN apt-get update && \ apt-get -y install --no-install-recommends --no-install-suggests gnupg software-properties-common && \ rm -rf /var/lib/apt/lists/* -ADD https://apt.llvm.org/llvm-snapshot.gpg.key llvm-snapshot.gpg.key -RUN apt-key add llvm-snapshot.gpg.key && \ - apt-add-repository -y "deb https://apt.llvm.org/plucky/ llvm-toolchain-plucky-20 main" && \ + +RUN mkdir -p /etc/apt/keyrings && \ + curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key \ + | gpg --dearmor -o /etc/apt/keyrings/llvm-snapshot.gpg && \ + echo "deb [signed-by=/etc/apt/keyrings/llvm-snapshot.gpg] http://apt.llvm.org/resolute/ llvm-toolchain-resolute-22 main" \ + | tee /etc/apt/sources.list.d/llvm.list && \ apt-get -y update && \ - apt-get -y install --no-install-recommends --no-install-suggests clang-format-19 && \ - update-alternatives --install /usr/bin/clang-format clang-format $(which clang-format-19) 100 && \ + apt-get -y install --no-install-recommends --no-install-suggests clang-format-22 && \ + update-alternatives --install /usr/bin/clang-format clang-format $(which clang-format-22) 100 && \ rm -rf /var/lib/apt/lists/* ADD https://deb.nodesource.com/setup_22.x nodesource_setup.sh @@ -83,10 +86,16 @@ RUN bash nodesource_setup.sh && \ npm install -g --ignore-scripts markdownlint-cli@0.47.0 && \ apt-get -y install --no-install-recommends --no-install-suggests python3-minimal python3-pip && \ rm /usr/lib/python3.*/EXTERNALLY-MANAGED && \ - pip install --no-cache-dir yamllint && \ + apt-get -y install --no-install-recommends --no-install-suggests yamllint && \ apt-get -y install --no-install-recommends --no-install-suggests cppcheck && \ rm -rf /var/lib/apt/lists/* +# Tooling test +RUN clang-format --version && \ + markdownlint --version && \ + yamllint --version && \ + cppcheck --version + # Code source COPY ./src ${WORKDIR}/src COPY ./vcpkg.json ${WORKDIR}/vcpkg.json diff --git a/src/lib/exercises/src/hackerrank/warmup/compare_triplets.c b/src/lib/exercises/src/hackerrank/warmup/compare_triplets.c index 3cbfb53..0abb5c0 100644 --- a/src/lib/exercises/src/hackerrank/warmup/compare_triplets.c +++ b/src/lib/exercises/src/hackerrank/warmup/compare_triplets.c @@ -12,6 +12,9 @@ int *HACKERRANK_WARMUP_compareTriplets(int a_count, const int *a, int b_count, *result_count = 2; int *awards = malloc(sizeof(int) * *result_count); + if (awards == NULL) { + return NULL; + } awards[0] = 0; awards[1] = 0; diff --git a/src/lib/exercises/src/hackerrank/warmup/mini_max_sum.c b/src/lib/exercises/src/hackerrank/warmup/mini_max_sum.c index 5e6613c..9eed7a7 100644 --- a/src/lib/exercises/src/hackerrank/warmup/mini_max_sum.c +++ b/src/lib/exercises/src/hackerrank/warmup/mini_max_sum.c @@ -27,6 +27,9 @@ char *HACKERRANK_WARMUP_miniMaxSumCalculate(int arr_count, const int *arr) { const int BUFFER_MAX_SIZE = 100; char *buffer = malloc(BUFFER_MAX_SIZE * sizeof(char)); + if (buffer == NULL) { + return NULL; + } snprintf(buffer, BUFFER_MAX_SIZE, "%lld %lld", tsum - tmax, tsum - tmin); return buffer; @@ -34,6 +37,10 @@ char *HACKERRANK_WARMUP_miniMaxSumCalculate(int arr_count, const int *arr) { void HACKERRANK_WARMUP_miniMaxSum(int arr_count, const int *arr) { char *result = HACKERRANK_WARMUP_miniMaxSumCalculate(arr_count, arr); + if (result == NULL) { + return; + } + printf("%s\n", result); free(result); } diff --git a/src/lib/exercises/src/hackerrank/warmup/plus_minus.c b/src/lib/exercises/src/hackerrank/warmup/plus_minus.c index c2f322d..f98d906 100644 --- a/src/lib/exercises/src/hackerrank/warmup/plus_minus.c +++ b/src/lib/exercises/src/hackerrank/warmup/plus_minus.c @@ -11,6 +11,9 @@ const int BUFFER_MAX_SIZE = 10; char *format_result(double number) { char *buffer = malloc(BUFFER_MAX_SIZE * sizeof(char)); + if (buffer == NULL) { + return NULL; + } snprintf(buffer, BUFFER_MAX_SIZE, "%0.6lf", number); return buffer; @@ -45,9 +48,16 @@ char **HACKERRANK_WARMUP_plusMinusCalculate(int arr_count, const int *arr) { int n = 3; // NĂºmero de strings (puede ser arbitrario) char **answer = malloc(n * sizeof(char *)); // Array de punteros + if (answer == NULL) { + return NULL; + } for (i = 0; i < n; i++) { char *formatted = format_result(results[i]); + if (formatted == NULL) { + HACKERRANK_WARMUP_freePlusMinus(answer, i); + return NULL; + } answer[i] = formatted; } @@ -63,6 +73,9 @@ void HACKERRANK_WARMUP_freePlusMinus(char **plusMinusAnswer, int n) { void HACKERRANK_WARMUP_plusMinus(int arr_count, const int *arr) { char **output = HACKERRANK_WARMUP_plusMinusCalculate(arr_count, arr); + if (output == NULL) { + return; + } for (int i = 0; i < HACKERRANK_WARMUP_PLUSMINUS_LIMIT_ANSWERS; i++) { printf("%s", output[i]); diff --git a/src/lib/exercises/src/hackerrank/warmup/staircase.c b/src/lib/exercises/src/hackerrank/warmup/staircase.c index 4473eec..12a305b 100644 --- a/src/lib/exercises/src/hackerrank/warmup/staircase.c +++ b/src/lib/exercises/src/hackerrank/warmup/staircase.c @@ -10,9 +10,16 @@ char **HACKERRANK_WARMUP_staircaseCalculate(int n) { char **answer = malloc(n * sizeof(char *)); // Array of char pointers + if (answer == NULL) { + return NULL; + } for (int i = 0; i < n; i++) { char *line = malloc((n + 1) * sizeof(char)); // Array of char values + if (line == NULL) { + HACKERRANK_WARMUP_freeStaircase(answer, i); + return NULL; + } for (int j = 0; j < n; j++) { if (j < n - i - 1) { @@ -38,6 +45,9 @@ void HACKERRANK_WARMUP_freeStaircase(char **staircase, int n) { void HACKERRANK_WARMUP_staircase(int n) { char **output = HACKERRANK_WARMUP_staircaseCalculate(n); + if (output == NULL) { + return; + } for (int i = 0; i < n; i++) { printf("%s\n", output[i]); diff --git a/src/lib/exercises/src/hackerrank/warmup/time_conversion.c b/src/lib/exercises/src/hackerrank/warmup/time_conversion.c index 638b71c..7b4de53 100644 --- a/src/lib/exercises/src/hackerrank/warmup/time_conversion.c +++ b/src/lib/exercises/src/hackerrank/warmup/time_conversion.c @@ -54,6 +54,10 @@ char *HACKERRANK_WARMUP_timeConversion(const char *s) { char *conversion = malloc((HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE + 1) * sizeof(char)); + if (conversion == NULL) { + return NULL; + } + for (int i = 0; i < HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE; i++) { conversion[i] = s[i]; }