【问题标题】:Is there a way to prepend a certain group of functions with another function call in C?有没有办法用 C 中的另一个函数调用预先设置一组函数?
【发布时间】:2020-07-10 20:06:11
【问题描述】:

我有一组函数,我希望只有在调用进程具有特定权限时才能调用它们。我有一个可以工作的访问控制模块来进行检查,我只想在一个地方定义这组函数,而不必每次在代码中调用它时都手动进行。

所以,假设一个这样的受保护函数是fread(),我想要拨打电话:accessCheck(processId,fread),而不必在我想要拨打电话的地方专门输入这个。我可以在某个地方以某种方式定义fread(),使其始终像这样“protected”吗?

这是C顺便说一句。

【问题讨论】:

    标签: c macros access-control


    【解决方案1】:

    您可以为每个受保护的函数定义一个宏,如下所示:

    #include <stdio.h>
    
    #undef fread
    #define fread(ptr, size, n, fp) \
        (accessCheck(getpid(), (void (*)(void))fread ? (ssize_t)-1 : \
         fread((ptr), (size), (n), (fp)))
    

    这里,getpid() 是返回当前进程 ID 的函数,accessCheck 有原型:

    int accessCheck(pid_t pid, void (*fn)(void));
    

    这里,pid_t 是进程 ID 的类型。 fn(void (*)(void)) 类型的通用函数指针。 fn 不会被accessCheck 调用,只会检查指针值。 accessCheck 应该在成功时返回 0 或在失败时返回一些非零值。失败时,accessCheck 还应将errno 设置为合适的值。

    #include &lt;stdio.h&gt;#undef fread 行是因为允许 #include &lt;stdio.h&gt; 定义一个与函数 fread 行为相同的宏 fread(尽管它似乎不太可能这样做),我们想替换那个宏。在宏的替换文本中对 fread 的引用很好,因为 C 宏不是递归的。

    【讨论】:

    • 感谢您的回答!是否可以在单独的文件中声明这个宏或类似的东西,并让它以相同的方式工作。想象一下有几个受保护的函数,能够在一个地方定义它们会很棒。
    • 是的,您可以在 .c 文件包含的 .h 文件中声明宏。主要问题是在调用fread 或其他任何内容时很容易忘记包含.h 文件并绕过宏。您无法真正阻止代码绕过宏,因此如果您需要强制使用宏,则需要审核您的代码。
    猜你喜欢
    • 2021-08-15
    • 2011-11-19
    • 2021-06-05
    • 2019-08-20
    • 2019-09-23
    • 2021-06-29
    • 2019-01-04
    • 2021-01-08
    • 2020-06-05
    相关资源
    最近更新 更多