Ваша функция checkMSB
объявляет только две локальные переменные и один параметр функции. Обе переменные имеют инициализаторы, и параметр (указатель) получит значение в результате вызова функции, предполагая, что правильный прототип для него находится в области видимости в точке вызова. Таким образом, ни один из них не используется неинициализированным.
Единственными другими данными, которые используются (не считая констант), являются те, которые указывают на аргументом pKey
. Из них ваш код использует pKey[0]
. То, что Valgrind сообщает о проблеме, подтверждает вывод о том, что это данные, на которые он жалуется: служба memcheck по умолчанию, которую выполняет valgrind, следит за динамически распределенной памятью, и это единственное, что может быть выделено динамически.
То, что ошибка исчезает, когда вы изменяете определение BITS
, может быть объяснено тем, что выражение pKey[0] & msb
оптимизируется, когда BITS
оценивается до значения больше 8.
Что касается вашего обновления, которое имеет целью показать, что аргумент функции фактически указывает на инициализированные данные, я склонен думать, что вы ищете не в том месте, или в другом месте, но не в том месте. код. То есть, вероятно, существует либо другой вызов checkMSB
, который заставляет Valgrind жаловаться, либо тестируемый двоичный файл был собран из другой версии кода. Я не готов поверить, что все, что вы изложили в этом вопросе, является правдой или, по крайней мере, не соответствует тому, что вы, по-видимому, говорите.