我在我的代码中的多个位置收到此错误消息,我调用malloc或realloc。这是一个例子。
void* reallocate_array(void* ptr, size_t size)
{
return realloc(ptr,size)
}
EDIT2:看起来问题出在测试用例中。我无法修改此
char* reallocated = (char*) reallocate_array(allocated,-1)
这是我的解决方案,摆脱了腥值错误
if((int)size < 0)
{
return NULL;
}
我的印象是size_t是一个无符号整数,这意味着它永远不会是负数。这可能是Valgrind中的错误还是它警告我可能的环绕?
编辑:Valgrind输出
==20841== 1 errors in context 1 of 3:
==20841== Argument 'size' of function realloc has a fishy (possibly negative) value: -1
==20841== at 0x4C2BB78: realloc (vg_replace_malloc.c:785)
==20841== by 0x4057B1: reallocate_array (allocation.c:24)
==20841== by 0x402A8A: reallocate_NegativeBytes_Test::TestBody() (tests.cpp:56)
答案 0 :(得分:3)
向Valgrind道具:将负实际参数传递给无符号类型的参数是完全正确的。在您的特定情况下,结果将是参数转换为类型size_t
的最大可表示值,但这可能与预期的不同。
我怀疑转换为大的正无符号值确实与测试用例的意图不同。由于测试用例期望内存分配失败,案例可能正在传递,但不是因为我怀疑其作者预期。至少,由于不清楚它的目的是什么,这是一个糟糕的测试案例。
至于你的解决方案,它也很可疑。该标准可以说明您将(size_t) -1
转换为int
类型:
否则,新类型已签名且无法表示该值 在里面;结果是实现定义的还是 实现定义的信号被提出。
实施定义的行为以及发出信号的可能性并不适合挂帽。
如果您坚持验证函数内部的值,那么您可以考虑进行此测试:
if (size & ~(SIZE_MAX >> 1)) {
// ...
}
测试是否设置了size
的最重要位,如果该值是从不大于size_t
的任何负数转换而来的话。