我想在main中对当前堆栈进行校验和,以检查它是否在两点之间被改变.
例如:
int main(void) {
...
stack_checksum();
... process ...
if(stack_checksum() != ...)
altered.
}
Run Code Online (Sandbox Code Playgroud)
如何获取基本堆栈地址和堆栈顶部的当前地址?
编辑: 随着@MiroslavBajtoš帮助,步骤方法:
让我们假设这个结构:
typedef struct mytest_t {
uint8_t field1;
uint32_t field2;
uint64_t field3;
uint64_t field4;
uint16_t field5;
uint32_t field6;
} mytest_t;
Run Code Online (Sandbox Code Playgroud)
还有一些想要创建此结构的函数(有点像一个对象):
int something_with(uint8_t field1, uint32_t field2, uint64_t field3, uint16_t field5) {
mytest_t *object = malloc(sizeof(mytest_t));
object->field1 = field1;
object->field2 = field2;
object->field3 = field3;
object->field4 = 0x12345678;
object->field5 = field5;
object->field6 = 42;
dosomethingwith(object);
return 0;
}
void initial() {
something_with(123, 456, 789, 456);
}
Run Code Online (Sandbox Code Playgroud)
这些功能纯粹是出于我的情况。此函数就像一个帮助程序,在代码中有一个单一的点,在该点上,对象被填充然后转发到其他对象。
注意:这个例子很小,假设参数要长2到3倍。
为了避免将大量参数传递给函数,并使调用变得冗长且难以阅读,我考虑将一个预填充的mytest_t
结构作为参数传递(假设需要的字段正确填充)。
将struct作为值或指针传递会更好吗?取消引用所有字段的成本是多少?既然所有内容都在堆栈中,那有什么区别吗?编译器可以某种方式对其进行优化吗?
void initial() {
mytest_t source = {
.field1 = 123, …
Run Code Online (Sandbox Code Playgroud)