Еще одна проблема, о которой сообщает Klocwork, заключается в том, что в этой функции используется неинициализированный порт. В нем конкретно упоминается, что передача '& port' в 'po :: value'
Это ложное срабатывание: ничто не использует значение port
до его инициализации (я проверил). Однако этого должно быть достаточно для фактической инициализации port
, чтобы отключить сообщение. Странно, что он все еще срабатывает, раз уж он у вас уже был.
Ни vaglrind, ни ASAN + UBSAN не нашли для меня ничего плохого в коде. Вот тест грубой силы, который пробует все виды комбинаций опций (включая незарегистрированные и ошибочные):
#!/bin/bash
set -e -u
opts=( '' '-k two' '-k 2' '-p 2345' '-s 127.0.0.88' 'bogus' '--more-bogus');
for a in "${opts[@]}"
do
for b in "${opts[@]}"
do
for c in "${opts[@]}"
do
valgrind ./sotest "$a" "$b" "$c"
done
done
done
В результате выполняется 343 различных вызова программы и выводятся ожидаемые результаты:
69x 2
69x 2345
69x 127.0.0.88
99x 1
99x 1234
99x localhost
Ожидаемая диагностика:
17x option '--port' cannot be specified more than once
17x option '--server_ip' cannot be specified more than once
34x option '--party' cannot be specified more than once
107x the argument ('two') for option '--party' is invalid
И, самое главное, последовательный отчет об отсутствии утечек:
343 All heap blocks were freed -- no leaks are possible
TL; DR
Я не знать, почему ваш инструмент сообщает об утечках. По крайней мере, "'порт' используется неинициализировано" проблема при ближайшем рассмотрении кажется неправильной.
Я тестировал G CC 10 с Boost 1.73.0, -std = c ++ 17 -O3, ваш исходный код 1 -% без изменений.
Надеюсь, это даст вам больше идей и, возможно, некоторых утешений.