使用longjmp突破qsort可以吗?

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

qsort 中间,有办法阻止它吗?一些评论提到使用

setjmp/longjmp
来中断比较函数对
qsort()
的调用。

语言规范似乎没有说明这种情况下会发生什么。明确提到的比较函数的唯一限制是它必须返回一致的结果。

缺少提及是否意味着它是隐式允许的,或者是未定义的行为,因为结果未明确定义?

我认为很明显,正在排序的数组的状态是不确定的。但它能产生更广泛的影响吗?

c language-lawyer qsort
1个回答
0
投票

语言规范似乎没有说明这种情况下会发生什么。明确提到的比较函数的唯一限制是它必须返回一致的结果。

qsort()
的特点是它是极少数依赖用户提供的回调的标准库函数之一。 你是对的,它的规范没有说明如果对比较回调的调用没有返回会发生什么,所以至少有疑问的空间。 但这似乎与用户定义的基于回调的排序函数中发生相同事情的情况略有不同。 我认为没有充分的理由不期望该行为遵循
longjmp()
的规范:

longjmp
函数恢复最近调用
setjmp
所保存的环境 宏与相应的
jmp_buf
参数在程序的同一调用中。 [...]

所有可访问的对象都有值,抽象机的所有其他组件都有状态, 截至调用

longjmp
函数时,除了自动对象的表示 存储持续时间是包含相应调用的函数的本地存储持续时间 不具有
setjmp
限定类型且已在
volatile
之间更改的
setjmp
宏 调用和
longjmp
调用是不确定的。

(C23 7.13.3.1/2-3)

我将其视为所发生事件的定义,因此行为并非未定义。

但是,正如您所观察到的,我们必须允许

qsort()
可能在调用
longjmp
之前对数组内容进行了实质上任何性质的未指定更改。 也可能是
qsort()
动态分配内存,这可能会被
longjmp
泄漏。 这些是通常参加
longjmp
电话会议的问题类型。

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