stou32() accepts partial parses, unlike the other stringutils converters
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 35/100
Direzione di ricerca
Inizia da src/stringutils.cpp:112-129 e confronta stou32 con stou64, stoi32 e stof. Estendi la copertura esistente di StringUtils.stou32 in src/test/stringutils_test.cpp con input contenenti numeri parziali, quindi esegui i test di stringutils. Il lavoro è completato quando i caratteri non numerici finali producono std::nullopt, mentre i casi esistenti di valori negativi, overflow e valore massimo rimangono validi.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
ovms::stou32() accepts a string that is only partially a number, unlike every other converter in src/stringutils.cpp.
src/stringutils.cpp:112-129:
std::optional<uint32_t> stou32(const std::string& input) {
std::string str = input;
ovms::erase_spaces(str);
if (!str.empty() && str[0] == '-') {
return std::nullopt;
}
try {
uint64_t val = std::stoul(str); // no idx, no full-consumption check
if (val > std::numeric_limits<uint32_t>::max()) {
return std::nullopt;
}
return {static_cast<uint32_t>(val)};
} catch (...) {
return std::nullopt;
}
}
std::stoul stops at the first character it cannot use and still reports success. Its siblings in the same file all guard against that by passing &idx and comparing against the length:
stou64—src/stringutils.cpp:143-147stoi32—src/stringutils.cpp:161-165stof—src/stringutils.cpp:203-206
(stoi64 at :181-185 validates by scanning digits first, which is equivalent.) stou32 is the only one without the check, so:
12abc -> 12
3.9 -> 3
0x10 -> 0
100% -> 100
Call sites affected
-
src/grpcservermodule.cpp:79— theGRPC_SERVERSenvironment variable:const char* environmentVariableBuffer = std::getenv("GRPC_SERVERS"); if (environmentVariableBuffer) { auto result = stou32(environmentVariableBuffer); if (result && result.value() > 0) { return result.value(); } }GRPC_SERVERS=4xsilently starts 4 gRPC servers instead of being rejected and falling back toconfig.grpcWorkers(). A typo in a deployment environment variable is applied rather than reported. -
src/audio/speech_to_text/s2t_servable.cpp:81— the transcriptiontemperaturefield, used as a fallback afterovms::stofhas already rejected the value. That endpoint's user-visible symptom is filed separately; either fix resolves it independently and the two do not conflict.
To Reproduce
Unit level, alongside the existing StringUtils.stou32 case:
EXPECT_FALSE(ovms::stou32("12abc")); // currently returns 12
EXPECT_FALSE(ovms::stou32("3.9")); // currently returns 3
EXPECT_FALSE(ovms::stou32("0x10")); // currently returns 0
End to end:
GRPC_SERVERS=4x ovms --model_path /models/... --model_name m --port 9000
# starts 4 gRPC servers; expected: the value is rejected and grpcWorkers() is used
Expected behavior
stou32 behaves like stou64/stoi32/stof: a string that is not entirely a number returns std::nullopt.
Logs
None — the value is accepted, so nothing is logged.
Configuration
- OVMS version:
main@fadb3314 - Any configuration; reachable via the
GRPC_SERVERSenvironment variable - CPU
- N/A
- N/A
Additional context
Suggested fix, matching the siblings:
size_t idx = 0;
uint64_t val = std::stoul(str, &idx);
if (idx != str.size()) {
return std::nullopt;
}
The existing StringUtils.stou32 test covers only a negative value, overflow and the maximum, so none of it changes.
Separate, deliberately not bundled: stou32 calls erase_spaces() on its input first, so stou32("12 34") yields 1234 both before and after such a fix, whereas stou64 rejects " 100 " outright (there is an explicit test for that at src/test/stringutils_test.cpp:218). Whether stou32 should also stop erasing interior whitespace is a separate behavioural question and worth deciding on its own.
Also same class, different function, mentioned only so it is on the record: src/grpcservermodule.cpp:143 uses a bare std::stoi(value) to decide whether a gRPC channel argument is an integer, so grpc.max_receive_message_length=4MB is passed to gRPC as the integer 4 rather than as the string it is. That may well be intended, given the surrounding comment, so I have not touched it.
I have a patch for this and will open a PR shortly.
- Lingua principale
- C++
- Stelle
- 940
- Fork
- 278
- Merge medio
- 3g 4h
- PR unite (30g)
- 68
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di openvinotoolkit/model_server
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
openvinotoolkit/model_server#4613 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
openvinotoolkit/model_server#4609 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Idle unload never happens again if the client disconnects while a sleeping graph is waking upForse già presa @atobiszei l’ha presa 6 giorni fa. Aperta
openvinotoolkit/model_server#4603 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
openvinotoolkit/model_server#4599 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 55/100
openvinotoolkit/model_server#4586 · 5 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di openvinotoolkit/model_server
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
lxqt/qtermwidget#688 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 92/100
cpinitiative/usaco-guide#6665 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
mpfaffenberger/privateer_reimagined#658 ·
I maintainer di solito rispondono entro 1 giorno
-
Broken links in the docsAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
microsoft/onnxruntime#33018 ·
I maintainer di solito rispondono entro 2 giorni
-
Type: bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
I maintainer di solito rispondono entro 2 giorni