12

我想编写一个可从 C 代码动态加载和调用的库,但我真的不想用 C 编写它——代码对安全性至关重要,所以我想要一种更容易相信我的代码的语言是正确的。我有哪些选择?

更具体地说,我希望 C 程序员能够做到#include-l一点,然后开始使用我的库,就像我用 C 编写的一样。我希望其他语言的程序员能够使用他们最喜欢的工具链接到 C 库以链接到它。理想情况下,我希望在每个支持 C 的平台上都能做到这一点,但我会满足于 Linux、Windows 和 MacOS。

4

8 回答 8

5

任何可以编译为本机代码的东西。所以你可能会用谷歌搜索——“编译为本机代码的语言”。参见,例如,编译为本机代码并包含电池的编程语言

C++ 通常是这个选择。编译为本机代码,并为您提供简单的接口,易于编写适配器层。

Objective C 和 Fortran 也是可能的。

于 2013-05-07T20:35:32.427 回答
4

听起来您正在寻找一种具有ABI兼容性的语言,或者可以描述为生成本机代码的语言。只要它可以编译为链接器接受的有效目标文件(通常是 .obj 或 .o 文件),这应该是主要标准。然后,您还想编写一个头文件,以方便使用 C(或其密切相关的语言/变体)编写的任何客户端代码。

正如其他人所提到的,选择 C ​​以外的语言需要一个很好的理由,因为它是低级/系统软件的 lingua-franco。汇编器是一种选择,尽管更难在平台之间移植。D是一种更便携但不那么普遍的替代方案,旨在以最少的麻烦生成安全、高效的本机代码。还有很多其他的。

于 2013-05-07T22:45:08.827 回答
2

You might be interested in ATS, http://ats-lang.sourceforge.net/. ATS compiles via C, can be as efficient as C, and can be used in a way that is ABI-compatible with C. From the project website:

ATS is a statically typed programming language that unifies implementation with formal specification. It is equipped with a highly expressive type system rooted in the framework Applied Type System, which gives the language its name. In particular, both dependent types and linear types are available in ATS. The current implementation of ATS (ATS/Anairiats) is written in ATS itself. It can be as efficient as C/C++ (see The Computer Language Benchmarks Game for concrete evidence) and supports a variety of programming paradigms

ATS's dependent and linear type system helps produce static guarantees about your code, including various aspects of resource management safety.

Chris Double has been writing a series of articles exploring the power of ATS's type system for systems programming here: http://bluishcoder.co.nz/tags/ats/. Of particular note is this article: http://bluishcoder.co.nz/2012/08/30/safer-handling-of-c-memory-in-ats.html

This document covers aspects of calling back and forth between ATS and C code: https://docs.google.com/document/d/1W6DYQApEqKgyBzMbvpCI87DBfLdNAQ3E60u1hUiMoU0

The main downside is that dependently-typed programming is still a daunting prospect, even for non-systems programming. The syntax of the language is also a bit weird: consider lexical quirks such as the use of abst@ype as a keyword. Finally, ATS is to some degree a research project, and I personally don't know whether it would be sensible to adopt for a commercial endeavour.

于 2013-05-08T18:40:48.710 回答
2

我所知道的几乎所有安全关键应用程序都是用 C 编写的。我不相信有任何其他语言在生成安全应用程序方面具有更高的实际地位。

不懂的人说 C 是一种糟糕的安全语言。

如果您希望 C 程序员使用您的库,请使用 C。做其他任何事情都是在尝试在平衡木(体操设备)上行走时将一只手绑在背后。当然,还有许多其他语言能够与 C 接口,但它通常涉及使用 C 层,然后将 C 数据类型填充到特定于语言的数据类型(Java 对象、Python 对象等)中,并且调用完成后,您使用相同的转换回 C 数据类型。如果您没有正确地做出所有设计决策,只会使其更难使用,并且可能会更慢。而且人们不会理解源代码,因此不会喜欢使用它(请参阅下面的更多信息)。

如果你想要安全,那就写出非常好的代码,始终牢牢地戴上你的“安全方面”帽子,找到一个安全邮件列表或网站并将其发布到那里进行审查,接受审查意见,理解意见,并修复任何有意义的评论。将源代码分发给用户,这样人们就可以看到你的代码做了什么。那些了解安全的人会知道要寻找什么,并了解您做得很好(或做得不好,视情况而定)——而那些不了解安全的人则希望相信合适的人。如果它好,人们就会使用它。如果它是“隐藏的”并且不容易访问,那么无论您使用哪种语言,您都不会获得很多客户。

不用担心,您不会从发布源中透露更多信息。如果代码中存在缺陷,并且它足够流行(或重要),那么即使您只发布二进制文件,也会有人发现缺陷。对于那些精通逆向工程的人来说,没有源代码只是一个小障碍。

安全性并非源于使用特定语言或特定工具,它源于良好的设计和对安全问题的良好基本理解。

并记住隐蔽的安全性(无论这意味着“隐藏的源代码”还是“不寻常的语言”或其他晦涩难懂的东西)是虚假的安全性。

于 2013-05-07T22:04:45.790 回答
2

从理论上讲,它将是 Fortran:较少的间接性(如:我的数组在 [here],而不仅仅是指向此处的指针,这适用于大多数但不是所有数据结构和变量)。

然而...... Fortran 中有许多陷阱和怪癖:也许不如 C 中那么多,但您可能比 Fortran 更了解 C 语言。大多数评论说“了解你的代码”背后的意义是什么——但你真的知道你的编译器在做什么吗?

了解你,我已经准备好接受你的信任,因为 C。大多数程序员不这样做。您不知道也不知道本地 JVM 或 JIT 编译器做了什么,如果您使用 Java 或 C# r 脚本语言,那将是您的安全模型中的一个黑洞。

忽略那些告诉你安全计算的毛茸茸的家伙编写他们自己的汇编程序的人:他们可能甚至不知道他们在他们发布的任何和所有重要项目中所犯的安全错误。确实了解您的编译器。

于 2013-05-08T22:51:47.440 回答
1

您可以用lua编写它- 为 Lua 库提供 C API 相对简单。C++ 也是一种选择,当然您必须编写 C 包装器并确保没有异常可以逃脱您的函数。但老实说,如果它对安全性至关重要,那么 C 语言的轻微不便应该没什么大不了的。您真正应该做的是在可行的情况下证明程序的正确性,并在不可行的情况下进行广泛的测试。

于 2013-05-07T20:38:00.780 回答
0

您可以用 Java 编写库。JNI 通常用于从 Java 调用 C,但也可以反过来使用。

于 2013-05-07T20:38:17.290 回答
0

这个问题终于有了一个不错的答案:Rust

于 2018-01-27T05:56:08.433 回答