【问题标题】:Does this code contain use-after-free?此代码是否包含 use-after-free?
【发布时间】:2017-11-08 23:14:11
【问题描述】:
int f2(char* x, int f) {
    int i=0;
    free(x);
    if(f) {
        printf("%s", x); 
        return 1;
    }
    return 0;
}

int main(int argc, char argv) {
    char* x = malloc(10);
    return f2(x, argc);
}

将释放的指针传递给 printf 是否考虑在释放后使用?

【问题讨论】:

  • 使用前免费... bruh
  • @Stargateur 参考?
  • f2 没有定义,如果它不是错字,那么你有你的第一个错误。如果 f1 被调用,是的,它是“释放后使用”。
  • @Stargateur 哦,等等。这不是一个值。它用作指针。没有注意到格式说明符。但如果是%p,我认为不会是UB。
  • @Stargateur 谢谢。这是一个非常违反直觉的观点。只是另一个挑剔-“不确定”不是未定义的。顺便说一句,找到了一个关于不确定值稳定性的有趣文档:open-std.org/jtc1/sc22/wg14/www/docs/n1793.pdf

标签: c memory-management memory-leaks


【解决方案1】:

您将多次获得未定义的行为(谷歌该术语):

  1. f2 中,一旦x 被释放,您将取消对它的引用,因为printfing x%s 格式说明符将取消对x 的引用,或者换句话说,它将访问x指向的内存,调用free后该内存会有未确定的内容。

  2. 即使你删除了free(x),你仍然会得到未定义的行为,因为那时你是printfing x,而x 指向的是有效但未初始化的内存。

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 2022-11-21
    • 2021-11-25
    • 2020-12-18
    • 2020-11-21
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多