Следующая функция принадлежит проекту CoinUtils, который используется в решателе линейного программирования CBC с открытым исходным кодом.
/** Returns strdup or NULL if original NULL */
inline char *CoinStrdup(const char *name)
{
char *dup = NULL;
if (name) {
const int len = static_cast< int >(strlen(name));
dup = static_cast< char * >(malloc(len + 1));
CoinMemcpyN(name, len, dup);
dup[len] = 0;
}
return dup;
}
Я получаю следующую ошибку при компиляции в режиме отладки в GCC 11 под Ubuntu 22.04.
error: call of overloaded ‘malloc(int)’ is ambiguous
624 | dup = static_cast< char * >(malloc(len + 1));
Может кто-нибудь объяснить, что происходит?
Полное сообщение об ошибке таково:
In file included from /src/third_party/coin-or/Clp/src/ClpModel.hpp:21,
from /src/third_party/coin-or/Clp/src/ClpSimplex.hpp:16,
from /src/engine/core/../core/lp_interface/lp_osi_interface.h:12,
from /src/test/lp_tests.h:13,
from /src/test/lp_tests.cpp:5:
/src/third_party/coin-or/CoinUtils/src/CoinHelperFunctions.hpp: In function ‘char* CoinStrdup(const char*)’:
/src/third_party/coin-or/CoinUtils/src/CoinHelperFunctions.hpp:624:39: error: call of overloaded ‘malloc(int)’ is ambiguous
624 | dup = static_cast< char * >(malloc(len + 1));
| ~~~~~~^~~~~~~~~
In file included from /usr/include/c++/11/cstdlib:75,
from /usr/include/c++/11/ext/string_conversions.h:41,
from /usr/include/c++/11/bits/basic_string.h:6608,
from /usr/include/c++/11/string:55,
from /usr/include/c++/11/bits/locale_classes.h:40,
from /usr/include/c++/11/bits/ios_base.h:41,
from /usr/include/c++/11/ios:42,
from /usr/include/c++/11/ostream:38,
from /usr/include/c++/11/iostream:39,
from /src/test/testing_utilities.h:8,
from /src/test/lp_tests.h:8,
from /src/test/lp_tests.cpp:5:
/usr/include/stdlib.h:540:14: note: candidate: ‘void* malloc(size_t)’
540 | extern void *malloc (size_t __size) __THROW __attribute_malloc__
| ^~~~~~
In file included from /src/third_party/header_only/armadillo-11.1.0/include/armadillo:134,
from /src/test/testing_utilities.h:9,
from /src/test/lp_tests.h:8,
from /src/test/lp_tests.cpp:5:
/src/third_party/header_only/armadillo-11.1.0/include/armadillo_bits/translate_superlu.hpp:332:3: note: candidate: ‘void* arma::superlu::malloc(std::size_t)’
332 | malloc(size_t N)
| ^~~~~~
In file included from /src/third_party/coin-or/CoinUtils/src/CoinModel.hpp:8,
from /src/engine/core/../core/lp_interface/lp_osi_interface.h:16,
from /src/test/lp_tests.h:13,
from /src/test/lp_tests.cpp:5:
/src/third_party/coin-or/CoinUtils/src/CoinModelUseful.hpp: In destructor ‘CoinYacc::~CoinYacc()’:
/src/third_party/coin-or/CoinUtils/src/CoinModelUseful.hpp:200:11: error: call of overloaded ‘free(char*&)’ is ambiguous
200 | free(symbuf);
| ~~~~^~~~~~~~
In file included from /usr/include/c++/11/cstdlib:75,
from /usr/include/c++/11/ext/string_conversions.h:41,
from /usr/include/c++/11/bits/basic_string.h:6608,
from /usr/include/c++/11/string:55,
from /usr/include/c++/11/bits/locale_classes.h:40,
from /usr/include/c++/11/bits/ios_base.h:41,
from /usr/include/c++/11/ios:42,
from /usr/include/c++/11/ostream:38,
from /usr/include/c++/11/iostream:39,
from /src/test/testing_utilities.h:8,
from /src/test/lp_tests.h:8,
from /src/test/lp_tests.cpp:5:
/usr/include/stdlib.h:555:13: note: candidate: ‘void free(void*)’
555 | extern void free (void *__ptr) __THROW;
| ^~~~
In file included from /src/third_party/header_only/armadillo-11.1.0/include/armadillo:134,
from /src/test/testing_utilities.h:9,
from /src/test/lp_tests.h:8,
from /src/test/lp_tests.cpp:5:
/src/third_party/header_only/armadillo-11.1.0/include/armadillo_bits/translate_superlu.hpp:341:3: note: candidate: ‘void arma::superlu::free(void*)’
341 | free(void* mem)
| ^~~~
In file included from /src/third_party/coin-or/CoinUtils/src/CoinModel.hpp:8,
from /src/engine/core/../core/lp_interface/lp_osi_interface.h:16,
from /src/test/lp_tests.h:13,
from /src/test/lp_tests.cpp:5:
/src/third_party/coin-or/CoinUtils/src/CoinModelUseful.hpp:205:11: error: call of overloaded ‘free(char*&)’ is ambiguous
205 | free(s->name);
| ~~~~^~~~~~~~~
In file included from /usr/include/c++/11/cstdlib:75,
from /usr/include/c++/11/ext/string_conversions.h:41,
from /usr/include/c++/11/bits/basic_string.h:6608,
from /usr/include/c++/11/string:55,
from /usr/include/c++/11/bits/locale_classes.h:40,
from /usr/include/c++/11/bits/ios_base.h:41,
from /usr/include/c++/11/ios:42,
from /usr/include/c++/11/ostream:38,
from /usr/include/c++/11/iostream:39,
from /src/test/testing_utilities.h:8,
from /src/test/lp_tests.h:8,
from /src/test/lp_tests.cpp:5:
/usr/include/stdlib.h:555:13: note: candidate: ‘void free(void*)’
555 | extern void free (void *__ptr) __THROW;
| ^~~~
In file included from /src/third_party/header_only/armadillo-11.1.0/include/armadillo:134,
from /src/test/testing_utilities.h:9,
from /src/test/lp_tests.h:8,
from /src/test/lp_tests.cpp:5:
/src/third_party/header_only/armadillo-11.1.0/include/armadillo_bits/translate_superlu.hpp:341:3: note: candidate: ‘void arma::superlu::free(void*)’
341 | free(void* mem)
| ^~~~
In file included from /src/third_party/coin-or/CoinUtils/src/CoinModel.hpp:8,
from /src/engine/core/../core/lp_interface/lp_osi_interface.h:16,
from /src/test/lp_tests.h:13,
from /src/test/lp_tests.cpp:5:
/src/third_party/coin-or/CoinUtils/src/CoinModelUseful.hpp:208:11: error: call of overloaded ‘free(symrec*&)’ is ambiguous
208 | free(symtable);
| ~~~~^~~~~~~~~~
In file included from /usr/include/c++/11/cstdlib:75,
from /usr/include/c++/11/ext/string_conversions.h:41,
from /usr/include/c++/11/bits/basic_string.h:6608,
from /usr/include/c++/11/string:55,
from /usr/include/c++/11/bits/locale_classes.h:40,
from /usr/include/c++/11/bits/ios_base.h:41,
from /usr/include/c++/11/ios:42,
from /usr/include/c++/11/ostream:38,
from /usr/include/c++/11/iostream:39,
from /src/test/testing_utilities.h:8,
from /src/test/lp_tests.h:8,
from /src/test/lp_tests.cpp:5:
/usr/include/stdlib.h:555:13: note: candidate: ‘void free(void*)’
555 | extern void free (void *__ptr) __THROW;
| ^~~~
In file included from /src/third_party/header_only/armadillo-11.1.0/include/armadillo:134,
from /src/test/testing_utilities.h:9,
from /src/test/lp_tests.h:8,
from /src/test/lp_tests.cpp:5:
/src/third_party/header_only/armadillo-11.1.0/include/armadillo_bits/translate_superlu.hpp:341:3: note: candidate: ‘void arma::superlu::free(void*)’
341 | free(void* mem)
| ^~~~
gmake[3]: *** [CMakeFiles/Tests.dir/build.make:8532: CMakeFiles/Tests.dir/src/test/lp_tests.cpp.o] Error 1
gmake[3]: *** Se espera a que terminen otras tareas....
In file included from /src/third_party/coin-or/Clp/src/ClpModel.hpp:21,
from /src/third_party/coin-or/Clp/src/ClpSimplex.hpp:16,
from /src/engine/core/../core/lp_interface/lp_osi_interface.h:12,
from /src/test/lp_tests.h:13,
from /src/test/tests.cpp:20:
/src/third_party/coin-or/CoinUtils/src/CoinHelperFunctions.hpp: In function ‘char* CoinStrdup(const char*)’:
/src/third_party/coin-or/CoinUtils/src/CoinHelperFunctions.hpp:624:39: error: call of overloaded ‘malloc(int)’ is ambiguous
624 | dup = static_cast< char * >(malloc(len + 1));
| ~~~~~~^~~~~~~~~
In file included from /usr/include/c++/11/cstdlib:75,
from /usr/include/c++/11/ext/string_conversions.h:41,
from /usr/include/c++/11/bits/basic_string.h:6608,
from /usr/include/c++/11/string:55,
from /usr/include/c++/11/bits/locale_classes.h:40,
from /usr/include/c++/11/bits/ios_base.h:41,
from /usr/include/c++/11/ios:42,
from /usr/include/c++/11/ostream:38,
from /usr/include/c++/11/iostream:39,
from /src/test/tests.cpp:2:
/usr/include/stdlib.h:540:14: note: candidate: ‘void* malloc(size_t)’
540 | extern void *malloc (size_t __size) __THROW __attribute_malloc__
| ^~~~~~
In file included from /src/third_party/header_only/armadillo-11.1.0/include/armadillo:134,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack/core/arma_extend/arma_extend.hpp:21,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack/base.hpp:87,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack.hpp:25,
from /src/engine/../utils/type_declarations.h:9,
from /src/engine/../utils/armadillo_extension.h:19,
from /src/test/../engine/core/data_structures/bus_data.h:10,
from /src/test/../engine/core/data_structures/numeric_circuit.h:22,
from /src/test/../newton.h:9,
from /src/test/tests.cpp:9:
/src/third_party/header_only/armadillo-11.1.0/include/armadillo_bits/translate_superlu.hpp:332:3: note: candidate: ‘void* arma::superlu::malloc(std::size_t)’
332 | malloc(size_t N)
| ^~~~~~
In file included from /src/third_party/coin-or/CoinUtils/src/CoinModel.hpp:8,
from /src/engine/core/../core/lp_interface/lp_osi_interface.h:16,
from /src/test/lp_tests.h:13,
from /src/test/tests.cpp:20:
/src/third_party/coin-or/CoinUtils/src/CoinModelUseful.hpp: In destructor ‘CoinYacc::~CoinYacc()’:
/src/third_party/coin-or/CoinUtils/src/CoinModelUseful.hpp:200:11: error: call of overloaded ‘free(char*&)’ is ambiguous
200 | free(symbuf);
| ~~~~^~~~~~~~
In file included from /usr/include/c++/11/cstdlib:75,
from /usr/include/c++/11/ext/string_conversions.h:41,
from /usr/include/c++/11/bits/basic_string.h:6608,
from /usr/include/c++/11/string:55,
from /usr/include/c++/11/bits/locale_classes.h:40,
from /usr/include/c++/11/bits/ios_base.h:41,
from /usr/include/c++/11/ios:42,
from /usr/include/c++/11/ostream:38,
from /usr/include/c++/11/iostream:39,
from /src/test/tests.cpp:2:
/usr/include/stdlib.h:555:13: note: candidate: ‘void free(void*)’
555 | extern void free (void *__ptr) __THROW;
| ^~~~
In file included from /src/third_party/header_only/armadillo-11.1.0/include/armadillo:134,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack/core/arma_extend/arma_extend.hpp:21,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack/base.hpp:87,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack.hpp:25,
from /src/engine/../utils/type_declarations.h:9,
from /src/engine/../utils/armadillo_extension.h:19,
from /src/test/../engine/core/data_structures/bus_data.h:10,
from /src/test/../engine/core/data_structures/numeric_circuit.h:22,
from /src/test/../newton.h:9,
from /src/test/tests.cpp:9:
/src/third_party/header_only/armadillo-11.1.0/include/armadillo_bits/translate_superlu.hpp:341:3: note: candidate: ‘void arma::superlu::free(void*)’
341 | free(void* mem)
| ^~~~
In file included from /src/third_party/coin-or/CoinUtils/src/CoinModel.hpp:8,
from /src/engine/core/../core/lp_interface/lp_osi_interface.h:16,
from /src/test/lp_tests.h:13,
from /src/test/tests.cpp:20:
/src/third_party/coin-or/CoinUtils/src/CoinModelUseful.hpp:205:11: error: call of overloaded ‘free(char*&)’ is ambiguous
205 | free(s->name);
| ~~~~^~~~~~~~~
In file included from /usr/include/c++/11/cstdlib:75,
from /usr/include/c++/11/ext/string_conversions.h:41,
from /usr/include/c++/11/bits/basic_string.h:6608,
from /usr/include/c++/11/string:55,
from /usr/include/c++/11/bits/locale_classes.h:40,
from /usr/include/c++/11/bits/ios_base.h:41,
from /usr/include/c++/11/ios:42,
from /usr/include/c++/11/ostream:38,
from /usr/include/c++/11/iostream:39,
from /src/test/tests.cpp:2:
/usr/include/stdlib.h:555:13: note: candidate: ‘void free(void*)’
555 | extern void free (void *__ptr) __THROW;
| ^~~~
In file included from /src/third_party/header_only/armadillo-11.1.0/include/armadillo:134,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack/core/arma_extend/arma_extend.hpp:21,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack/base.hpp:87,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack.hpp:25,
from /src/engine/../utils/type_declarations.h:9,
from /src/engine/../utils/armadillo_extension.h:19,
from /src/test/../engine/core/data_structures/bus_data.h:10,
from /src/test/../engine/core/data_structures/numeric_circuit.h:22,
from /src/test/../newton.h:9,
from /src/test/tests.cpp:9:
/src/third_party/header_only/armadillo-11.1.0/include/armadillo_bits/translate_superlu.hpp:341:3: note: candidate: ‘void arma::superlu::free(void*)’
341 | free(void* mem)
| ^~~~
In file included from /src/third_party/coin-or/CoinUtils/src/CoinModel.hpp:8,
from /src/engine/core/../core/lp_interface/lp_osi_interface.h:16,
from /src/test/lp_tests.h:13,
from /src/test/tests.cpp:20:
/src/third_party/coin-or/CoinUtils/src/CoinModelUseful.hpp:208:11: error: call of overloaded ‘free(symrec*&)’ is ambiguous
208 | free(symtable);
| ~~~~^~~~~~~~~~
In file included from /usr/include/c++/11/cstdlib:75,
from /usr/include/c++/11/ext/string_conversions.h:41,
from /usr/include/c++/11/bits/basic_string.h:6608,
from /usr/include/c++/11/string:55,
from /usr/include/c++/11/bits/locale_classes.h:40,
from /usr/include/c++/11/bits/ios_base.h:41,
from /usr/include/c++/11/ios:42,
from /usr/include/c++/11/ostream:38,
from /usr/include/c++/11/iostream:39,
from /src/test/tests.cpp:2:
/usr/include/stdlib.h:555:13: note: candidate: ‘void free(void*)’
555 | extern void free (void *__ptr) __THROW;
| ^~~~
In file included from /src/third_party/header_only/armadillo-11.1.0/include/armadillo:134,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack/core/arma_extend/arma_extend.hpp:21,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack/base.hpp:87,
from /src/third_party/header_only/mlpack-4.0.0/src/mlpack.hpp:25,
from /src/engine/../utils/type_declarations.h:9,
from /src/engine/../utils/armadillo_extension.h:19,
from /src/test/../engine/core/data_structures/bus_data.h:10,
from /src/test/../engine/core/data_structures/numeric_circuit.h:22,
from /src/test/../newton.h:9,
from /src/test/tests.cpp:9:
/src/third_party/header_only/armadillo-11.1.0/include/armadillo_bits/translate_superlu.hpp:341:3: note: candidate: ‘void arma::superlu::free(void*)’
341 | free(void* mem)
| ^~~~
gmake[3]: *** [CMakeFiles/Tests.dir/build.make:8462: CMakeFiles/Tests.dir/src/test/tests.cpp.o] Error 1
gmake[2]: *** [CMakeFiles/Makefile2:324: CMakeFiles/Tests.dir/all] Error 2
gmake[1]: *** [CMakeFiles/Makefile2:331: CMakeFiles/Tests.dir/rule] Error 2
gmake: *** [Makefile:293: Tests] Error 2
Не решение, а вопрос: зачем использовать malloc в C++ вместо new?
@Chris Иногда вы хотите взаимодействовать с C, который думает, что может free() что-то, что вы malloc() написали.
@Yksisarvinen Я только что обновил ошибку, не так ли?
static_cast<std::size_t>(len + 1)@Элджей Static_cast from 'void *' to 'std::size_t' (aka 'unsigned long') is not allowed
Чтобы это было неоднозначно, должно быть более одной версии malloc для вызова. Пожалуйста, включите полное сообщение об ошибке, которое должно включать все версии найденной функции.
@Kevin Только что отредактировал вопрос, чтобы добавить все
Ваш последний комментарий подразумевает, что len - это указатель, а не целое число.
Я тоже иногда видел такое странное поведение. Вы можете попробовать включить cstdlib прямо из вашего файла.
Что если вместо этого использовать std::malloc (или навязчивый arma::superlu::malloc) и отказаться от using namespace std; ? Начните с удаления using namespace std; из файлов заголовков, если он у вас там тоже есть. Также удалите using namespace arma::superlu; и любые другие using namespace из заголовочных файлов.
@TedLyngmo действительно исправляет проблемы с помощью std::malloc! так как это не мой код, было трудно обнаружить проблему
Найдите все файлы заголовков в коде, который у вас есть для using namespace ... удалите все те, которые помещены в глобальное пространство имен.
Заголовок с глобальным using namespace — действительно неприятный сюрприз. Главный вывод из этого опыта должен заключаться в следующем: «Не будь таким парнем».
Если вы собираетесь прибегнуть к использованию strlen() и malloc(), то почему бы просто не использовать вместо этого стандартное strdup()? В документации для CoinStrdup() даже сказано: «Возвращает strdup или NULL, если исходный NULL».
Не связанный с проблемой неоднозначных перегрузок: преобразование и сохранение возвращаемого значения из strlen() как int, а затем использование его в качестве аргумента malloc() не дает ничего полезного. strlen() возвращает size_t (точнее std::size_t), и аргумент malloc() также является size_t. Измените тип len на size_t, и вы полностью устраните static_cast<int>





Две рассматриваемые функции — это стандартные void* malloc(size_t) и void* arma::superlu::malloc(std::size_t). Предположительно, где-то у вас есть using namespace arma::superlu, который вытягивает все из этого пространства имен в глобальное пространство имен.
Чтобы обойти это, вы можете
using namespace arma::superlu и либо полностью уточните все из этого пространства имен, либо вставьте именно то, что вам нужно (с using arma::superlu::xyz;). Илиmalloc с помощью ::malloc или, что предпочтительнее, std::malloc для вызова стандартной версии C++.Аналогично для неоднозначных вызовов free.
Сообщения об ошибках объясняют: вызов malloc неоднозначен из-за двух кандидатов:
std::malloc
arma::superlu::malloc
Чтобы избежать этого, вы должны явно вызвать предполагаемый, например. std::malloc, а не полагаться на разрешение перегрузки. Вы также можете узнать, почему arma::superlu:: ищут. Есть ли директива использования; или этот код, возможно, определен внутри этого пространства имен, и это была предполагаемая версия malloc для вызова.
NB. В коде есть уязвимость в поведении, когда входная строка длиннее INT_MAX, а также неплохо бы проверить, что будет, если malloc вернет нулевой указатель.
std::malloc здесь не кандидат:
/usr/include/stdlib.h:540:14: note: candidate: ‘void* malloc(size_t)’
540 | extern void *malloc (size_t __size) __THROW __attribute_malloc__
| ^~~~~~
...
/src/third_party/header_only/armadillo-11.1.0/include/armadillo_bits/translate_superlu.hpp:332:3: note: candidate: ‘void* arma::superlu::malloc(std::size_t)’
332 | malloc(size_t N)
| ^~~~~~
Но виновником, скорее всего, является using namespace arma::superlu где-то в вашем собственном коде или в одном из сторонних заголовков.
Компилятор сообщает вам, какие кандидаты на
mallocон нашел? Обычно она находится в примечаниях под самой ошибкой.