为什么同时使用 malloc/calloc/realloc 和 brk 函数会导致未定义的行为?

问题描述 投票:0回答:2

这是否意味着同时使用(malloc 或 calloc 或 realloc)之一和(brk/sbrk)之一会导致 UB,或者同时使用 malloc 和 calloc 也会导致 UB?

这发生在整个程序中还是只是一个源文件?

c malloc dynamic-memory-allocation calloc brk
2个回答
0
投票

在同时具有

sbrk
malloc
的系统上,实际规则是“
malloc
的实现可能假设除自身之外没有其他代码使用非零参数调用
sbrk
。”

这样说,后果更容易推断:

  • 每个进程必须只有一个

    malloc
    的操作实现。 (在这样的系统上,操作系统提供的 C 库的
    malloc
    通常 设计用于在您提供另一个实现时注意并优雅地让步。)

  • 随叫随到

    sbrk(0)
    就好

  • 如果您正在编写

    malloc
    的实现,您可以继续使用非零参数调用
    sbrk
    ,并假设其他人不会这样做。

  • 但是如果您 not 编写

    malloc
    的实现,使用非零参数调用
    sbrk
    可能会导致下一次调用
    malloc
    (或任何在内部调用
    malloc
    的函数,它可以是任何除了那些记录为异步信号安全的之外)使进程崩溃或破坏堆。

    应该很容易理解为什么从

    sbrk
    实现外部调用带有 negative 参数的
    malloc
    可以产生这种效果。你缩小了堆!你拿走的空间里可能有分配!几乎可以肯定are内部
    malloc
    簿记结构在那里!

    为什么用

    positive
    参数调用 sbrk 可以产生相同的效果是更微妙的。
    malloc
    不会知道额外的空间。下次
    malloc
    调用
    sbrk
    本身时,它将错误地更新其内部簿记结构。堆中间会有一大块内存,它无法跟踪。它很可能会在那块内存上涂鸦和/或混淆自己访问地址outside堆。


-1
投票

brk/sbrk 不为 C 语言所知。它是现有的实现之一。你的实现我没有那些功能。

不要使用它,除非你知道你在做什么。

这是否意味着使用(malloc 或 calloc 或 realloc)之一和一个 of(brk/sbrk) 同时导致 UB

例如,如果您减少程序中断的位置并使用以前较大内存中分配的内存,则可以。

或者同时使用malloc和calloc也会导致UB?

在同一个程序中使用像

malloc
,
realloc
,
calloc
这样的标准库函数不会调用 UB

这发生在整个程序中还是只是一个源文件?

UB影响整个运行程序。

© www.soinside.com 2019 - 2024. All rights reserved.