memcpy()函数是否可重入?

kor*_*han 5 c c++ reentrancy memcpy

我在信号处理程序中调用了一些C++函数,我的程序由分段错误终止.当我用gdb检查时,memcpy()函数是我获得SIGSEGV的地方.我想知道memcpy()是否是一个可重入函数?

Joh*_*ley 11

除了嵌入度最高的平台之外,它都是可重入的.你提到SIGSEGV所以我认为它不是其中之一.在这种情况下,最有可能的是memcpy()不是罪魁祸首:这是调用者的错.如果你要求memcpy()复制坏指针(或坏长度)那么它就会出现故障.你可以轻松地做到这一点:

memcpy(NULL, NULL, 123456789);
Run Code Online (Sandbox Code Playgroud)

这将导致SIGSEGV,它会告诉你memcpy()导致它.当然,这不是memcpy的错 - 它只是做你告诉它的.你的信号处理程序用奇怪的东西来调用它.对调用者站点的回溯(在gdb或你拥有的任何工具中)应该显示你所称的内容.如果做不到这一点,只需将你传递给memcpy的参数打印出来.

  • 正如你所说,async-signal-safe函数列表只提到了Posix的新功能,而不是标准的C函数,而Posix在某处说任何未声明为异步信号安全的函数都不需要异步信号 - 安全.C标准说你通常不能从信号处理程序调用库函数(7.1.4/4).因此,除非标准明确地说某个地方你可以称之为"memcpy",否则我们所依赖的只是对可信实现的直觉.我们知道这不是错误,但AFAIK不是Posix保证的.但格里布可能会这样. (4认同)
  • Posix说无法从信号处理程序调用memcpy.在实践中,它可能会起作用.大多数时候,至少.但它完全没有保证. (2认同)

Ash*_*thy 1

我不明白为什么它不能重入。我不确定,但我认为这很大程度上取决于您使用的库。