Valgrind C:函数的论证具有可疑(可能是负面)的价值

时间:2018-02-02 21:05:48

标签: c malloc valgrind

我在我的代码中的多个位置收到此错误消息,我调用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)

1 个答案:

答案 0 :(得分:3)

向Valgrind道具:将负实际参数传递给无符号类型的参数是完全正确的。在您的特定情况下,结果将是参数转换为类型size_t的最大可表示值,但这可能与预期的不同。

我怀疑转换为大的正无符号值确实与测试用例的意图不同。由于测试用例期望内存分配失败,案例可能正在传递,但不是因为我怀疑其作者预期。至少,由于不清楚它的目的是什么,这是一个糟糕的测试案例。

至于你的解决方案,它也很可疑。该标准可以说明您将(size_t) -1转换为int类型:

  

否则,新类型已签名且无法表示该值   在里面;结果是实现定义的还是   实现定义的信号被提出。

C2011 6.3.1.3/3

实施定义的行为以及发出信号的可能性并不适合挂帽。

如果您坚持验证函数内部的值,那么您可以考虑进行此测试:

if (size & ~(SIZE_MAX >> 1)) {
    // ...
}

测试是否设置了size的最重要位,如果该值是从不大于size_t的任何负数转换而来的话。

然而,我自己会尝试更改或删除测试用例。如果您愿意,请使用Valgrind关于它的投诉来支持您的论点。