c - 防止外部调用 lib 文件内的函数

标签 c lib

是否有可靠的方法来防止外部代码调用从 C 代码编译的库的内部函数?

我想提供一个带有 API 头文件的静态库。该库具有不同的模块,由 .c 和 .h 文件组成。我想阻止接收者使用内部 .h 文件中声明的函数。 这可能吗?

谢谢!

最佳答案

Is there a reliable way to prevent external code from calling inner functions of a lib ?

不,不可能(阅读 Rice's theorem ;静态检测此类非平凡属性是不可判定的)。库或代码可能使用函数指针。恶意用户可以使用函数指针和指针算术来调用某些私有(private)函数(可能是在对代码进行逆向工程之后),即使它是静态

在 Linux 上,您可能会使用 visibility技巧。

或者您可以将您的库组织为单个翻译单元(有点像 sqlite 正在执行其 amalgamation )并使所有内部函数都是静态 ...

一般来说,库应该有关于其内部函数的命名约定(例如,所有函数都带有 _ 后缀)。这实际上可能会有帮助(但不能针对恶意用户)。

最重要的是,库应该详细记录(命名约定也被记录),并且认真的用户只会按照他们的方式使用记录的函数已记录为有用的。

(所以我认为您不应该关心被调用的内部函数;您确实需要记录可以调用哪些公共(public)函数,以及如何以及何时...;调用其他任何内容的用户应该期望undefined behavior,那是非常bad的东西)

I would like to deliver a static library with an APIheader file, and would like to prevent the recepients from using the structs I define and the inner functions.

我不确定(至少在 Linux 上)提供静态库是否明智。我建议提供一个共享库,请阅读 Drepper 的 How to Write Shared Libraries .

并且您无法阻止接收者(假设是恶意的、聪明的且意志坚定的人)使用内部函数和内部struct-s。您应该在文档中阻止它们,并记录好您的公共(public)函数和数据类型。

I would like to prevent the recepients from using functions declared in the inner .h files. Is this possible?

不,那是不可能的。

您似乎在寻求社会问题的技术解决方案。您需要信任您的用户(他们也需要信任您),因此您应该记录可以使用哪些功能(您甚至可以在文档中添加一些句子:直接使用任何未记录的函数会产生 undefined behavior )。你不能做更多的事情。也许(特别是如果您将库作为专有软件出售)您需要律师来撰写一份好的契约(Contract)。

您可能会考虑编写自己的 GCC plugin (或 GCC MELT 分机号)来检测此类调用。这可能会花费您数周的时间,而且不值得这么麻烦(而且仍然不完美)。

我无法猜测您的动机和用例(是驱动核 react 堆、医用药物注入(inject)器、自动驾驶车辆、导弹的某种生命攸关的软件吗?)。请解释一下,如果某些(恶意但聪明的)用户调用内部未记录的函数,对您会发生什么情况。该用户会发生什么?

关于c - 防止外部调用 lib 文件内的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46795775/

相关文章:

c - 如何编写一个评估 shell 命令的 c 程序

sql - 在sql语句中使用变量-c接口(interface)

c - 返回值作为逻辑或的组合

c++ - 在 C++ Cereal 库中使用 CEREAL_REGISTER_DYNAMIC_INIT 正确发布

c - 安装 MinGW-W64 构建 FuTTY 时使用什么设置?

c++ - 弱指针库实现C++

C 链接错误(使用 tcc)

c++ - 在 Xcode 10 中找不到 -lstdc++.6 的库

c - Tee 命令将输出保存在 txt 文件中