Skip to content

ceedling memory Leak with valgrind under current docker container #5

@georgemichalis

Description

@georgemichalis

Hello.
Before anything else i have to say that ceedling is a great tool, and i am using it for a few years now.
I am also using it to unit test some things for an esp-idf project, and i had made a docker file that includes ceeling and ruby but it was build on ubuntu.

Today i wanted to test something really quick, and i used the provided docker file instead of my own. The provided docker file is based on alpine.

with the valgrind enabled in the project file running any test results in a memory leak. At the beginning i though that i indeed had a memory leak, but then i tried newly created empty tests files that only have the automatically generated code.

This is the resulting output:

File test/test_GL_NameOf.c created
Generate Complete
/project # ceedling test:GL_NameOf


Test 'test_GL_NameOf.c'
-----------------------
Generating runner for test_GL_NameOf.c...
Compiling test_GL_NameOf_runner.c...
Compiling test_GL_NameOf.c...
Compiling GL_NameOf.c...
Linking test_GL_NameOf.out...
Running Hook pre_test_fixture_execute...
==85== Memcheck, a memory error detector
==85== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==85== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==85== Command: build/test/out/test_GL_NameOf.out
==85==
==85==
==85== HEAP SUMMARY:
==85==     in use at exit: 468 bytes in 4 blocks
==85==   total heap usage: 5 allocs, 1 frees, 508 bytes allocated
==85==
==85== 16 bytes in 2 blocks are still reachable in loss record 1 of 3
==85==    at 0x48A16F2: calloc (vg_replace_malloc.c:762)
==85==    by 0x4059055: ??? (in /lib/ld-musl-x86_64.so.1)
==85==
==85== 32 bytes in 1 blocks are still reachable in loss record 2 of 3
==85==    at 0x48A16F2: calloc (vg_replace_malloc.c:762)
==85==    by 0x4059055: ??? (in /lib/ld-musl-x86_64.so.1)
==85==    by 0xD66C9B84AEA8A325: ???
==85==    by 0x742F646C697562C6: ???
==85==    by 0x2F74756F2F747364: ???
==85==    by 0x5F4C475F74736573: ???
==85==    by 0x6F2E664F656D614D: ???
==85==    by 0x365F363878007474: ???
==85==
==85== 420 bytes in 1 blocks are still reachable in loss record 3 of 3
==85==    at 0x48A16F2: calloc (vg_replace_malloc.c:762)
==85==    by 0x4058E1D: ??? (in /lib/ld-musl-x86_64.so.1)
==85==    by 0x4059A70: __dls3 (in /lib/ld-musl-x86_64.so.1)
==85==    by 0xD66C9B84AEA8A325: ???
==85==    by 0x742F646C697562C6: ???
==85==    by 0x2F74756F2F747364: ???
==85==    by 0x5F4C475F74736573: ???
==85==    by 0x6F2E664F656D614D: ???
==85==    by 0x365F363878007474: ???
==85==
==85== LEAK SUMMARY:
==85==    definitely lost: 0 bytes in 0 blocks
==85==    indirectly lost: 0 bytes in 0 blocks
==85==      possibly lost: 0 bytes in 0 blocks
==85==    still reachable: 468 bytes in 4 blocks
==85==         suppressed: 0 bytes in 0 blocks
==85==
==85== For lists of detected and suppressed errors, rerun with: -s
==85== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
ERROR: Shell command failed.
> Shell executed command:
'valgrind --track-origins=yes --leak-check=full --show-leak-kinds=all --errors-for-leak-kinds=all --error-exitcode=10 build/test/out/test_GL_NameOf.out'
> Produced output:
test_GL_NameOf.c:17:test_GL_NameOf_NeedToImplement:IGNORE: Need to Implement GL_NameOf

and this is the project file

---

# Notes:
# Sample project C code is not presently written to produce a release artifact.
# As such, release build options are disabled.
# This sample, therefore, only demonstrates running a collection of unit tests.
# type >ceedling module:create[FileName]

:project:
  :use_exceptions: FALSE
  :use_test_preprocessor: TRUE
  :use_auxiliary_dependencies: TRUE
  :build_root: build
#  :release_build: TRUE
  :test_file_prefix: test_
  :which_ceedling: gem
  :ceedling_version: 0.31.1
  :default_tasks:
    - test:all

#:test_build:
#  :use_assembly: TRUE

#:release_build:
#  :output: MyApp.out
#  :use_assembly: FALSE

:environment:

:extension:
  :executable: .out
  #:source: .cpp


:paths:
  :test:
    - +:test/**
    - -:test/support
  :source:
    - main/**
  :support:
    - test/support
  :libraries: []

:defines:
  # in order to add common defines:
  #  1) remove the trailing [] from the :common: section
  #  2) add entries to the :common: section (e.g. :test: has TEST defined)
  :common: &common_defines []
  :test:
    - *common_defines
    - TEST
  :test_preprocess:
    - *common_defines
    - TEST

:cmock:
  :treat_externs: :include
  :mock_prefix: mock_
  :when_no_prototypes: :warn
  :enforce_strict_ordering: TRUE
  :plugins:
    - :ignore
    - :callback
    - :return_thru_ptr
    - :array
    - :expect_any_args
    - :ignore_arg
  :treat_as:
    uint8:    HEX8
    uint16:   HEX16
    uint32:   UINT32
    int8:     INT8
    bool:     UINT8

:unity: #great big gorilla processor that grunts and scratches
  :defines:
    - UNITY_SUPPORT_64 

# Add -gcov to the plugins list to make sure of the gcov plugin
# You will need to have gcov and gcovr both installed to make it work.
# For more information on these options, see docs in plugins/gcov
:gcov:
  :utilities:
    #- ReportGenerator
    - gcovr
  :reports:
    - HtmlDetailed
    - Text
    - JSON
  :gcovr:
    :html_medium_threshold: 75
    :html_high_threshold: 90

# :tools:
# Ceedling defaults to using gcc for compiling, linking, etc.
# As [:tools] is blank, gcc will be used (so long as it's in your system path)
# See documentation to configure a given toolchain for use
:tools:
  :pre_test_fixture_execute:
    :executable: valgrind
    :arguments:
      - --track-origins=yes
      - --leak-check=full
      - --show-leak-kinds=all
      - --errors-for-leak-kinds=all
      - --error-exitcode=10
      - ${1}

# LIBRARIES
# These libraries are automatically injected into the build process. Those specified as
# common will be used in all types of builds. Otherwise, libraries can be injected in just
# tests or releases. These options are MERGED with the options in supplemental yaml files.
:libraries:
  :placement: :end
  :flag: "-l${1}"
  :path_flag: "-L ${1}"
  :system: []    # for example, you might list 'm' to grab the math library
  :test: []
  :release: []

:plugins:
  :load_paths:
    - "#{Ceedling.load_path}"
  :enabled:
    - stdout_pretty_tests_report
    - module_generator
    - xml_tests_report
    - gcov
    - command_hooks
:flags:
  :test:
    :compile:
      :*:
      - -UNITY_INCLUDE_DOUBLE
...

The same exact test and project file can be used under an ubuntu docker install with the tests successful

The docker file that i am using is the following (it may have a few extra packages because it has been recommissioned from a much more complicated dockerfile). Obviously the resulting image is way larger (because of ubuntu) than the alpine one (1.2Gb vs 300Mb)

FROM ubuntu:20.04

#skip confirmations
ARG DEBIAN_FRONTEND=nointeractive

# install the requirements for qemu, unity and ruby
#qemu
RUN apt-get update \
  && apt install -y -q \
  cmake \
  curl \
  python3 \
  python3-pip\
  unzip\
  zip\
  wget \
  git \
  hwdata \
  libglib2.0-0 \
  libnuma1 \
  libpixman-1-0 \
  linux-tools-virtual

#unity tools
RUN apt install -y -q \
  coreutils \
  gcc \
  gcovr \
  valgrind \
  libc-dev

#rbenv
RUN apt install -y -q \
  autoconf \
  bison \
  patch \
  build-essential \
  rustc \
  libssl-dev \
  libyaml-dev \
  libreadline-dev \
  zlib1g-dev \
  libgmp-dev \
  libncurses5-dev \
  libffi-dev \
  libgdbm6 \
  libgdbm-dev \
  libdb-dev \
  && rm -rf /var/lib/apt/lists/*


RUN update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20

ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8



# download and install rbenv
RUN git clone https://github.com/sstephenson/rbenv.git ~/.rbenv \
&&  echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc \
&&  echo 'eval "$(rbenv init -)"' >> ~/.bashrc \
&&  echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc \
&&  echo 'eval "$(rbenv init -)"' >> ~/.zshrc \
&&  export PATH="$HOME/.rbenv/bin:$PATH"

#  install ruby build
RUN git clone https://github.com/rbenv/ruby-build.git "$HOME/.rbenv/plugins/ruby-build"
RUN ~/.rbenv/bin/rbenv install 2.7.2
RUN ~/.rbenv/bin/rbenv global 2.7.2



COPY assets/gems /assets/gems

# Install Ceedling, CMock, Unity
RUN set -ex \
 # Prevent documentation installation taking up space
  echo -e "---\ngem: --no-ri --no-rdoc\n...\n" > .gemrc \
  # Install Ceedling and related gems
  && /root/.rbenv/shims/gem install --force --local /assets/gems/*.gem \
  # Cleanup
  && rm -rf /assets \
  && rm .gemrc


CMD ["/bin/bash"]

If you want to use it feel free, or let me know and i can do a PR to include this in the repo.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions