小编Max*_*xux的帖子

对当前堆栈进行校验和

我想在main中对当前堆栈进行校验和,以检查它是否在两点之间被改变.

例如:

int main(void) {
    ...
    stack_checksum();

    ... process ...

    if(stack_checksum() != ...)
        altered.
}
Run Code Online (Sandbox Code Playgroud)

如何获取基本堆栈地址和堆栈顶部的当前地址?

编辑: 随着@MiroslavBajtoš帮助,步骤方法:

  • 将局部变量放在结构中
  • 检查回溯返回数组

c stack checksum

7
推荐指数
1
解决办法
246
查看次数

通过值或C中的struct的多个参数

让我们假设这个结构:

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)

c stack struct pointers micro-optimization

5
推荐指数
1
解决办法
170
查看次数

标签 统计

c ×2

stack ×2

checksum ×1

micro-optimization ×1

pointers ×1

struct ×1