【问题标题】:Are uthash and utarray backward compatible?utash 和 utarray 向后兼容吗?
【发布时间】:2018-07-19 13:23:43
【问题描述】:

我特别关心 utarray 版本 2.0.2 与 1.9.6。 (最近的版权分别是 2017 年和 2012 年)。

我需要将 utarray.h 添加到使用 utarray.h 的现有项目中,并且希望这两个标头都来自相同的版本/提交,所以我正在考虑用新的 utarray.h 替换旧的.

我应该注意,我并不十分担心编译时的不兼容性,例如名称更改等。我主要担心的是运行时损坏。

【问题讨论】:

    标签: c uthash


    【解决方案1】:

    如果您查看utarray.h,您会发现它定义的只是宏、一些静态函数和一些类型定义;没有公共符号,所以一切都应该限制在当前的编译单元中。

    换句话说,是的,只要您不在同一个文件中包含两个标头(这可能会导致编译时错误)或在您的公共 API 中公开它,您应该是安全的。

    也就是说,您标题中问题的答案是“否”; API 中的不兼容更改破坏了向后兼容性。但是根据您在正文中提到的限制,您应该没问题。

    【讨论】:

    • 我可能误解了你的答案,但我的计划是“用新的替换旧的 utarray.h”,而不是有两个版本。我从经验中知道,使用编译器未检测到的错误参数来炸毁这些宏很容易,我担心旧的 utarray.h 客户端代码会遇到这种情况。
    • 不,我误解了你的问题。我的回答是,只要您不尝试在同一个编译单元中同时使用这两个版本,就可以安全地设置这两个版本。如果仅将 1.x 标头换成 2.x 标头是安全的,那么主版本中可能不会出现颠簸(这通常是主版本颠簸发出的信号)。您可能没有使用 API 中发生变化的部分,因此答案可能是“可能”。
    • 我们已经在使用 msgpack 进行多个版本的事情,这在实践中变成了一场噩梦。但是...我可能会继续使用旧版本的 utarray.h 和基于此的新版本的 utash.h..
    【解决方案2】:

    一个罕见但 100% 可重现的 utarray 使用堆栈损坏问题导致我尝试升级 JUST utarray.h,但在我的公司全面升级。

    简短的回答是否定的,它不是 100% 向后兼容的。但它非常接近。

    更长的答案是针对我们的应用程序,所需的更改非常微不足道,基本用法没有改变,堆栈损坏问题似乎已经消失。它似乎还可以与其他较旧的标头(例如 uthash)进行良好的交互。

    我发现的唯一接口更改是用于消除 gcc 警告的 _UNUSED_ 宏更改为 UTARRAY_UNUSED。其他一切似乎都是错误修复。

    编辑:我还不够天真,甚至无法确信 1.9.6 存在导致堆栈损坏的问题,但在调试器中仔细执行相同的 10 行代码后,我并没有完全排除这种可能性大约 2 小时,并观察每个变量是否正确。

    【讨论】:

    • TBH 当您遇到此类问题时,您希望首先完全了解问题,然后修复它——不幸的是,2 小时的源代码级调试通常不足以解决此类问题。改变周围的东西并看到它消失并不能保证任何事情,绝对有可能你只是移动了一些东西并将实际问题扫到了地毯下。用不可重现的问题交换可重现的问题并不是什么大问题。
    • @MatteoItalia - 如果我有时间再看一遍,它仍然可以用git checkout 重现:)(我不会)
    • @MatteoItalia 我刚刚发现了 valgrind,当你听到它认为这段代码仍然存在问题时,你会感到非常震惊:)
    • 天哪,谁能说! ?? 说真的:让 UBsanitizer 也来试试吧,你会惊喜的。
    猜你喜欢
    • 2018-01-19
    • 2017-07-11
    • 1970-01-01
    • 2023-03-19
    • 2010-11-07
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多