10000 fix: macos build memory leaks by a1exxd0 · Pull Request #2 · a1exxd0/scc-modules · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

fix: macos build memory leaks #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jun 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED True)

# Set compiler flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -g")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -g -fsanitize=address")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3 -march=native -flto")

# Add source directory
Expand Down
21 changes: 21 additions & 0 deletions include/command_read.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,30 @@ char** format_args(std::vector<std::string> &&cmds);
* @brief Formats a vector of string arguments into expected format
* char*[] for passing into get_arguments(...)
*
*
* You MUST remember to use destroy_formatted_args after this.
*
* @return an array of c-style strings of length (cmds.size() + 1)
*/
char** format_args(std::vector<std::string> &cmds);

/**
* @brief Explicit destructor for formatted args for testing. Requires
* that you keep whatever you passed into format_args()
*
* @param args: pointer to heap-allocated array
* @param cmds: vector you passed into format_args
*/
void destroy_formatted_args(char** args, std::vector<std::string> &cmds);

/**
* @brief Explicit destructor for formatted args for testing. Requires
* that you keep whatever you passed into format_args()
*
* @param args: pointer to heap-allocated array
* @param cmds: vector you passed into format_args
*/
void destroy_formatted_args(char** args, std::vector<std::string> &&cmds);

} // namespace smod

Expand Down
28 changes: 24 additions & 4 deletions src/command_read.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <map>
#include <functional>
#include <sstream>
#include <cstring>

/**
* TODO:
Expand Down Expand Up @@ -45,26 +46,45 @@ bool operator==(const input_arguments &arg1, const input_arguments &arg2)

char** format_args(std::vector<std::string> &&cmds)
{
char** args = new char*[cmds.size()];
char** args = new char*[cmds.size() + 1]; // Allocate array of char* pointers

for (std::size_t i = 0; i < cmds.size(); i++) {
args[i] = const_cast<char*>(cmds[i].c_str());
args[i] = new char[cmds[i].size() + 1]; // Allocate memory for each string (+1 for null terminator)
std::strcpy(args[i], cmds[i].c_str()); // Copy string into newly allocated memory
}

args[cmds.size()] = nullptr; // Null-terminate the array
return args;
}

char** format_args(std::vector<std::string> &cmds)
{
char** args = new char*[cmds.size()];
char** args = new char*[cmds.size() + 1]; // Allocate array of char* pointers

for (std::size_t i = 0; i < cmds.size(); i++) {
args[i] = const_cast<char*>(cmds[i].c_str());
args[i] = new char[cmds[i].size() + 1]; // Allocate memory for each string (+1 for null terminator)
std::strcpy(args[i], cmds[i].c_str()); // Copy string into newly allocated memory
}

args[cmds.size()] = nullptr; // Null-terminate the array
return args;
}

void destroy_formatted_args(char** args, std::vector<std::string> &cmds) {
for (std::size_t i = 0; i < cmds.size(); i++) {
delete[] args[i];
}
delete[] args;
}

void destroy_formatted_args(char** args, std::vector<std::string> &&cmds) {
for (std::size_t i = 0; i < cmds.size(); i++) {
delete[] args[i];
}

delete[] args;
}

// ---------- PRIVATE METHODS ---------- //

/**
Expand Down
34 changes: 17 additions & 17 deletions test/argument_parsing/test_parse_arguments_1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,21 @@ TEST(Full_Parse_Arguments, Empty_Parse)
{
auto args = smod::format_args({"smodule"});
EXPECT_THROW(smod::get_arguments(1, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, {"smodule"});
}

TEST(Full_Parse_Arguments, Keyword_As_Parameter)
{
auto args = smod::format_args({"smodule", "avail", "load"});
EXPECT_THROW(smod::get_arguments(3, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "avail", "load"});
}

TEST(Full_Parse_Arguments, No_Command)
{
auto args = smod::format_args({"smodule", "cpp15", "openmpi/cpp15"});
EXPECT_THROW(smod::get_arguments(3, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "cpp15", "openmpi/cpp15"});
}

TEST(Full_Parse_Arguments, Lots_of_Arguments)
Expand All @@ -34,7 +34,7 @@ TEST(Full_Parse_Arguments, Lots_of_Arguments)
for (std::size_t i = 0; i < 100; i++) cmds.push_back("cpp15");
auto args = smod::format_args(cmds);
EXPECT_THROW(smod::get_arguments(102, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, cmds);
}

// ---------- AVAIL ---------- //
Expand All @@ -47,14 +47,14 @@ TEST(Full_Parse_Arguments, Avail_Positive)
auto args = smod::format_args({"smodule", "avail"});
auto test_case = smod::get_arguments(2, args);

ASSERT_EQ(expected, test_case);
smod::destroy_formatted_args(args, {"smodule", "avail"});
}

TEST(Full_Parse_Arguments, Avail_Negative)
{
auto args = smod::format_args({"smodule", "avail", "cpp15"});
EXPECT_THROW(smod::get_arguments(3, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "avail", "cpp15"});
}

// ---------- LOAD ---------- //
Expand All @@ -68,21 +68,21 @@ TEST(Full_Parse_Arguments, Load_Positive)
auto test_case = smod::get_arguments(3, args);

ASSERT_EQ(test_case, expected);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "load", "cpp15"});
}

TEST(Full_Parse_Arguments, Load_Too_Many_Args)
{
auto args = smod::format_args({"smodule", "load", "cpp15", "openmpi/cpp15"});
EXPECT_THROW(smod::get_arguments(4, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "load", "cpp15", "openmpi/cpp15"});
}

TEST(Full_Parse_Arguments, Load_Too_Few_Args)
{
auto args = smod::format_args({"smodule", "load"});
EXPECT_THROW(smod::get_arguments(2, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "load"});
}

// ---------- UNLOAD ---------- //
Expand All @@ -96,7 +96,7 @@ TEST(Full_Parse_Arguments, Unload_Positive)
auto test_case = smod::get_arguments(3, args);

ASSERT_EQ(test_case, expected);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "unload", "cpp15"});
}

TEST(Full_Parse_Arguments, Unload_Aliased_Rm)
Expand All @@ -108,21 +108,21 @@ TEST(Full_Parse_Arguments, Unload_Aliased_Rm)
auto test_case = smod::get_arguments(3, args);

ASSERT_EQ(test_case, expected);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "rm", "cpp15"});
}

TEST(Full_Parse_Arguments, Unload_Too_Many_Args)
{
auto args = smod::format_args({"smodule", "unload", "cpp15", "openmpi/cpp15"});
EXPECT_THROW(smod::get_arguments(4, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "unload", "cpp15", "openmpi/cpp15"});
}

TEST(Full_Parse_Arguments, Unload_Too_Few_Args)
{
auto args = smod::format_args({"smodule", "unload"});
EXPECT_THROW(smod::get_arguments(2, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "unload"});
}

// ---------- SPIDER ---------- //
Expand All @@ -136,21 +136,21 @@ TEST(Full_Parse_Arguments, Spider_Positive)
auto test_case = smod::get_arguments(3, args);

ASSERT_EQ(test_case, expected);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "spider", "cpp15"});
}

TEST(Full_Parse_Arguments, Spider_Too_Many_Args)
{
auto args = smod::format_args({"smodule", "spider", "cpp15", "openmpi/cpp15"});
EXPECT_THROW(smod::get_arguments(4, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "spider", "cpp15", "openmpi/cpp15"});
}

TEST(Full_Parse_Arguments, Spider_Too_Few_Args)
{
auto args = smod::format_args({"smodule", "unload"});
auto args = smod::format_args({"smodule", "spider"});
EXPECT_THROW(smod::get_arguments(2, args), std::invalid_argument);
delete[] args;
smod::destroy_formatted_args(args, {"smodule", "spider"});
}

int main(int argc, char **argv)
Expand Down
Loading
0