C语言——如何在不使用#include <stdio.h>的情况下输出到屏幕?

7
有没有一种方法可以使一个C源文件在不包含的情况下打印到屏幕上?
我的情况是这样的:我被要求以编程方式处理1000个C源文件,每个文件都将实现几个数值函数(这些函数应该在内存中处理数据,而不需要I/O)。这些源文件的起源不清楚,因此,当我编译并运行这些源文件时,我希望确保不会对我的计算机造成任何伤害。
有没有一种方法可以找出一个C源文件是否具有潜在的危害性?我想让开发人员避免任何#include语句,但我确实需要使用printf - 因为我希望他们在main()中包含他们的计算结果的输出。
有什么想法吗?

1
你能再详细解释一下吗? - hari
我会使用虚拟机来运行测试 - 甚至可以启动一些在衣柜里积满灰尘的旧设备,当工作完成后可以将其擦除并重新安装(或只需擦除并放回衣柜)。 - Michael Burr
我会做的另一件事是在一个几乎没有文件系统或网络权限的用户帐户下运行程序。不过,我仍然会在虚拟机或牺牲盒中进行操作。 - Michael Burr
可能是 Harmful C Source File Check? 的重复问题。 - Joe
由于编辑更改了问题的目的,标题应该被更改,已接受的答案应该被删除,因为它只在反驳旧前提方面具有有限的相关性,并选择VM或备选用户答案之一。 - Chris Stratton
显示剩余2条评论
6个回答

5

可以在你的源文件顶部添加 printf 的原型,只要你链接到 CRT 库,你就可以在不包括 stdio.h 的情况下使用该函数。

printf 原型

int printf ( const char * format, ... );

3

虽然它们可能比 SO 的格式范围稍大,但它们与 IT 技术有关。本质上,您可以在 C 中利用汇编调用。博客KSplice讨论了这个主题(附有代码和示例)此处


3

有没有办法找出一个 C 源文件是否可能是有害的?

没有,没有任何方法可以找出一个恶意的源文件,因为它可以通过定义自己的原型或使用内联汇编来执行任何操作。 #include 只是一种编译时的便利。


duskwuff,我可以检查源c文件中是否存在asm -- 如果存在,就意味着使用了内联汇编;我错过了什么吗? - user3262424
1
在 C 语言中,有很多其他间接的方式可以做一些颠覆性的事情。比如将汇编代码放入字节缓冲区中,将其强制转换为函数指针并调用它;使用 dlsym() 函数;故意引发缓冲区溢出;或者将所有这些东西隐藏在预处理器技巧背后……总之,无法验证某些源代码是否隐藏了一些不可告人的秘密。 - user149341
duskwuff,谢谢。你能给我一些关键词,帮助我保持95%的安全性吗?例如asmdlsym#等,当它们不跟随include等时。我只是想做一些事情来提高安全性,即使不是100%。 - user3262424
1
你正在尝试进行的是所谓的"静态分析",而且基本上没有在代码中加入主要限制是不可能的(例如,不能使用指针/数组)。 - user149341
duskwuff,谢谢。我可以接受一些限制。问题是,我该如何做到这一点/从哪里开始?我在这里提出了另一个问题:https://dev59.com/3FnUa4cB1Zd3GeqPbY_o - user3262424

2
我想澄清一下为什么我们需要printf和studio.h,以便更好地理解这个概念。 C语言是一种可移植的语言。您可以将C编译为Linux、Mac OSX、Windows等不同的平台。在每个平台上,输出通常都会归结为系统调用,或者在嵌入式系统中直接处理帧缓冲区或Uart设备。

当然,这是可能的,但您是否想要这样做取决于原因。如果您正在针对特定平台进行编码并且没有printf(),那么您可能必须研究如何直接调用该平台的系统调用/编写一些特定于平台的汇编代码。这完全取决于您的用例。


0

当然,将必要的函数原型放入您的程序中。

如果您的意思是不使用printf,则有几个选项 - 您可以使用fwrite,或者您可以放弃流并使用write,或者您可以直接调用操作系统I / O服务,或者也许您可以直接与显示硬件交互,或者其他许多事情。

如果您想要更好的答案,请解释为什么您不想包含stdio.h。


-5

这很傻但还是:

#include <string.h>

int main() {
    puts ("hi");
return 0;
}

和输出:

$ gcc -o try try.c 
$ ./try 
hi

4
puts() 实际上是在 <stdio.h> 中定义的,而不是 <string.h> - user149341
谢谢你让我知道。不过,当OP描述问题后,我的回答就没有意义了:D - hari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接