Skip to content

Commit 92e02b5

Browse files
committed
Fix residual memory leak from narrow_argv
1 parent f1ae9fe commit 92e02b5

File tree

10 files changed

+35
-15
lines changed

10 files changed

+35
-15
lines changed

src/cbmc/cbmc_main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ extern unsigned long long irep_cmp_ne_cnt;
3535
int wmain(int argc, const wchar_t **argv_wide)
3636
{
3737
auto vec=narrow_argv(argc, argv_wide);
38-
auto argv=vec.data();
38+
auto narrow=to_c_str_array(std::begin(vec), std::end(vec));
39+
auto argv=narrow.data();
3940
#else
4041
int main(int argc, const char **argv)
4142
{

src/clobber/clobber_main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ Author: Daniel Kroening, [email protected]
1717
int wmain(int argc, const wchar_t **argv_wide)
1818
{
1919
auto vec=narrow_argv(argc, argv_wide);
20-
auto argv=vec.data();
20+
auto narrow=to_c_str_array(std::begin(vec), std::end(vec));
21+
auto argv=narrow.data();
2122
#else
2223
int main(int argc, const char **argv)
2324
{

src/goto-analyzer/goto_analyzer_main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ Author: Daniel Kroening, [email protected]
1717
int wmain(int argc, const wchar_t **argv_wide)
1818
{
1919
auto vec=narrow_argv(argc, argv_wide);
20-
auto argv=vec.data();
20+
auto narrow=to_c_str_array(std::begin(vec), std::end(vec));
21+
auto argv=narrow.data();
2122
#else
2223
int main(int argc, const char **argv)
2324
{

src/goto-cc/goto_cc_main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ int main(int argc, const char **argv)
4646
{
4747
#ifdef _MSC_VER
4848
auto vec=narrow_argv(argc, argv_wide);
49-
auto argv=vec.data();
49+
auto narrow=to_c_str_array(std::begin(vec), std::end(vec));
50+
auto argv=narrow.data();
5051
#endif
5152

5253
if(argv==NULL || argc<1)

src/goto-diff/goto_diff_main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ extern unsigned long long irep_cmp_ne_cnt;
2727
int wmain(int argc, const wchar_t **argv_wide)
2828
{
2929
auto vec=narrow_argv(argc, argv_wide);
30-
auto argv=vec.data();
30+
auto narrow=to_c_str_array(std::begin(vec), std::end(vec));
31+
auto argv=narrow.data();
3132
#else
3233
int main(int argc, const char **argv)
3334
{

src/goto-instrument/goto_instrument_main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ Author: Daniel Kroening, [email protected]
1717
int wmain(int argc, const wchar_t **argv_wide)
1818
{
1919
auto vec=narrow_argv(argc, argv_wide);
20-
auto argv=vec.data();
20+
auto narrow=to_c_str_array(std::begin(vec), std::end(vec));
21+
auto argv=narrow.data();
2122
#else
2223
int main(int argc, const char **argv)
2324
{

src/memory-models/mmcc_main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ Author: Daniel Kroening, [email protected]
1717
int wmain(int argc, const wchar_t **argv_wide)
1818
{
1919
auto vec=narrow_argv(argc, argv_wide);
20-
auto argv=vec.data();
20+
auto narrow=to_c_str_array(std::begin(vec), std::end(vec));
21+
auto argv=narrow.data();
2122
#else
2223
int main(int argc, const char **argv)
2324
{

src/symex/symex_main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ Author: Daniel Kroening, [email protected]
1717
int wmain(int argc, const wchar_t **argv_wide)
1818
{
1919
auto vec=narrow_argv(argc, argv_wide);
20-
auto argv=vec.data();
20+
auto narrow=to_c_str_array(std::begin(vec), std::end(vec));
21+
auto argv=narrow.data();
2122
#else
2223
int main(int argc, const char **argv)
2324
{

src/util/unicode.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -153,16 +153,15 @@ std::string utf32_to_utf8(const std::basic_string<unsigned int> &s)
153153
return result;
154154
}
155155

156-
std::vector<const char *> narrow_argv(int argc, const wchar_t **argv_wide)
156+
std::vector<std::string> narrow_argv(int argc, const wchar_t **argv_wide)
157157
{
158158
if(argv_wide==NULL)
159-
return std::vector<const char *>();
159+
return std::vector<std::string>();
160160

161-
std::vector<const char *> argv_narrow(argc+1);
162-
argv_narrow[argc]=0;
161+
std::vector<std::string> argv_narrow(argc);
163162

164-
for(int i=0; i<argc; i++)
165-
argv_narrow[i]=strdup(narrow(argv_wide[i]).c_str());
163+
for(int i=0; i!=argc; ++i)
164+
argv_narrow[i]=narrow(argv_wide[i]);
166165

167166
return argv_narrow;
168167
}

src/util/unicode.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Author: Daniel Kroening, [email protected]
1010
#ifndef CPROVER_UTIL_UNICODE_H
1111
#define CPROVER_UTIL_UNICODE_H
1212

13+
#include <algorithm>
1314
#include <string>
1415
#include <vector>
1516

@@ -27,6 +28,18 @@ std::wstring utf8_to_utf16_big_endian(const std::string &);
2728
std::wstring utf8_to_utf16_little_endian(const std::string &);
2829
std::string utf16_little_endian_to_ascii(const std::wstring &in);
2930

30-
std::vector<const char *> narrow_argv(int argc, const wchar_t **argv_wide);
31+
std::vector<std::string> narrow_argv(int argc, const wchar_t **argv_wide);
32+
33+
template <typename It>
34+
std::vector<const char *> to_c_str_array(It b, It e)
35+
{
36+
// Assumes that walking the range will be faster than repeated allocation
37+
std::vector<const char *> ret(std::distance(b, e) + 1, nullptr);
38+
std::transform(b, e, std::begin(ret), [] (const std::string & s)
39+
{
40+
return s.c_str();
41+
});
42+
return ret;
43+
}
3144

3245
#endif // CPROVER_UTIL_UNICODE_H

0 commit comments

Comments
 (0)