【发布时间】:2025-12-08 21:55:01
【问题描述】:
在C语言中,我有一个类似的程序
void foo(A a);
在这里,类型 A 是已知的。它可以是任何类型、int、指针或结构,也可以是任何用户编写的类型。
现在我有一个指针指向的数据,比如 uint8_t* data 大小为 n 我如何将 data 转换为 A 类型的 a?
我正在努力测试 foo,从 uint8_t* 类型和大小 n 的随机数据,使用模糊后端。
【问题讨论】:
-
"我怎样才能将数据转换为 A 类型的数据?"一般是不可能做到的。要“转换”数据,您必须知道目标类型、存储格式(目标类型对象表示)和源格式。您可以将数据“解释”为另一种类型,只需使用指针或
memcpy,但这没有任何转换,并且可能会导致奇怪的结果发生,包括未定义的行为。 -
这是有道理的。 A型实际上是已知的。我更新了帖子。谢谢!顺便说一句,“解释”是指演员表?
-
那么A的表示是如何编码/序列化为
uint8_t*的呢? IE。什么是 A,它是如何存储在uint8_t*中的?没有任何规则,就不可能“猜测”出规则是什么。可以举个例子,用现实生活中的uint8_t*数据和样本A类型? C 没有反射。"interpret" means cast?这意味着强制转换+取消引用,但强制转换可能是错误的,因为指针对齐方式和大小可能不同.. -
我不明白你的最后一个问题。假设 A 是一个类型为“double x; int y”的结构,它占用 4+2 个字节。我想从数据 unit8_t 中获取 6 个字节并将它们解释为结构。
-
it takes 4+2 bytes.不,它没有,有填充。然后取 4 个字节和 2 个字节并重构这些值。memcpy(&t->x, arr, 4); memcpy(&t->y, arr+4, 2);但这仍然 取决于数据如何序列化为 arr 并可能导致陷阱表示。为什么不喜欢t->x = arr[0]*256+arr[1]; t->y=arr[4]<<8+arr[5];?
标签: c type-conversion fuzzing