Describe the bug
cuOptGetProblemStringArrayAttribute compares the stored name vector against the caller's count and fails if they differ:
const auto& names = (attribute == CUOPT_STRING_ARRAY_VARIABLE_NAMES) ? iface->get_variable_names()
: iface->get_row_names();
if (names.size() != count) { return CUOPT_INVALID_ARGUMENT; }
A problem built without names — which is legal, and is what cuOptCreateProblem produces — stores an empty vector. A caller that sizes its buffer from cuOptGetNumVariables, as the documentation implies, therefore passes count = numVariables against names.size() == 0 and gets CUOPT_INVALID_ARGUMENT.
The caller cannot distinguish that from a genuine size mismatch, and there is no attribute reporting how many names are stored, so it cannot pre-check either.
Steps/Code to reproduce bug
cuOptCreateProblem(...) with 2 variables and no names.
cuOptGetProblemStringArrayAttribute(problem, CUOPT_STRING_ARRAY_VARIABLE_NAMES, 2, out).
- Returns
CUOPT_INVALID_ARGUMENT rather than indicating that the problem has no names.
Expected behavior
"This problem has no names" should be reportable rather than indistinguishable from a caller error. Either return the generated default names so the count always matches numVariables, or add a count attribute the caller can query first, or define a distinct status for the empty case.
Additional context
Found while reviewing the Java bindings (#1524), where this is one of the reasons cuopt_jni.cpp still reads names through the internal header instead of the C API. Raised by @chris-maes in review: #1524 (comment)
Related: #1703 covers the broader set of problem-model accessors the C API is missing.
Describe the bug
cuOptGetProblemStringArrayAttributecompares the stored name vector against the caller'scountand fails if they differ:A problem built without names — which is legal, and is what
cuOptCreateProblemproduces — stores an empty vector. A caller that sizes its buffer fromcuOptGetNumVariables, as the documentation implies, therefore passescount = numVariablesagainstnames.size() == 0and getsCUOPT_INVALID_ARGUMENT.The caller cannot distinguish that from a genuine size mismatch, and there is no attribute reporting how many names are stored, so it cannot pre-check either.
Steps/Code to reproduce bug
cuOptCreateProblem(...)with 2 variables and no names.cuOptGetProblemStringArrayAttribute(problem, CUOPT_STRING_ARRAY_VARIABLE_NAMES, 2, out).CUOPT_INVALID_ARGUMENTrather than indicating that the problem has no names.Expected behavior
"This problem has no names" should be reportable rather than indistinguishable from a caller error. Either return the generated default names so the count always matches
numVariables, or add a count attribute the caller can query first, or define a distinct status for the empty case.Additional context
Found while reviewing the Java bindings (#1524), where this is one of the reasons
cuopt_jni.cppstill reads names through the internal header instead of the C API. Raised by @chris-maes in review: #1524 (comment)Related: #1703 covers the broader set of problem-model accessors the C API is missing.