c - Valgrind + C:无错误地处理未初始化的指针
问题描述
也许我太忙于测试我的作业,但这是我的困境:
这是我的违规功能(或多或少):
struct thing{
char* data;
}
int function(struct thing* arg){
if(arg->data == NULL)
return -1;
}
这是我的违规输入:
struct thing *x = malloc(sizeof(struct thing));
function(x);
当我测试它时,valgrind 会输出它:
Conditional jump or move depends on uninitialised value(s)
我大约 99% 确定这是因为 valgrind 在评估x->data
它何时尚未初始化NULL
或分配时存在问题。有解决方法吗?
解决方案
在我看来,valgrind 在这里抱怨是正确的,因为data
实际上它没有初始化并且function
无法确定它是否是。该函数只能检查它是否具有您用于初始化的定义值。
所以我会考虑使用一个创建函数来进行初始化。这样,您还可以在将数据的大小作为参数传递时立即为数据分配内存(或者如果您想稍后再这样做,则只需 NULL)。
struct thing *newThing(size_t dataSize)
{
struct thing *t = malloc(sizeof (struct thing));
if (t)
t->data = malloc(sizeof(char) * dataSize);
// or t->data = NULL if it should be done later
return t;
}
推荐阅读
- c++ - 如何使 Windows 命令提示符显示 C++ 可执行文件的返回值?
- r - 如何让 R markdown 模板共享同一组支持文件?
- flutter - Flutter - 如何取消指针向上事件
- regex - 如何使用正则表达式 Notepad++ 提取 2 个模式之间的所有字符串?
- html - 我想把这3个按钮放在定时器下面的一个圆圈里
- json - .json 文件不在主包错误 Swift 中
- c# - 如何使用 EF Core db First 方法在 .NET Core 中使用存储过程进行自定义分页?
- ruby-on-rails - 格式化 Ruby Lograge 日志消息
- virtual-machine - 导出 ESX 精简分区虚拟机
- android - 如何从android中的firebase检索数据