【问题标题】:How to test POSIX compatibility?如何测试 POSIX 兼容性?
【发布时间】:2012-04-28 23:01:47
【问题描述】:

我正在使用 POSIX API 和 Linux 编写 C 程序。 我在朋友的 Mac OSX PC 上编译并运行它,有一个小错误,但我没有使用 Linux 特定的功能。

我将使用 Linux 添加到 API 的一些特定功能。我还将为 Mac Os X 和 FreeBSD 使用特定的 POSIX 扩展。
我将使用条件编译来选择代码。如果操作系统不是这些,我将使用通用 POSIX 代码。

我没有 Darwin/Mac OSX 和 FreeBSD,Linux 是我 PC 中唯一的操作系统。我无法下载和安装 FreeBSD,因为它超过 500 MB。
我想知道一种方法来测试程序是否会在其他 POSIX 系统上按预期编译和运行。
我想知道是否有一个 POSIX 模拟器和编译器来做测试。
测试很简单,它们不使用 GUI 和驱动程序,它们只是命令行。

我需要做 3 个测试:FreeBSD、Mac OSX/Darwin 和 Generic POSIX,但我没有工具。

编辑

是否有没有 GUI 但带有 GCC/G++ 和 ssh/scp 的 FreeBSD 和 Darwin 的最小版本?达尔文是免费的,不是吗?
我的电脑很旧,但我想我可以将它们安装在虚拟机中,创建虚拟网络并使用 ssh/scp 传输和测试程序。

【问题讨论】:

  • 这有点陈词滥调,但“没有可移植的代码;只有已移植的代码'。没有什么可以替代让系统进行测试的。如果做不到这一点,您必须编写可以依赖于不同系统的标准子集。最好避免条件编译;如果你必须使用它,它会使生活复杂化。
  • @Jonathan:虽然这在某种程度上是正确的,但在过去的 5 到 10 年里,它变得越来越少,以至于人们为了“可移植性”而做的许多传统事情“奇怪的系统”现在看起来像是过时的垃圾。我同意双方都有争论,但我认为按照标准进行编码并纠缠实施者以在他们不符合标准时修复其损坏的实施具有很大的优点,可以作为推动未来的一种方式我们不必玩“移植到每个目标”的游戏。
  • 当大玩家加入时,它也取得了更大的成功。另一方面,GCC 对大量 UB 的打击(如签名溢出和别名违规)一开始确实破坏了一些东西,但它在让程序员修复他们被破坏的程序方面已经走了很长一段路。大牌应用程序从应用程序方面采取的一些类似的大胆行动可能会产生重大影响。顺便说一句,采用这种方法并不一定意味着您的程序不会在流行的损坏平台上运行。这只是意味着您必须提供修复/粘合层才能使您的标准目标代码在那里运行。
  • 由于提问者将“使用 Linux 添加到 API 中的一些特定功能”,因此代码的行为可能在任何地方都不相同,至少在提供 Linux 扩展功能的额外工作的情况下并非如此。我认为双启动或运行 VM 的 FreeBSD 应该相对简单(因此无法在 FreeBSD 上进行测试是盲目的); Mac OS X 的问题更大。它确实取决于将要使用的功能;你可以在没有条件编译的情况下做很多可移植的事情。

标签: c linux testing posix compatibility


【解决方案1】:

一种简单的方法是使用适当的功能测试宏来编译您的程序。例如,如果您将_POSIX_C_SOURCE 定义为POSIX 的目标版本(当前为200809L),您将请求系统标头向您的程序公开任何内容,除非POSIX 基础需要/允许。这可以通过带有-D_POSIX_C_SOURCE=200809L 的命令行CFLAGS 来完成。如果您想要 XSI 选项(完整的 Single Unix Standard 功能,它是 POSIX 基础的超集),请改用 -D_XOPEN_SOURCE=700

这不会帮助您检测来自缺少 POSIX 功能的某些系统的问题(例如,OSX 已损坏并且缺少我上次检查的工作 sem_init,即使它在 POSIX 中是强制性的),或者来自编写的代码取决于 POSIX 标准接口中的非标准行为(例如,在您传递给 regcomp 的表达式中使用 GNU 正则表达式扩展),但它会帮助您发现任何意外使用的 interfaces 不在标准。

【讨论】:

  • 关于 OS X - stackoverflow.com/questions/1413785/sem-init-on-os-x。编译,但在未命名的信号量上返回错误。
  • 感谢您的链接。这真的很不幸,因为(未命名的)信号量是 POSIX 提供的最有用的同步工具之一(尤其是它们从信号处理程序中使用的能力),而命名信号量相当笨重,污染全局命名空间,并且如果你意外终止...
【解决方案2】:

如果你想为其他系统编译,你通常不需要其他系统,你只需要一个合适的cross compiler

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2011-10-28
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多