小编Mic*_*sky的帖子

C++:在编译之前可以将函数指针追溯到原始函数而不查看函数名吗?

我想建立一个服务器,学生可以上传和运行课程代码.但是,我不希望它们访问各种功能,例如system(),这可能会导致对我的服务器的错误访问.我可以在预处理器输出中搜索显式函数调用,但是如果用户创建一个这样的函数指针:

int (*syst)(const char*) = system;
syst("rm *");
Run Code Online (Sandbox Code Playgroud)

我仍然对这种威胁持开放态度.但是,我不能只搜索字符串"system",例如,因为它是一个有效的名称 - 如果学生不包含cstdlib,他们可以使用该名称作为变量名.由于这是一个开始的编程课程,拥有十英里长的变量名称黑名单是一个坏主意.

有没有办法定义除名称以外的功能,并允许我在编译代码之前搜索其他名称?

c++

9
推荐指数
1
解决办法
163
查看次数

什么时候使用gcc标志-nostartfiles?

我似乎无法弄清楚国旗的目的-nostartfiles.它可以防止main()被立即调用,通常你也可以指定程序入口点.但是,为什么我要这样做呢?我编写了一个需要它的内核,因为一切都由我来开始,但除此之外,是否有非操作系统的理由来指定不同的程序入口点?

gcc

9
推荐指数
1
解决办法
3832
查看次数

使用gcc的Intel十六进制格式和位置无关代码

我不确定这是否特定于我正在使用的处理器,因此我需要使用Cortex M0 +.我想知道:如果我使用-fPIC通过gcc生成一个hex文件,我会生成... Position Independent Code.但是,我从objcopy中获取的intel hex文件格式总是在每一行的标题上都有地址信息.如果我正在尝试编写引导加载程序,我是否只是忽略该信息,跳过与其相关的字节,并将实际代码加载到内存中的任何位置,或者我是否必须以某种方式跟踪它?

arm bootloader

8
推荐指数
1
解决办法
369
查看次数

如何在C函数调用期间保留寄存器和其他信息?

让我们说我有三个功能,f1(),f2(),和f3().当f1调用它时,它将信息存储在CPU寄存器中(我想还有其他重要信息).现在,根据编译时未知的条件,f1将调用f2f3. f2f3使用非常不同的寄存器,其中一些可能与使用的寄存器重叠f1.以下推理是否正确?

编译器知道特定功能在执行期间需要哪些寄存器.因此,当f1调用f2或者f3,函数调用代码保留那些在堆栈上使用f2f3使用的寄存器,无论它们是否被使用f1.

或者是否有一些其他机制来编译器保留寄存器,以便返回的函数不会丢失其数据?

c cpu-registers

4
推荐指数
3
解决办法
479
查看次数

当string最初位于std :: vector中时,c_str()产生不同的输出

我试图标记一个字符串,我有一些奇怪的行为.这是代码:

ifstream fin("myFile.txt");
char* in[256];
fin.getline(in,256);
string s = in;
vector<string> f;
f.push_back(s);
char* pch1,pch2;
pch1 = strtok((char*)s.c_str()," ");
pch1 = strtok(NULL," ");
pch2 = strtok((char*)f[0].c_str()," ");
pch2 = strtok(NULL," ");
Run Code Online (Sandbox Code Playgroud)

如果文件包含"This is a string"行,则存储在pch1位置的值将为"is",但pch2将指向null.这是为什么?

我打印出两个字符串s和f [0]的字节.s包含我期望的所有字符,包括空格.但是,f [0]包含0个字符而不是空格.我知道有时istream可以将空格视为空字符,但不应该s和f [0]包含完全相同的字节?

c++

-2
推荐指数
1
解决办法
161
查看次数

标签 统计

c++ ×2

arm ×1

bootloader ×1

c ×1

cpu-registers ×1

gcc ×1