答案 0 :(得分:8)
是否可以保证
regex_t
的简单浅表副本始终有效?
假设目标指针指向的对象足够容纳复制的字节,并且不与源对象重叠,则没有为memcpy()
定义失败条件。只要可以保证计算机中的任何内容,就可以保证复制成功。
但是,不一定不一定意味着可以独立于原始副本使用结果副本。 POSIX没有对regex_t
提出足够的要求来确保这一点,并且如果regex_t
的某些实现包含指向动态分配的数据的指针也就不足为奇了。实际上,regfree()
函数的存在是对该可能性的明确规定。
答案 1 :(得分:2)
POSIX spec here的书写方式很差:
如果regexec()或regfree()的preg参数不是regcomp()返回的已编译正则表达式,则结果不确定。
0
Aaron Sanchez TOR
CC Sabathia NYY
Steven Matz NYM
Zach Eflin PHI
Lucas Giolito CHW
Eduardo Rodriguez BOS
Brad Keller KCR
Adam Plutko CLE
Julio Teheran ATL
Jon Lester CHC
Clayton Kershaw LAD
Zack Greinke ARI
Jon Gray COL
Drew Pomeranz SFG
不是对象,而是指向对象的指针(因此它应该说类似“不指向...”),而preg
则不“返回”它(它修改指向的对象),但是“ is”的意图似乎是它必须是同一对象,而不是另一个具有相同值的对象。我会将对副本的调用regcomp
解释为对此的违反,从而导致未定义的行为。
答案 2 :(得分:1)
可以解释POSIX,这样虽然可以,但可能大胆且不明智。
在ISO C(规范引用中包含在POSIX内)中,以下内容仅是关于一种库类型的,而没有其他内容:
“用于控制流的FILE
对象的地址可能很重要; FILE
对象的副本不需要代替原始地址。”
在POSIX中, 2.5个标准I / O流基本上重复相同的文本。
因此,您会认为这开创了“选择退出”的先例:任何不得复制的陈述都会被记录在这样的禁止中,而其他类型则可能是这样。
此外,在标准的另一个区域:线程:
“对于屏障,条件变量,互斥锁和读写锁,如果进程共享属性设置为PTHREAD_PROCESS_PRIVATE,则[TSH] [选项开始],仅[address]同步对象用于初始化它可用于执行同步。”
该标准的方法似乎是在禁止使用复制对象时阐明。
但是,我会警惕复制用作某种状态资源句柄的任何结构,而不仅仅是复制信息结构(例如struct stat
或struct pwent
)。实现者可能会无意间使此类事情对其自身的地址敏感,例如:
struct foo {
type_t *internal_ptr;
/* ... */
type_t internal_array_of_something[...];
};
POSIX中没有禁止的任何文本。如果系统在某处维护该结构或该结构内的反向指针,则会出现类似的问题。
首先,必须首先阅读POSIX,而不是将其作为编程指南(程序可能会或可能不会做),而是作为接受程序的实现的一组要求。
POSIX中似乎没有要求说实现不能使regex_t
对其地址敏感。如果是这样,则意味着这样的实现不会失败。
也就是说,此问题在FILE *
流和pthread
同步对象的需求区域中得到了强调。