用C++实现了一部分CRT,不想写了,开源给大家参考参考~~~

redleaves 2010-06-04 10:52:06
如题... 下载地址

包里包含了VC9的可执行程序,我的开发环境,我实现的全部CRT代码,和测试代码.
实现了单线程的静态库.目前只支持可执行程序的入口.

实现的功能有:

1.CRT及C++的初始化,清理.
2.基本的内存管理(直接转发WIN32接口,我什么都没做^_^)
3.基本的文件流(只实现了一部分).
4.一部分字符串操作函数.
5.CRT的SEH支持.
6.C++异常支持.
7.对可变参数的支持.
8.CRT中long long/unsigned long long的支持函数.

基本上,CRT实现中的拌脚石都已经清除了.剩下的多半是体力活了...

其中,异常处理的实现部分是独此一份...
因为MS的CRT源代码里没有这些.网上也找不到相关实现代码.比较有参考意义.
VC的long long系列函数性能比较有问题.我在这里重新实现了这部分代码.
跑我的测试代码,性能是VC自带库的3倍.

另外,alloca要stack frame支持,但我还没搞清楚加什么修饰能强制让编译器在调用alloca时生成stack frame.
哪位大大知道,还请告知.不限编译器...(我搭的框架基本上是可以跨平台的)
...全文
967 59 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyzqqq 2011-01-03
  • 打赏
  • 举报
回复
redleaves 2010-06-14
  • 打赏
  • 举报
回复
另外,补充一下,我的异常处理也有BUG....
改正代码如下:
static void _local_unwind2( VC_EXCEPTION_REGISTRATION* _Frame,  int argTryLevel ) {
int nTryLevel , nPrevTryLevel;
__try {
while( _Frame->trylevel != 0xFFFFFFFF ) {
nTryLevel = _Frame->trylevel;

if ( argTryLevel!=0xFFFFFFF && nTryLevel <= argTryLevel ) {
return;
}

_Frame->trylevel = nPrevTryLevel = _Frame->scopetable[nTryLevel].previousTryLevel;

if ( _Frame->scopetable[nTryLevel].lpfnFilter ) {
continue;
}

int tmp = (int)&_Frame->_ebp;
FARPROC handler = _Frame->scopetable[nTryLevel].lpfnHandler;
__asm {
mov eax, handler
push ebp
mov ebp, tmp
call eax
pop ebp
}
}

} __except(NestedExceptionHandler()) {}
}
redleaves 2010-06-14
  • 打赏
  • 举报
回复
我刚才看了下楼上给的那个代码.
他是hack的C库的异常处理.然后把所有的异常用他自己的方式来搞的.实现了SEH的异常处理.
C++异常只是把入口转向自己的处理函数,然后按SEH那样搞了一下.
不过C++异常处理的不对.如果异常的对象有一些继承关系.它的代码就不正确了...

我写的异常实现是按MS的CRT的方式来搞的.和那个代码路子不太一样...
sevencat 2010-06-14
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/exception/excv2.aspx
不知道这个算不算处理异常的代码...
redleaves 2010-06-14
  • 打赏
  • 举报
回复
应该不完全是重复工作吧?
至少.最起码VC处理C/C++异常以及SEH的代码.在网上肯定是没有的.
其实,就学习而言,重复前人的工作.是完全必要的.

不过我的主要目的是为了做个给自己用的C库...要不我在不同平台的代码要做无数的walkaround...
而且我还考虑让这个库的大多数基本功能做到完全的平台无关.这样,这个库就可以直接放到OS的内核里用了.这样,我在研究内核的时候,就有现成的C库用了^_^
linglongyouzhi 2010-06-14
  • 打赏
  • 举报
回复
为什么要重复工作呢
贪食蛇男 2010-06-14
  • 打赏
  • 举报
回复
牛B,受俺一拜,去看看。
sevencat 2010-06-14
  • 打赏
  • 举报
回复
http://www.uclibc.org/
sevencat 2010-06-14
  • 打赏
  • 举报
回复
支持楼主重发明轮子!!
http://www.codeproject.com/KB/library/tlibc.aspx
redleaves 2010-06-14
  • 打赏
  • 举报
回复
不是这个.你可以测试一下. 比如:
void a() {
...
void *p = alloca(10)
...
}
编译器会为a这个函数自动产生stack frame.
如果不调用alloca,那这个stack frame就有可能被优化掉.
也就是说,alloca这个函数在定义的时候,被赋予了一种属性,这个属性会指示编译器,在调用这个函数时,为调用者强制产生stack frame.不同的编译器,写法可能不太一样.但我没找到相关的资料.
「已注销」 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 redleaves 的回复:]

引用 45 楼 loaden 的回复:

引用 33 楼 redleaves 的回复:

为啥没人回答我最后的疑问?

啥疑问?
加什么修饰能强制让编译器在调用alloca时生成stack frame.
这个
[/Quote]
你问的是编译选项吧:防止缓冲区溢出?
不明白你的。试下/GL
redleaves 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 loaden 的回复:]

引用 33 楼 redleaves 的回复:

为啥没人回答我最后的疑问?

啥疑问?
[/Quote]加什么修饰能强制让编译器在调用alloca时生成stack frame.
这个
Eleven 2010-06-14
  • 打赏
  • 举报
回复
NX。。。
liutengfeigo 2010-06-14
  • 打赏
  • 举报
回复
「已注销」 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 redleaves 的回复:]

为啥没人回答我最后的疑问?
[/Quote]
啥疑问?
帅得不敢出门 2010-06-11
  • 打赏
  • 举报
回复
哦 顶一个
wh_xiao 2010-06-11
  • 打赏
  • 举报
回复
mark
DaveLee001 2010-06-10
  • 打赏
  • 举报
回复
真厉害!佩服
  • 打赏
  • 举报
回复
只能围观。。
ddsaewq 2010-06-10
  • 打赏
  • 举报
回复
谢谢楼主啊
加载更多回复(38)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧