Tool that generates unit test by C/C++ source code, trying to reach all branches and maximize code coverage

Related tags

CLI UTBotCpp
Overview

What is UTBotCpp?

UTBotCpp generates test cases by code, trying to cover maximum statements and execution paths. We treat source code as source of truth assuming that behavior is correct and corresponds to initial user demand. Generated tests are placed in so-called regression suite. Thus, we fixate current behavior by generated test cases. Using UTBotCpp developers obtain full control of their code. No future change can break the code without being noticed once it's covered with tests generated by UTBot. This way, modifications made by developers to an existing code are much safer. Hence, with the help of generated unit tests, UTBot provides dramatic code quality improvement.

How to install and use UTBot

For now, you can only use UTBot under Ubuntu. UTBot has been tested under Ubuntu 14, 16, and 18. Navigate to the Releases GitHub page and download any version of UTBot. UTBot is distrbuted as an archive that contains

  1. A pack utbot_distr.tar.gz that contains UTBot binary and its dependencies;
  2. UTBot plugin for Visual Studio code — utbot_plugin.vsix;
  3. A version version.txt;
  4. A run script unpack_and_run_utbot.sh.

To launch UTBot, unzip the archive and run the chmod +x unpack_and_run_utbot.sh && ./unpack_and_run_utbot.sh command (we recommend doing it in a fresh directory to make UTBot removing easier). To remove UTBot, simply delete this directory.

To install UTBot VSCode plugin, use VSCode Install from VSIX command.

How to contribute to UTBot

See DEVNOTE.md.

Issues
  • Add interactive mode

    Add interactive mode

    Now interactive mode doesn't work on generation tests for project or folder, but for file all are fine. For file linked-list.cpp generation time equals 52s for 1 parallel process, 36s - for 5 and 20s - for 10. For other files it's impossible to see difference because number of functions in files are small

    opened by sava-cska 4
  • "Couldn't link any file" error when generating tests for project

    Version v1.0.31-alpha Test project

    Steps to reproduce:

    1. Select lib folder
    2. Right click -> UTbot: Generate Tests for Project

    Actual -> FAILED_PRECONDITION: Couldn't link any files LinkError LinkError0 Expected -> Test should be generated

    bug 
    opened by asolqa 4
  • [KLEE] Assertion in lazy instantiation failed

    [KLEE] Assertion in lazy instantiation failed

    Steps to reproduce:

    1. Configure project libbacktrace
    2. Generate tests for function elf_zlib_inflate_table in file dwarf.c
    3. Find errors in logs
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   KLEE: ERROR: elf.c:1268: memory error: out of bound pointer
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   KLEE: NOTE: now ignoring this error at this location
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   utbot: ../lib/Core/Executor.cpp:4880: klee::ObjectPair klee::Executor::lazyInstantiateVariable(klee::ExecutionState &, ref<klee::Expr>, klee::KInstruction *, uint64_t): Assertion `!isa<ConstantExpr>(address)' failed.
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   linux-gnu/libpthread.so.0+0x12980)
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .    #4 0x00007ffff46fae87 raise (/lib/x86_64-linux-gnu/libc.so.6+0x3ee87)
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .    #5 0x00007ffff46fc7f1 abort (/lib/x86_64-linux-gnu/libc.so.6+0x407f1)
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .    #6 0x00007ffff46ec3fa (/lib/x86_64-linux-gnu/libc.so.6+0x303fa)
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .    #7 0x00007ffff46ec472 (/lib/x86_64-linux-gnu/libc.so.6+0x30472)
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .    #8 0x00000000032a5062 klee::Executor::lazyInstantiateVariable(klee::ExecutionState&, klee::ref<klee::Expr>, klee::KInstruction*, unsigned long) /home/utbot/UTBotCpp/submodules/klee/build/../lib/Core/Executor.cpp:0:3
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .    #9 0x00000000032968be klee::Executor::executeMemoryOperation(klee::ExecutionState&, klee::Executor::MemoryOperation, klee::ref<klee::Expr>, klee::ref<klee::Expr>, klee::KInstruction*) /home/utbot/UTBotCpp/submodules/klee/build/../lib/Core/Executor.cpp:0:0
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #10 0x000000000329911f klee::ref<klee::Expr>::dec() const /home/utbot/UTBotCpp/submodules/klee/build/../include/klee/ADT/Ref.h:98:9
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #11 0x000000000329911f klee::ref<klee::Expr>::~ref() /home/utbot/UTBotCpp/submodules/klee/build/../include/klee/ADT/Ref.h:89:13
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #12 0x000000000329911f klee::Executor::executeInstruction(klee::ExecutionState&, klee::KInstruction*) /home/utbot/UTBotCpp/submodules/klee/build/../lib/Core/Executor.cpp:2845:5
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #13 0x00000000032a1d45 klee::Executor::executeStep(klee::ExecutionState&) /home/utbot/UTBotCpp/submodules/klee/build/../lib/Core/Executor.cpp:3874:3
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #14 0x00000000032a27db klee::Executor::guidedRun(klee::ExecutionState&) /home/utbot/UTBotCpp/submodules/klee/build/../lib/Core/Executor.cpp:4011:13
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #15 0x00000000032a2516 std::enable_if<__and_<std::__not_<std::__is_tuple_like<klee::PTree*> >, std::is_move_constructible<klee::PTree*>, std::is_move_assignable<klee::PTree*> >::value, void>::type std::swap<klee::PTree*>(klee::PTree*&, klee::PTree*&) /usr/lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/move.h:193:19
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #16 0x00000000032a2516 std::unique_ptr<klee::PTree, std::default_delete<klee::PTree> >::reset(klee::PTree*) /usr/lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/unique_ptr.h:400:2
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #17 0x00000000032a2516 std::unique_ptr<klee::PTree, std::default_delete<klee::PTree> >::operator=(std::nullptr_t) /usr/lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/unique_ptr.h:336:2
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #18 0x00000000032a2516 klee::Executor::runGuided(klee::ExecutionState&, klee::KFunction*) /home/utbot/UTBotCpp/submodules/klee/build/../lib/Core/Executor.cpp:3855:15
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #19 0x00000000032a71e9 klee::Executor::runMainAsGuided(llvm::Function*, int, char**, char**) /home/utbot/UTBotCpp/submodules/klee/build/../lib/Core/Executor.cpp:5163:1
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #20 0x000000000327f0b8 __gnu_cxx::__normal_iterator<KTest* const*, std::vector<KTest*, std::allocator<KTest*> > >::__normal_iterator(KTest* const* const&) /usr/lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_iterator.h:804:20
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #21 0x000000000327f0b8 std::vector<KTest*, std::allocator<KTest*> >::begin() const /usr/lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:818:16
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #22 0x000000000327f0b8 std::vector<KTest*, std::allocator<KTest*> >::empty() const /usr/lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1005:16
    2022-04-11 10:30:54.839 [utbot-64TK      ]        RunKleeTask.cpp:66       1| .   .   #23 0x000000000327f0b8 run_klee_on_function(int, char**, char**, std::unique_ptr<KleeHandler, std::default_delete<KleeHandler> >&, std::unique_ptr<klee::Interpreter, std::default_delete<klee::Interpreter> >&, llvm::Module*, std::vector<bool, std::allocator<bool> >&, std::vector<std::unique_ptr<llvm::Module, std::default_delete<llvm::Module> >, std::allocator<std::unique_ptr<llvm::Module, std::default_delete<llvm::Module> > > >&) /home/utbot/UTBotCpp/submodules/klee/build/../lib/Runner/run_klee.cpp:1554:19
    
    bug klee 
    opened by operasfantom 3
  • Incomplete type of expected variable for 'void *' argument

    Incomplete type of expected variable for 'void *' argument

    Steps to reproduce

    1. Open and configure project coreutils
    2. Generate tests for gnulib/lib/free.c
    3. Try to run tests
    4. See logs

    Logs

    /home/utbot/projects/coreutils/utbot_tests/gnulib/lib/free_test.cpp:19:10: error: variable has incomplete type 'void'
        void expected_p = 0;
    

    Test

    TEST(error, rpl_free_test_1)
    {
        __attribute__ ((aligned(16))) unsigned char p = 0;
        rpl_free(&p);
        void expected_p = 0;
        EXPECT_EQ(expected_p, p);
    }
    

    Questions

    Should we check the pointer if it is freed? Should we check 'void *' output variables at all?

    bug 
    opened by operasfantom 2
  • Invalid test generated with declared 'void' variable

    Invalid test generated with declared 'void' variable

    Project: libbpf File: libbpf/src/strset.c Function: strset__add_str Generated test:

    TEST(error, strset__add_str_test_5)
    {
        struct strset set = {NULL, 0UL, 10UL, 0UL, NULL};
        char s[] = "bcacbccccb";
        void utbotInnerVar1 = 0;
        set.strs_data = &utbotInnerVar1;
        set.strs_hash = &utbotInnerVar1;
        strset__add_str(&set, s);
        struct strset expected_set = {NULL, 0UL, 0UL, 0UL, NULL};
        EXPECT_EQ(expected_set.strs_data_len, set.strs_data_len);
        EXPECT_EQ(expected_set.strs_data_cap, set.strs_data_cap);
        EXPECT_EQ(expected_set.strs_data_max_len, set.strs_data_max_len);
    }
    

    Error:

    /home/utbot/projects/libbpf/tests/src/strset_test.cpp:67:10: error: variable has incomplete type 'void'
        void utbotInnerVar1 = 0;
    
    bug 
    opened by operasfantom 2
  • [c++] Generation tests for class with private members

    [c++] Generation tests for class with private members

    Add ability to generate tests for classes with private member. Access to private in klee and tests by hliberacki/cpp-member-accessor. For check access right add AccessSpecifier to field and fill by clang getAccess().

    planned klee file code

    MEMBER_ACCESSOR(point_x, point, x, int)
    MEMBER_ACCESSOR(point_y, point, y, int)
    
    int klee_entry__private_set_zero(int utbot_argc, char ** utbot_argv, char ** utbot_envp) {
        class point t;
        klee_make_symbolic(&t, sizeof(t), "t");
        klee_prefer_cex(&t, accessor::accessMember<point_x>(t) >= -10  & accessor::accessMember<point_x>(t) <= 10);
        klee_prefer_cex(&t, accessor::accessMember<point_y>(t) >= -10  & accessor::accessMember<point_y>(t) <= 10);
        //////////////////////////////////////////// 
        class point t_post;
        klee_make_symbolic(&t_post, sizeof(t_post), "t_post");
    set_zero(t);
        klee_assume(accessor::accessMember<point_x>(t) == accessor::accessMember<point_x>(t_post));
        klee_assume(accessor::accessMember<point_y>(t) == accessor::accessMember<point_y>(t_post));
        return 0;
    }
    

    planned result test code (probably MEMBER_ACCESSOR will move to header)

    MEMBER_ACCESSOR(point_x, point, x, int)
    MEMBER_ACCESSOR(point_y, point, y, int)
    
    TEST(regression, set_zero_test_1)
    {
        class point t = {0, 0};
        set_zero(t);
        class point expected_t = {0, 0};
        EXPECT_EQ(accessor::accessMember<point_x>(expected_t), accessor::accessMember<point_x>(t));
        EXPECT_EQ(accessor::accessMember<point_y>(expected_t), accessor::accessMember<point_y>(t));
    }
    
    cpp 
    opened by ladisgin 2
  • Compile tests 2 way by shared lib or object. issue-143

    Compile tests 2 way by shared lib or object. issue-143

    This pr fix issue-143 create 3 makefile for 1 file:

    1. same as before commit with name __filename_shared.mk
    2. like after this commit with name __filename_obj.mk.
    3. same name as before that has three targets
    • bin that just call bin of __filename_shared.mk
    • run try call run target of __filename_shared.mk and if fail call run target of __filename_obj.mk
    • clean just run clean target __filename_shared.mk and __filename_obj.mk.
    opened by ladisgin 1
  • [coreutils] Running tests for 'gnulib/lib/modechange.c' failed

    [coreutils] Running tests for 'gnulib/lib/modechange.c' failed

    Steps to reproduce

    1. Open and configure project coreutils
    2. Choose target libcoreutils.a
    3. Generate tests for file gnulib/lib/modechange.c
    4. Run tests
    5. See logs

    Wrong comparison of structs

    Logs

    In file included from /home/utbot/projects/coreutils/utbot_tests/gnulib/lib/modechange_test.cpp:8:
    /utbot_distr/gtest/googletest/include/gtest/gtest.h:1527:11: error: invalid operands to binary expression ('const UTBot::mode_change' and 'const UTBot::mode_change')
      if (lhs == rhs) {
          ~~~ ^  ~~~
    /utbot_distr/gtest/googletest/include/gtest/gtest.h:1554:12: note: in instantiation of function template specialization 'testing::internal::CmpHelperEQ<UTBot::mode_change, UTBot::mode_change>' requested here
        return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
               ^
    /home/utbot/projects/coreutils/utbot_tests/gnulib/lib/modechange_test.cpp:28:9: note: in instantiation of function template specialization 'testing::internal::EqHelper::Compare<UTBot::mode_change, UTBot::mode_change, nullptr>' requested here
            EXPECT_EQ(expected[it_3634_0], actual[it_3634_0]);
            ^
    /utbot_distr/gtest/googletest/include/gtest/gtest.h:2028:54: note: expanded from macro 'EXPECT_EQ'
      EXPECT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2)
                                                         ^
    /utbot_distr/gtest/googletest/include/gtest/gtest.h:1518:13: note: candidate function not viable: no known conversion from 'const UTBot::mode_change' to 'testing::internal::faketype' for 1st argument
    inline bool operator==(faketype, faketype) { return true; }
                ^
    1 error generated.
    

    Code

    TEST(regression, make_node_op_equals_test_1)
    {
        struct mode_change * actual = make_node_op_equals(0U, 0U);
        __attribute__ ((aligned(1))) struct mode_change expected[1] = {{'=', '\x01', 4095U, 0U, 0U}};
        for (int it_3634_0 = 0; it_3634_0 < 1; it_3634_0 ++) {
            EXPECT_EQ(expected[it_3634_0], actual[it_3634_0]);
        }
    }
    
    bug 
    opened by operasfantom 1
  • [coreutils] Running tests for 'gnulib/lib/long-options.c' failed

    [coreutils] Running tests for 'gnulib/lib/long-options.c' failed

    Steps to reproduce

    1. Open and configure project coreutils
    2. Choose target libcoreutils.a
    3. Generate tests for file gnulib/lib/long-options.c
    4. Run tests
    5. See logs

    Wrong type for output value of 'char **' argument (should be 'char **' or (rather) not to be at all)

    Logs

    /home/utbot/projects/coreutils/utbot_tests/gnulib/lib/long-options_test.cpp:39:10: error: excess elements in scalar initializer
        char expected_argv = {'c', 'a', 'c', 'c'};
    

    Code

    TEST(regression, parse_long_options_test_1)
    {
        __attribute__ ((aligned(1))) char _argv[2][2] = {{'c', 'a'}, {'c', 'c'}};
        char ** argv = (char **) calloc(3, sizeof(char *));
        for (int it_4668_0 = 0; it_4668_0 < 2; it_4668_0 ++) {
            argv[it_4668_0] = _argv[it_4668_0];
        }
        argv[2] = NULL;
        char command_name[] = "ccccabcccc";
        char package[] = "cccbcccbcc";
        char version[] = "cccccccccc";
        parse_long_options(2, argv, command_name, package, version, _parse_long_options_usage_func_stub);
        char expected_argv = {'c', 'a', 'c', 'c'};
        for (int it_4669_0 = 0; it_4669_0 < 2; it_4669_0 ++) {
            for (int it_4669_1 = 0; it_4669_1 < 2; it_4669_1 ++) {
                EXPECT_EQ(expected_argv[it_4669_0][it_4669_1], _argv[it_4669_0][it_4669_1]);
            }
        }
    }
    
    bug 
    opened by operasfantom 1
  • [coreutils] Running tests for 'lib/parse-datetime.c' failed

    [coreutils] Running tests for 'lib/parse-datetime.c' failed

    Steps to reproduce

    1. Open and configure project coreutils
    2. Choose target libcoreutils.a
    3. Generate tests for file lib/parse-datetime.c
    4. Run tests
    5. See logs

    Duplicated const specifier (noncritical)

    Logs

    /home/utbot/projects/coreutils/utbot_tests/lib/parse-datetime_test.cpp:697:11: warning: duplicate 'const' declaration specifier [-Wduplicate-decl-specifier]
        const const char * actual = str_days(&pc, buffer, 1);
              ^~~~~~
    

    Code

    TEST(regression, str_days_test_1)
    {
        parser_control pc = {NULL, 0L, 0, 0, 0, 0, {false, 0L, 0L}, 0L, 0L, 0L, 0L, {0L, 0L}, {0L, 0L, 0L, 0L, 0L, 0L, 0}, false, false, 0L, 0L, 0L, 0L, 0L, 0L, false, false, false, false, false, false, false, false, false, {{NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}}};
        char buffer[] = "cccccccccc";
        const const char * actual = str_days(&pc, buffer, 1);
        ....
    

    Wrong type for output value of 'char *' argument (should be 'char []')

    Logs

    /home/utbot/projects/coreutils/utbot_tests/lib/parse-datetime_test.cpp:745:10: error: excess elements in scalar initializer
        char expected_buffer = {'\0', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', '\0'};
    

    Code

        char expected_buffer = {'\0', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', '\0'};
        for (int it_3840_0 = 0; it_3840_0 < 10; it_3840_0 ++) {
            EXPECT_EQ(expected_buffer[it_3840_0], buffer[it_3840_0]);
        }
    
    bug 
    opened by operasfantom 1
  • UTBotCpp-235 Ambiguous restoration of the source file name from the test file #235

    UTBotCpp-235 Ambiguous restoration of the source file name from the test file #235

    UTBotCpp-235 Ambiguous restoration of the source file name from the test file #235

    Encoding the file extension into the test file name as _dot_<ext-without-dot> suffix. Related with #173 (Collection of coverage takes too long)

    bug cpp 
    opened by alexey-utkin 0
  • Ambiguous restoration of the source file name from the test file

    Ambiguous restoration of the source file name from the test file

    The API call Paths::sourcePathToTestName do not encode the source file extension into the result (the test file name) . As a result the paired convertor Paths::testPathToSourceName has no information for correct decoding in the case of C++.

    For example, in the current implementation the round conversion produces an incorrect result: Paths::sourcePathToTestName("src.cpp") -> "src_test.cpp" but Paths::testPathToSourceName("src_test.cpp") -> "src_test.c"

    It leads to performance issue #173 (filtering is omitted in presence of unknown files)

    Suggested solution: encode the file extension into the test name: Paths::sourcePathToTestName("src.cpp") -> "src_dot_cpp_test.cpp" We need _dot_ separator to distinct the encoded extension from a part of composite name, like simple_class_test.cpp.

    cpp 
    opened by alexey-utkin 0
  • Optimize makefiles generated for project

    Optimize makefiles generated for project

    Steps to reproduce:

    1. Configure coreutils.
    2. Run UTBotCpp via CLI: ./utbot generate --project-path <path to coreutils> project.
    3. After generation finished go to build/utbot/make directory in coreutils.
    4. See disk usage (for unix systems run du -sh)

    Enhancement

    Currently, makefiles use ~0.5Gb of disk. However, there is a lot of copy-paste there. Disk usage can be strongly improved by moving common part of code for files from one target into another file and reusing it afterwards.

    enhancement 
    opened by Lana243 0
  • [coreutils] Out of RAM while generating tests for project

    [coreutils] Out of RAM while generating tests for project

    Steps to reproduce:

    1. Configure coreutils
    2. Run utbot via CLI ./utbot all --project-path <path to coreutils>
    3. See how UTBotCpp uses more than 30 Gb of RAM.
    enhancement 
    opened by Lana243 0
  • Compile database may content response files

    Compile database may content response files

    Compilation database may content response file into command like

    "command" : "clang -rdynamic @CMakeFiles/subdir/objects.rsp -o project",
    "directory" : "/home/utbot/project/build",
    "files" : 
    [
        "/home/utbot/project/file.o"
    ]
    

    Now we just ignore this parameter, as result target for project in GenerationLinkMakefile.mk has error no input files

    Workaround override flags into CMakeLists.txt to:

    # Use response files always
    set(CMAKE_ASM_USE_RESPONSE_FILE_FOR_INCLUDES 0)
    set(CMAKE_C_USE_RESPONSE_FILE_FOR_INCLUDES 0)
    set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES 0)
    
    set(CMAKE_ASM_USE_RESPONSE_FILE_FOR_OBJECTS 0)
    set(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 0)
    set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 0)
    
    set(CMAKE_ASM_USE_RESPONSE_FILE_FOR_LIBRARIES 0)
    set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES 0)
    set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_LIBRARIES 0)
    
    bug 
    opened by ladisgin 0
Releases(v1.0.93)
Boiler plate template for C++ projects, with CMake, Doctest, Travis CI, Appveyor, Github Actions and coverage reports.

Boiler plate for C++ projects This is a boiler plate for C++ projects. What you get: Sources, headers and mains separated in distinct folders Use of m

Bendik Samseth 462 May 9, 2022
A command-line tool to generate Linux manual pages from C source code.

mangen A command-line tool to generate Linux manual pages from C source code. Description mangen is, as said above, a program to generate Linux manual

null 2 Nov 15, 2021
This is the massive repository for all code for the class CIS3250 Fall Semester.

========================================== Transforming Shapes Through Matrix Multiplication ========================================== Description o

null 4 Nov 25, 2021
The new Windows Terminal and the original Windows console host, all in the same place!

The new Windows Terminal and the original Windows console host, all in the same place!

Microsoft 83.1k May 16, 2022
Toybox: all-in-one Linux command line.

Toybox: all-in-one Linux command line.

Rob Landley 1.6k May 3, 2022
nicegraf-shaderc is a command-line tool that transforms HLSL code into shaders for various graphics APIs.

User Manual Table of Contents Introduction Project Status Obtaining the Source Code and Building Running Defining Techniques Generated Header File Pip

nicebyte 87 May 2, 2022
CodeCompactor is an open source program designed for reducing the size of your code!

CodeCompacter An exciting, new and open source program for reducing the length of your code! Usage: ./CodeCompacter {ARGUMENTS} Arguments: -L {languag

Henry Dewsnap 1 Nov 28, 2021
This repository contains the source code of the project(StereoCraft) that we have developed for the Mixed Reality Hackathon organized by Microsoft using StereoKit SDK

StereoCraft - A block-building like experience built using StereoKit This repository contains the source code of the project that we have developed fo

G Bhanuteja 2 Dec 23, 2021
Bootloader recovery and updater tool for StarFive JH17x0 SoCs.

JH71xx-tools Bootloader recovery and updater tool for StarFive JH7100 SoCs.

Kali Prasad 12 May 1, 2022
A command line tool for numerically computing Out-of-time-ordered correlations for N=4 supersymmetric Yang-Mills theory and Beta deformed N=4 SYM.

A command line tool to compute OTOC for N=4 supersymmetric Yang–Mills theory This is a command line tool to numerically compute Out-of-time-ordered co

Gaoli Chen 1 Oct 16, 2021
CfgManipulator is a fast and powerful tool for working with configuration files for the C++ language

CfgManipulator is a fast and powerful tool for working with configuration files for the C++ language. It can read, create strings and sections, change the value of a string and much more.

Sanya 2 Jan 28, 2022
FastReport.Cloud console tool for Linux and perhaps some other OSes

FastReport Cloud console shell This is a simple console shell to FastReport Cloud service. Prerequests GNU packages for build shell: curl-development

Aleksey Mandrykin 2 Feb 10, 2022
Real time crypto monitoring tool

Real-time Crypto Currency Monitor This monitor is a command line dashboard, it uses ncurses, in combination with the Binance API where it fetches all

Edgar Hernandez 31 Mar 24, 2022
pbr2gltf2 is a command line tool for converting PBR images to a glTF 2.0 material.

pbr2gltf2 is a command line tool for converting PBR images to a glTF 2.0 material. The tool is detecting depending on the filename, which PBR information is stored. It swizzles the images and does reassign the channels to a glTF 2.0 image. The tool stores the images plus a minimal, valid glTF 2.0 file containing the required material, textures and images.

UX3D GmbH 22 Jan 11, 2022
A command-line tool to display colorful distro information.

sjfetch A command-line tool to display colorful distro information.

Fikret Musk 6 Apr 6, 2022
Fegeya Freud, CLI FPaper renderer, based on Totem (`less`-like tool without `--help`)

Fegeya Freud, CLI FPaper renderer, based on Totem (`less`-like tool without `--help`)

Ferhat Geçdoğan 3 Jun 11, 2021
Simple command line tool that processes image files using the FidelityFX Super Resolution (FSR) or Contrast Adaptive Sharpening (CAS) shader systems.

Simple command line tool that processes image files using the FidelityFX Super Resolution (FSR) or Contrast Adaptive Sharpening (CAS) shader systems.

GPUOpen Effects 164 May 3, 2022
A command line tool with no external dependencies to print information about an X server instance.

xinfo A command line tool with no external dependencies to print information about an X server instance. Building and running To build the code in thi

Jean-Michel Gorius 6 Jan 13, 2022
A C++ console tool to tracker baby actions.

BabyTracker This is a C++ console tool to tracker baby actions. Currently it supports adding Sleep Sessions Breast Feed Sessions Bottle Feed Sessions

YuchenPersonal 1 Oct 17, 2021